# HG changeset patch # User Steve Losh # Date 1449958508 0 # Node ID 162d5f701f64be72e96abdcbe07d3d0e01fd62ad # Parent 02043335d57a738e82e7caa122b87def7e3328ba Day 10 diff -r 02043335d57a -r 162d5f701f64 advent.lisp --- a/advent.lisp Wed Dec 09 11:35:23 2015 +0000 +++ b/advent.lisp Sat Dec 12 22:15:08 2015 +0000 @@ -486,7 +486,6 @@ :finally (return (cons min-dist max-dist)))))) - (defmethod print-object ((object hash-table) stream) (format stream "#HASH{~%~{~{ (~s : ~s)~}~%~}}" (loop for key being the hash-keys of object @@ -494,8 +493,47 @@ collect (list key value)))) +;;;; Day 10 +(defun advent-10-data () + "1321131112") + +(defun look-and-say (seq) + (let ((runs (list)) + (len 1) + (current -1)) + (flet ((mark-run () + (setf runs (cons current (cons len runs))))) + (loop :for n :in seq + :do (if (= current n) + (incf len) + (progn + (when (not (= -1 current)) + (mark-run)) + (setf len 1) + (setf current n))) + :finally (mark-run)) + (reverse runs)))) + +(defun iterate (n f data) + (declare (optimize speed (debug 0))) + (dotimes (_ n) + (setf data (funcall f data))) + data) + +(defun las-to-list (s) + (loop :for digit :across s + :collect (-> digit string parse-integer))) + +(defun advent-10-1 (data) + (length (iterate 40 #'look-and-say (las-to-list data)))) + +(defun advent-10-2 (data) + (length (iterate 50 #'look-and-say (las-to-list data)))) + + ;;;; Scratch #+comment (advent-8-2 '("\"dogs\"")) -#+comment (advent-9 (advent-9-data)) +#+comment (advent-10-1 (advent-10-data)) +#+comment (advent-10-2 (advent-10-data))