7de124d6ef6f

More porting from old years
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sun, 01 Dec 2019 12:13:42 -0500
parents 5b5c61ad8d2b
children 20fe0c2b9fff
branches/tags (none)
files src/2017/day-06.lisp

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2017/day-06.lisp	Sun Dec 01 12:13:42 2019 -0500
@@ -0,0 +1,29 @@
+(defpackage :advent/2017/06 #.cl-user::*advent-use*)
+(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))))))))
+
+