aboutsummaryrefslogtreecommitdiff
path: root/2022/puzzle-2.lisp
blob: a17fdb202b323f7224e60e5dfa1f04c2652cf18f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(defvar input (uiop:read-file-string "2-input"))
;; Each newline represents a new round, which we should parse on the go

(defun sensible-convert-input (str)
  (cond
    ((or (string= str "X") (string= str "A")) 0)
    ((or (string= str "Y") (string= str "B")) 1)
    ((or (string= str "Z") (string= str "C")) 2)))

;; Round 1
(defvar rounds
  (with-input-from-string (stream input)
    (loop
      for strategy = (read-line stream nil)
      until (null strategy)
      collect
      (let ((opponent (subseq strategy 0 1))
            (yours (subseq strategy 2 3)))
        (list (sensible-convert-input opponent) (sensible-convert-input yours))))))

(loop
  for round in rounds
  until (null round)
  sum
  (destructuring-bind (opp you) round
    (+
     1 you ;; base score
     (cond  ; outcome score
       ((eq you opp) 3)
       ((eq (mod (+ 1 opp) 3) you) 6)
       (t 0)))))

;; Round 2.

;; We can still use the same rounds data as previously, just
;; reinterpret it in when doing the sum.

(defun get-correct-choice (opponent outcome)
  (case outcome
    (0 (mod (- opponent 1) 3))
    (1 opp)
    (2 (mod (+ 1 opponent) 3))
    (t 0)))

(loop for round in rounds
      sum
      (destructuring-bind (opp you) round
        (let ((choice (get-correct-choice opp you)))
          (+ 1 choice
             (case you ;; outcome -> score
               (0 0)
               (1 3)
               (2 6)
               (t 0))))))