У меня есть следующий метод, который я написал для Project Euler - Problem 36 . Все, что он делает, - это суммирует все числа меньше 1 000 000, которые являются палиндромами как по основанию 10, так и по основанию 2.
def problem_36
(1...1_000_000).select do |n|
n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
end
end
Теперь это работает и дает правильный результат чуть более чем за 1 секунду. Я хотел сократить время до 1 секунды, поэтому решил уменьшить количество преобразований чисел в строки. Поэтому я внес следующие изменения:
def problem_36
(1...1_000_000).select do |n|
base10 = n.to_s
base2 = n.to_s(2)
base10 == base10.reverse && base2 == base2.reverse
end
end
Проблема в том, что эта версия на самом деле работает примерно на 50% медленнее , чем исходная. Итак, вопрос в следующем: действительно ли так медленно выделяются эти две переменные? Или Ruby оптимизирует вызовы связанных методов?