diff options
author | Oscar Najera <hi@oscarnajera.com> | 2023-02-08 20:21:07 +0100 |
---|---|---|
committer | Oscar Najera <hi@oscarnajera.com> | 2023-02-08 20:21:07 +0100 |
commit | 1a0a9714f95767bdad046dbf32182967fcefb5f9 (patch) | |
tree | be3ae01c99d91cfee295e6ed893816d804fb6fde /AoC2022/02 | |
parent | 0b36acbe058a0afb63f2c35ce8cc24fca042e8f3 (diff) | |
download | scratch-1a0a9714f95767bdad046dbf32182967fcefb5f9.tar.gz scratch-1a0a9714f95767bdad046dbf32182967fcefb5f9.tar.bz2 scratch-1a0a9714f95767bdad046dbf32182967fcefb5f9.zip |
day02
Diffstat (limited to 'AoC2022/02')
-rw-r--r-- | AoC2022/02/solver.lisp | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/AoC2022/02/solver.lisp b/AoC2022/02/solver.lisp index 52f611b..df1bedc 100644 --- a/AoC2022/02/solver.lisp +++ b/AoC2022/02/solver.lisp @@ -3,6 +3,9 @@ (defconstant results '((rock . scissors) (scissors . paper) (paper . rock)) "Win-lose pairs") +(defun looses-to (play) (cdr (assoc play results))) +(defun wins-to (play) (car (rassoc play results))) + (defun translate (play) (case play ((A X) 'rock) @@ -17,35 +20,25 @@ (defun match (my other) (cond + ((eq my (wins-to other)) (values 6 'win)) ((eq my other) (values 3 'draw)) - ((eq other (cdr (assoc my results))) (values 6 'win)) (t (values 0 'loose)))) -(defun strategy (play) - (ecase play - (X 'loose) - (Y 'draw) - (Z 'win))) - -(defun pick-move (strategy other) - (ecase strategy - (loose (cdr (assoc other results))) - (draw other) - (win (car (rassoc other results))))) - -(defun fixed-plays (oponent my) - (declare (ignore oponent)) +(defun fixed-plays (my other) + (declare (ignore other)) (translate my)) -(defun reactive-plays (oponent my) - (pick-move (strategy my) oponent)) +(defun reactive-plays (my other) + (ecase my + (X (looses-to other)) + (Y other) + (Z (wins-to other)))) (defun solver (strategy) (with-open-file (in "input") - (loop :for n :from 0 - :for op = (translate (read in nil nil)) + (loop :for op = (translate (read in nil nil)) :while op - :for my = (funcall strategy op (read in nil nil)) + :for my = (funcall strategy (read in nil nil) op) :sum (+ (weight my) (match my op))))) (fiveam:test results |