src/2017/days/day-06.lisp @ e41337e3b59b
Accessors
| author | Steve Losh <steve@stevelosh.com> |
|---|---|
| date | Wed, 15 Dec 2021 23:10:57 -0500 |
| parents | 182bdd87fd9e |
| children | (none) |
(advent:defpackage* :advent/2017/06) (in-package :advent/2017/06) (define-problem (2017 6) (data read-all) (6681 2392) (let ((banks (coerce data '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 cycle) (counting t :into cycle) (redistribute) (for last-seen = (gethash banks seen)) (until last-seen) (finally (return (values cycle (- cycle last-seen))))))))