(defstruct player () num pos (val 0)) (defun read-input (: (name "input")) (flow (file-get-lines name) (keep-matches (`Player @num starting position: @pos` @1) (new player num (toint num) pos (pred (toint pos)))))) (defun counter (start) (lambda () (pinc start))) (defun solve-one (: (name :)) (let ((count 0) (die (counter 1))) (buildn (pend (read-input name)) (whilet ((p (del))) (inc count) (upd p.pos (+ [die] [die] [die]) (mod @1 10)) (if (>= (inc p.val (succ p.pos)) 1000) (return (* count 3 (del).val))) (add p))))) (defstruct game players) (defun quantum-turn (ga) (defun solve-two (: (name :)) (let ((ga (new game players (read-input name)))) ( (die (counter 1)) (player-stream (repeat (read-input name)))) (each ((p player-stream)) (let ((npos (mod (+ p.pos [die die die] 10))) (nval ( (if (>= npos 21)) (( (buildn (pend (read-input name)) (whilet ((p (del))) (inc count) (upd p.pos (+ [die] [die] [die]) (mod @1 10)) (if (>= (inc p.val (succ p.pos)) 21) (return p)) (add p)))))