Я медленно просматривал список задач Project Euler и пришел к одной, которую знаю, как решить, но, похоже, не могу (учитывая, как было написано мое решение).
Для этого я использую Common Lisp, и мой скрипт работает уже более 24 часов (намного больше их цели в одну минуту).
Для краткости вот мое решение (это спойлер, но только если у вас чертовски быстрый процессор):
(defun square? (num)
(if (integerp (sqrt num)) T))
(defun factors (num)
(let ((l '()))
(do ((current 1 (1+ current)))
((> current (/ num current)))
(if (= 0 (mod num current))
(if (= current (/ num current))
(setf l (append l (list current)))
(setf l (append l (list current (/ num current)))))))
(sort l #'< )))
(defun o_2 (n)
(reduce #'+ (mapcar (lambda (x) (* x x)) (factors n))))
(defun sum-divisor-squares (limit)
(loop for i from 1 to limit when (square? (o_2 i)) summing i))
(defun euler-211 ()
(sum-divisor-squares 64000000))
Время, необходимое для решения проблемы с использованием меньших, более удобных тестовых аргументов, кажется, растет больше, чем экспоненциально... что является реальной проблемой.
Потребовалось:
- 0,007 секунды, чтобы решить на 100
- 0,107 секунды, чтобы решить 1000
- 2,020 секунды, чтобы решить 10000
- 56,61 секунды, чтобы решить 100000
- 1835,385 секунд, чтобы решить 1000000
- 24+ часа на решение 64000000
Я действительно пытаюсь выяснить, какая часть (части) сценария заставляет его работать так долго. Я подумал о том, чтобы запомнить функцию факторов, но не знаю, как это реализовать.
Для тех, кто хочет взглянуть на саму проблему, вот она .
Будем очень признательны за любые идеи о том, как ускорить эту работу.
** извините, если это спойлер для кого-то, это не должно быть .... но если у вас есть вычислительная мощность, чтобы запустить это за приличное время, больше мощности для вас.