RosettaCodeData/Task/Self-referential-sequence/Common-Lisp/self-referential-sequence-1...

30 lines
870 B
Common Lisp

(defun count-and-say (str)
(let* ((s (sort (map 'list #'identity str) #'char>))
(out (list (first s) 0)))
(loop for x in s do
(if (char= x (first out))
(incf (second out))
(setf out (nconc (list x 1) out))))
(format nil "~{~a~^~}" (nreverse out))))
(defun ref-seq-len (n &optional doprint)
(let ((s (format nil "~d" n)) hist)
(loop (push s hist)
(if doprint (format t "~a~%" s))
(setf s (count-and-say s))
(loop for item in hist
for i from 0 to 2 do
(if (string= s item) (return-from ref-seq-len (length hist)))))))
(defun find-longest (top)
(let (nums (len 0))
(dotimes (x top)
(let ((l (ref-seq-len x)))
(if (> l len) (setf len l nums nil))
(if (= l len) (push x nums))))
(list nums len)))
(let ((r (find-longest 1000000)))
(format t "Longest: ~a~%" r)
(ref-seq-len (first (first r)) t))