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

187
Views
Cada bucle salta un elemento al eliminar un elemento dentro de cada bucle

Estaba jugando tratando de obtener todos los combos 2, 3 y 4 en una matriz de tamaño 4 (por ejemplo, 1 y 2, 1 y 3, 1 y 4, 2 y 3, etc.) y me encontré con este extraño problema que no puedo resolver. ¿Por qué primary_num devuelve 4 en el tercer ciclo pero el valor del índice 0 es 3, no debería devolver 3?

El código es un código parcial, pero obviamente no puedo completarlo hasta que descubra esta parte. Mi siguiente plan era probar una función recursiva, pero tenía curiosidad por saber por qué sucede esto cuando funciona bien en los bucles 1 y 2. Sé que existe un método de permutaciones, pero solo estoy experimentando.

 lucky15 = [1,2,3,4] doubles = [] triples = [] fourfold = [] lucky15.each_with_index do |primary_num, index| lucky15.delete(index) p lucky15[0] p primary_num p lucky15 end

La salida para las opciones de venta fue:

 1 #p lucky15[0] 1 #p primary_num [1, 2, 3, 4] 2 #p lucky15[0] 2 #p primary_num [2, 3, 4] 3 #p lucky15[0] 4 #p primary_num <--- why 4 not 3???? [3, 4]

Para explicar lo que estaba tratando de hacer como mi primera revisión:

 lucky15 = [1,2,3,4] doubles = [] triples = [] fourfold = [] lucky15.each_with_index do |primary_num, index| lucky15.delete(index) each.lucky15 do |num| doubles << "#{primary_num} && #{num}" end end puts doubles
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

tratando de sacar todos los combos 2, 3 y 4

Para calcular combinaciones manualmente, normalmente usa bucles anidados. Para "dobles", podrías usar:

 lucky15 = [1, 2, 3, 4] doubles = [] (0...lucky15.size-1).each do |i| (i+1...lucky15.size).each do |j| doubles << lucky15.values_at(i, j) end end doubles #=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

El ciclo externo incrementa un índice i de 0 a 2 (porque 2 es el índice inicial máximo para un "combo 2"). Luego, el ciclo interno incrementa otro índice j desde el sucesor de i hasta 3 (el índice final de la matriz). De esta manera, el bucle interno "salta" los índices que ya han sido visitados por i : (por lo que no es necesario eliminar nada)

 1 2 3 4 # array values 0 1 2 3 # array indices ij # lucky15.values_at(0, 1) 1 2 3 4 0 1 2 3 ij # lucky15.values_at(0, 2) 1 2 3 4 0 1 2 3 ij # lucky15.values_at(0, 3) 1 2 3 4 0 1 2 3 ij # lucky15.values_at(1, 2) 1 2 3 4 0 1 2 3 ij # lucky15.values_at(1, 3) 1 2 3 4 0 1 2 3 ij # lucky15.values_at(2, 3)

Para obtener "triples", necesitas otro nivel:

 triples = [] (0...lucky15.size-2).each do |i| (i+1...lucky15.size-1).each do |j| (j+1...lucky15.size).each do |k| triples << lucky15.values_at(i, j, k) end end end triples #=> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

Visualizado:

 1 2 3 4 0 1 2 3 ijk 1 2 3 4 0 1 2 3 ijk 1 2 3 4 0 1 2 3 ijk 1 2 3 4 0 1 2 3 ijk

Sin embargo, Ruby ya tiene los métodos anteriores incorporados como combination , por lo que no es necesario reinventar la rueda:

 doubles = lucky15.combination(2).to_a #=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] triples = lucky15.combination(3).to_a #=> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
over 4 years ago · Santiago Trujillo Report

0

Parece que el método de delete no estaba haciendo lo que pensabas (lo mismo aquí, tuve que ejecutar una versión modificada de esto con más impresiones para verlo):

 lucky15 = [1,2,3,4] doubles = [] triples = [] fourfold = [] lucky15.each_with_index do |primary_num, index| puts "Index: #{index}" puts "0th element before delete: #{lucky15[0]}" lucky15.delete(index) puts "0th element after delete: #{lucky15[0]}" puts "primary_num: #{primary_num}" puts "lucky15: #{lucky15}" end

Producción:

 Index: 0 0th element before delete: 1 0th element after delete: 1 primary_num: 1 lucky15: [1, 2, 3, 4] Index: 1 0th element before delete: 1 0th element after delete: 2 primary_num: 2 lucky15: [2, 3, 4] Index: 2 0th element before delete: 2 0th element after delete: 3 primary_num: 4 lucky15: [3, 4]

La variable index mantiene el índice cada vez, pero delete busca el elemento en la matriz y lo elimina si está presente. Entonces, cuando usa delete de esa manera, está eliminando un elemento igual al índice de la matriz durante cada iteración, si dicho elemento existe en la matriz durante esa iteración.

Probablemente desee delete_at ( https://ruby-doc.org/core-3.0.0/Array.html#method-i-delete_at ).

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!