def adjacent_sum(arr) narr = [] arr.each.with_index do |num, index| narr << (arr[index] + arr[index+1]) end return narr end print adjacent_sum([3, 7, 2, 11]) #=> [10, 9, 13], because [ 3+7, 7+2, 2+11 ] adjacent_sum([2, 5, 1, 9, 2, 4]) #=> [7, 6, 10, 11, 6], because [2+5, 5+1, 1+9, 9+2, 2+4]Estoy tratando de modificar el narr en función de la entrada del usuario. Básicamente, tratando de obtener todos los números adyacentes para sumar y devolver una nueva matriz.
Escriba un método adyacente_sum que tome una matriz de números y devuelva una nueva matriz que contenga las sumas de los números adyacentes en la matriz original. Vea los ejemplos.
Soy nuevo en Ruby y su forma de pensar. No sé qué método de iteración usar para este problema y sé que hay muchos métodos de iteración. PODRÍA seguir la ruta anterior y simplemente hacer un ciclo while, pero quiero entender la mecánica del ciclo .each.
Aquí está el mensaje de error:
/tmp/file.rb:5:in `+': nil can't be coerced into Integer (TypeError) from /tmp/file.rb:5:in `block in adjacent_sum' from /tmp/file.rb:3:in `each' from /tmp/file.rb:3:in `with_index' from /tmp/file.rb:3:in `adjacent_sum' from /tmp/file.rb:10:in `<main>'Su ciclo está iterando sobre cada elemento de la lista. Tomemos su primer ejemplo.
[3, 7, 2, 11] Bien, estamos iterando. Primero, llegamos a 3 (estamos sumando 7, porque es el siguiente). Luego, llegamos a 7 (le estamos agregando 2). Tercero, llegamos a 2 (sumándole 11). Finalmente, llegamos a 11, ¿y qué le estamos agregando? Estamos agregando arr[4] , que no existe, de ahí su error.
each (y todas sus muchas variantes) operan fundamentalmente en la noción de que está tomando todos los elementos de la lista subyacente. En su caso, desea todos menos el último elemento, ya que debe poder agregar un elemento "siguiente" para realizar la adición. Puede omitir explícitamente el último elemento así
arr.each.with_index do |num, index| if index < arr.size - 1 narr << (arr[index] + arr[index+1]) end end pero eso no es mejor que un ciclo while directo. El objetivo de todos los métodos enumerables de Ruby es elegir la herramienta adecuada para el trabajo y, en este caso, Enumerable de Ruby tiene exactamente la herramienta.each_cons te da una ventana deslizante de colección de N elementos adyacentes. Entonces podemos escribir
def adjacent_sum(arr) arr.each_cons(2).map { |x, y| x + y } end Este es el poder del módulo Enumerable de Ruby. Una vez que tiene una construcción de alto nivel que comprende la iteración, proporciona un montón de herramientas para iterar de forma inteligente sobre estructuras de datos, y es por eso que es beneficioso en un ciclo while simple.
def adjacent_sum(arr) narr = [] l = arr.length arr.each.with_index do |num,index| if index < arr.size-1 narr << arr[index] + arr[index+1] end end return narr end print adjacent_sum([3, 7, 2, 11]) #=> [10, 9, 13], because [ 3+7, 7+2, 2+11 ] puts print adjacent_sum([2, 5, 1, 9, 2, 4]) #=> [7, 6, 10, 11, 6], because [2+5, 5+1, 1+9, 9+2, 2+4] putsAgregué el condicional if para asegurarme de que la matriz no se evalúe fuera del índice de la matriz y el código funcionó: si el índice < arr.size-1