aquí tengo dos matrices desiguales (el tamaño de la matriz no es igual), tengo que agregar insertar cuando los números arr1 coinciden en arr2. pero cuando la condición se vuelve falsa, el cero solo debe agregarse una vez en lugar de repetirse. a continuación se muestra el código
arr2 =[ [[27, 28, 29, 30, 31, 1, 2], 5], [[31, 1, 2, 3, 4, 5, 6], 14], [[26, 27, 28, 29, 30, 31, 1], 22], [[28, 29, 30, 31, 1, 2, 3], 31], [[25, 26, 27, 28, 29, 30, 31], 35], [[27, 28, 29, 30, 31, 1, 2], 44], [[29, 30, 31, 0, 0, 0, 0], 53] ] arr1 = [5, 0, 14, 0, 22, 0, 31, 35, 0, 44, 0, 53] cc = [] arr1.each do|item_arr1| arr2.each_with_index do|item_arr2,index| if item_arr1 == arr2[index][-1] cc << item_arr2 else cc << 0 end end endproducción:
[ [ [27, 28, 29, 30, 31, 1, 2], 5 ], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ [31, 1, 2, 3, 4, 5, 6], 14 ], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ [26, 27, 28, 29, 30, 31, 1], 22 ], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ [28, 29, 30, 31, 1, 2, 3], 31 ], 0, 0, 0, 0, 0, 0, 0, [ [25, 26, 27, 28, 29, 30, 31], 35 ], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ [27, 28, 29, 30, 31, 1, 2], 44 ], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ [29, 30, 31, 0, 0, 0, 0], 53 ] ]Rendimiento esperado:
[ [ [27, 28, 29, 30, 31, 1, 2], 5 ], 0, [ [31, 1, 2, 3, 4, 5, 6], 14 ], 0, [ [26, 27, 28, 29, 30, 31, 1], 22 ], 0, [ [28, 29, 30, 31, 1, 2, 3], 31 ], [ [25, 26, 27, 28, 29, 30, 31], 35 ], 0, [ [27, 28, 29, 30, 31, 1, 2], 44 ], 0, [ [29, 30, 31, 0, 0, 0, 0], 53 ] ]Suponiendo que los números son únicos, podría usar rassoc para obtener el subarreglo de arr1 :
arr1.map { |i| arr2.rassoc(i) || i } #=> [ # [[27, 28, 29, 30, 31, 1, 2], 5], 0, # [[31, 1, 2, 3, 4, 5, 6], 14], 0, # [[26, 27, 28, 29, 30, 31, 1], 22], 0, # [[28, 29, 30, 31, 1, 2, 3], 31], # [[25, 26, 27, 28, 29, 30, 31], 35], 0, # [[27, 28, 29, 30, 31, 1, 2], 44], 0, # [[29, 30, 31, 0, 0, 0, 0], 53] # ]Esto no es muy parecido a Ruby, pero debería ser relativamente eficiente porque evita la necesidad de buscar matrices.
a1 = arr1.size.times.with_object([]) do |i,a| n = arr1[i] next if n.zero? a << (i < arr1.size-1 && arr1[i+1].zero?) end #=> [true, true, true, false, true, true, false] Se debe insertar un cero después de arr2[i] si a1[i] es true .
arr2.each_with_object([]) do |a2,a| a << a2 a << 0 if a1.shift end #=> [ # [[27, 28, 29, 30, 31, 1, 2], 5], 0, # [[31, 1, 2, 3, 4, 5, 6], 14], 0, # [[26, 27, 28, 29, 30, 31, 1], 22], 0, # [[28, 29, 30, 31, 1, 2, 3], 31], # [[25, 26, 27, 28, 29, 30, 31], 35], 0, # [[27, 28, 29, 30, 31, 1, 2], 44], 0, # [[29, 30, 31, 0, 0, 0, 0], 53] # ]