More porting from old years
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))))))))
+
+