Задача состоит в том, чтобы найти наименьшее целое число foo
, для которого:
foo % 1..20 == 0
Моя текущая попытка - грубая сила
until foo % 1.upto(20) == 0 do
foo++
end
Это выводит ошибку unexpected keyword end
. Но если я не добавлю ключевое слово end
в irb, код никогда не запустится, потому что блок не закрыт.
Я сделал пустой тестовый пример, чтобы увидеть, в чем заключается моя ошибка.
until foo % 1.upto(20) == 0 do
end
Это выдает новую ошибку: enumerator can't be coerced to a fixnum
. Я предполагаю, что это означает, что вы не можете напрямую выполнять модуль для диапазона и ожидать аккуратного логического результата для всего диапазона. Но я не знаю, куда идти отсюда.
Мои первые попытки отказались от грубой силы в пользу попытки чего-то более эффективного/элегантного/точного и были следующими:
foo = 1
1.upto(20) {|bar| foo *= bar unless foo % i == 0}
дал неправильный ответ. Я не понимаю, почему, но мне также интересно, почему
foo = 1
20.downto(1) {|bar| foo *= bar unless foo % i == 0}
выдает другой ответ.
EDIT: я бы использовал циклы for (я промочил ноги программированием на ActionScript), но они не работают так, как я ожидаю, в ruby.
++
будет включать скрытое присваивание. - person Andrew Marshall   schedule 18.05.2012foo++
на каждом языке, который использую -- и тут Ruby меня кусает. - person sarnold   schedule 18.05.2012for
в Ruby не существует, как в этих языках, я не слишком скучаю по++
. - person Andrew Marshall   schedule 18.05.2012