Как мне перебрать набор чисел, выполнить некоторое сложение и добавить к массиву?

#ruby #arrays #loops #while-loop #append

#ruby #массивы #циклы #while-цикл #добавить

Вопрос:

Моя цель здесь — создать массив с суммарными суммами каждой комбинации из 2 чисел на наборе кубиков. Я создаю начало цикла, который добавляет die1[0] к die2[0..5] перед прохождением die1[1] die2[0..5] и так далее.

У меня есть этот код ниже, и я делаю что-то не так. Я хочу иметь возможность вызывать определенные числа в массиве, например dieSums[4] , и получать одно число. Есть какие-нибудь идеи, что я здесь делаю неправильно?

 die1 = [1,2,3,4,5,6] 
die2 = [1,2,3,4,5,6]

dieSums = []

count = 0
while count <= 5 do   
  dieSums << die1[0]   die2[count]   
  count  = 1   
  puts dieSums[5]    
end
 

Ответ №1:

while Цикл, как вы его написали, не очень Рубиновый. (Rubinic?) Более идиоматичный способ перебора элементов массива:

 #!/usr/bin/ruby

die1 = [1,2,3,4,5,6]
die2 = [1,2,3,4,5,6]

dieSums = []

die1.each do |d1|
    die2.each do |d2|
        dieSums << d1   d2
    end
end
puts dieSums[5]
 

Конечно, die1 и die2 в данном случае идентичны, так что вы могли бы заменить die2 на die1 , и все бы получилось.

Комментарии:

1. Я новичок. Я еще не дошел до этого, но спасибо за понимание того, как написать чистый ruby!

2. Отступ с 4 пробелами (или табуляцией?) тоже не очень похож на ruby 😉

3. @d11wtq, хе-хе, это правильно, но я не выношу отступы в два пробела: разница во вложенности слишком тонкая. Я придерживаюсь двух пробелов, когда работаю над проектами, в которых уже есть два пробела, но я все время ворчу.

Ответ №2:

Вы вызываете puts dieSums[5] внутри цикла. dieSums[5] не будет существовать до последней итерации. Это сработает, если вы вызовете его вне цикла:

 die1 = [1,2,3,4,5,6] 
die2 = [1,2,3,4,5,6]

dieSums = []

count = 0
while count <= 5 do   
  dieSums << die1[0]   die2[count]   
  count  = 1
end

puts dieSums[5] #=> 7
 

Ответ №3:

В качестве дополнительного примечания: обратите внимание, что вы чрезмерно усложняете проблему (поскольку вы мыслите в императивных терминах, взгляните на функциональное программирование). Сумма всех возможных значений для двух кубиков:

 >> die = [1,2,3,4,5,6]
>> die.product(die).map { |v1, v2| v1   v2 }
=> [2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12]
 
  • Вызовите uniq в конце, если вы не хотите повторять значения.
  • Используйте repeated_combination(2) вместо product , если вас не волнует порядок.
  • Обратите внимание , что die.product(die) = die.repeated_permutation(2) )

Найти все суммы для N кубиков почти так же просто:

 >> die.repeated_permutation(5).map { |values| values.inject(: ) }
 

Комментарии:

1. Я продолжал искать механизм для понимания списков в Ruby, но думал, что большинство механизмов выглядят довольно грубо. Это почти оптимально, учитывая, что Ruby не поддерживает более простое понимание списков.