Как я могу просмотреть набор чисел, сделать некоторые дополнения и добавить в массив? - PullRequest
3 голосов
/ 22 октября 2011

Моя цель здесь - создать массив с суммами сумм каждой комбинации из 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

Ответы [ 3 ]

4 голосов
/ 22 октября 2011
Цикл

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

#!/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 и все получилось бы.

3 голосов
/ 22 октября 2011

Вы звоните 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
2 голосов
/ 22 октября 2011

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

>> 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(:+) }
...