about summary refs log tree commit diff
path: root/day02.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'day02.rkt')
-rw-r--r--day02.rkt43
1 files changed, 43 insertions, 0 deletions
diff --git a/day02.rkt b/day02.rkt
new file mode 100644
index 0000000..d8fd4c0
--- /dev/null
+++ b/day02.rkt
@@ -0,0 +1,43 @@
+#lang racket
+
+(define/match (translate move)
+  [((or "A" "X")) 'rock]
+  [((or "B" "Y")) 'paper]
+  [((or "C" "Z")) 'scissors])
+
+(define/match (win-score p1 p2) ; for p2
+  [(draw draw) 3]          
+  [('rock 'paper) 6]
+  [('paper 'rock) 0]
+  [('rock 'scissors) 0]
+  [('scissors 'rock) 6]
+  [('rock 'paper) 0]
+  [('paper 'scissors) 6]
+  [('scissors 'paper) 0])
+
+(define/match (shape-score p)
+  [('rock) 1]
+  [('paper) 2]
+  [('scissors) 3])
+
+(define (score p1 p2)
+  (+ (shape-score p2) (win-score p1 p2)))
+
+(for/sum ([line (file->lines "day02")])
+  (apply score (map translate (string-split line))))
+;; 10595
+
+(define/match (correct-move p1 p2)
+  [(p1        "Y") (list p1 p1)]        ; draw
+  [('rock     "X") (list p1 'scissors)] ; lose
+  [('paper    "X") (list p1 'rock)]     ; lose
+  [('scissors "X") (list p1 'paper)]    ; lose
+  [('rock     "Z") (list p1 'paper)]    ; win
+  [('paper    "Z") (list p1 'scissors)] ; win
+  [('scissors "Z") (list p1 'rock)]     ; win
+  )
+
+(for/sum ([line (file->lines "day02")])
+  (match-let ([(list p1 p2) (string-split line)])
+    (apply score (correct-move (translate p1) p2))))
+;; 9541