Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

145
Views
¿Por qué no puedo modificar la matriz fuera del método .each?
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>'
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

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] puts

Agregué 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

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!