Für Project Euler Problem 8, wird mir gesagt, dass ich eine 1000-stellige Zahl durchgehen soll. Das ist eine brute-force-Lisp-Lösung, die im Grunde durch jedes 5-stellige Segment geht und sie von Anfang bis Ende multipliziert und am Ende der Schleife das größte zurückgibt.
Der Code:
(defun pep8 ()
(labels ((product-of-5n (n)
(eval (append '(*)
(loop for x from n to (+ n 5)
collect (parse-integer
1000digits-str :start x :end (+ x 1)))))))
(let ((largestproduct 0))
(do ((currentdigit 0 (1+ currentdigit)))
((> currentdigit (- (length 1000digits-str) 6)) (return largestproduct))
(when (> (product-of-5n currentdigit) largestproduct)
(setf largestproduct (product-of-5n currentdigit)))))))
Es kompiliert ohne Warnungen, aber beim Ausführen erhalte ich:
keine Nicht-Whitespace-Zeichen in der Zeichenfolge "73167176531330624919225119674426574742355349194934...".
[Fehlertyp SB-INT: SIMPLE-PARSE-ERROR]
Ich habe überprüft, ob die lokale Funktion product-of-5n
funktioniert, indem ich sie nochmals als globale Funktion geschrieben habe:
(defun product-of-5n (n)
(eval (append '(*)
(loop for x from n to (+ n 5)
collect (parse-integer
1000digits-str :start x :end (+ x 1))))))
Dies kompilierte ohne Warnungen und beim Ausführen scheint es perfekt zu funktionieren. Zum Beispiel,
CL_USER> (product-of-5n 1) => 882
Was korrekt zu sein scheint, da die ersten fünf Ziffern 7, 3, 1, 6 und 7 sind.
Was 1000digits-str
betrifft, wurde es einfach mit defvar
kompiliert, und mit longlines-show-hard-newlines
von Emacs, glaube ich nicht, dass es White-Space-Zeichen in der Zeichenfolge gibt, denn das ist es, worüber SBCL sich beschwert, oder?