# HG changeset patch # User Steve Losh # Date 1512603863 18000 # Node ID 1329a18951050fb1a8fa4e51f269779c765f549e # Parent e0830b791f27c09763fce371eacaf88f791f6858 Day 6 diff -r e0830b791f27 -r 1329a1895105 src/main.lisp --- a/src/main.lisp Tue Dec 05 21:00:49 2017 -0500 +++ b/src/main.lisp Wed Dec 06 18:44:23 2017 -0500 @@ -130,3 +130,28 @@ (incf (aref maze address) (if (>= offset 3) -1 1)) (incf address offset))) + + +(defun day-6/1+2 () + (let* ((banks (coerce (read-file-of-numbers "data/2017/06") 'vector)) + (seen (make-hash-table :test 'equalp))) + (labels ((bank-to-redistribute () + (iterate (for blocks :in-vector banks :with-index bank) + (finding bank :maximizing blocks))) + (redistribute () + (iterate + (with bank = (bank-to-redistribute)) + (with blocks-to-redistribute = (aref banks bank)) + (initially (setf (aref banks bank) 0)) + (repeat blocks-to-redistribute) + (for b :modulo (length banks) :from (1+ bank)) + (incf (aref banks b)))) + (mark-seen (banks cycles) + (setf (gethash (copy-seq banks) seen) cycles))) + (iterate + (mark-seen banks cycles) + (summing 1 :into cycles) + (redistribute) + (for last-seen = (gethash banks seen)) + (until last-seen) + (finally (return (values cycles (- cycles last-seen))))))))