aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2022/02/2.rkt
blob: 608d8aa5b98dfe665410455f45341bb733bb3667 (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
#lang racket

(require "../../lib/utils.rkt")

(define lines
  (call-with-input-file "input"
    (λ (fp) (get-lines fp))))

(define games (map string-split lines))

(define (transform-cheat mine oppo)
  (cond ((string=? "X" mine) (cond ((string=? "A" oppo) "Z")
                                   ((string=? "B" oppo) "X")
                                   ((string=? "C" oppo) "Y")))
        ((string=? "Y" mine) (cond ((string=? "A" oppo) "X")
                                   ((string=? "B" oppo) "Y")
                                   ((string=? "C" oppo) "Z")))
        ((string=? "Z" mine) (cond ((string=? "A" oppo) "Y")
                                   ((string=? "B" oppo) "Z")
                                   ((string=? "C" oppo) "X")))))

(set! games
      (map
       (λ (x)
         (list (car x) (transform-cheat (cadr x) (car x))))
       games))

(define (score game)
  (define (base-score mine)
    (cond ((string=? "X" mine) 1)
          ((string=? "Y" mine) 2)
          ((string=? "Z" mine) 3)))
  (define (win-score mine oppo)
    (cond ((string=? "X" mine) (cond ((string=? "A" oppo) 3)
                                     ((string=? "B" oppo) 0)
                                     ((string=? "C" oppo) 6)))
          ((string=? "Y" mine) (cond ((string=? "A" oppo) 6)
                                     ((string=? "B" oppo) 3)
                                     ((string=? "C" oppo) 0)))
          ((string=? "Z" mine) (cond ((string=? "A" oppo) 0)
                                     ((string=? "B" oppo) 6)
                                     ((string=? "C" oppo) 3)))))
  (+ (base-score (cadr game)) (win-score (cadr game) (car game))))

(apply + (map score games))