blob: 4b0dd020a7b09bcb3276cf7c98361a833699e158 (
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"
(lambda (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
(lambda (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))
|