#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 не поддерживает более простое понимание списков.