Day 21. I'll refactor later lmao
This commit is contained in:
parent
f55ee61584
commit
c3fe6ab959
|
@ -0,0 +1,71 @@
|
|||
#lang curly-fn racket
|
||||
|
||||
(require "../lib.rkt")
|
||||
|
||||
(define-values (p1 p2) (values 1 6))
|
||||
|
||||
(define (% n m)
|
||||
(if (zero? (modulo n m)) m (modulo n m)))
|
||||
|
||||
(define (inc roll)
|
||||
(+ (% (+ roll 0) 100)
|
||||
(% (+ roll 1) 100)
|
||||
(% (+ roll 2) 100)))
|
||||
|
||||
(define part1
|
||||
(let loop ([roll 1]
|
||||
[rolls 0]
|
||||
[next (cons p1 0)]
|
||||
[prev (cons p2 0)])
|
||||
(define pos*
|
||||
(% (+ (car next) (inc roll)) 10))
|
||||
(define score*
|
||||
(+ (cdr next) pos*))
|
||||
(if (>= score* 1000)
|
||||
(* (cdr prev) (+ rolls 3))
|
||||
(loop (% (+ roll 3) 100) (+ rolls 3)
|
||||
prev (cons pos* score*)))))
|
||||
|
||||
(define rolls
|
||||
(hash 3 1
|
||||
4 3
|
||||
5 6
|
||||
6 7
|
||||
7 6
|
||||
8 3
|
||||
9 1))
|
||||
|
||||
(define part2
|
||||
(let loop ([univs (hash (list p1 0 p2 0) 1)]
|
||||
[wins1 0]
|
||||
[wins2 0])
|
||||
(cond
|
||||
[(hash-empty? univs) (max wins1 wins2)]
|
||||
[else
|
||||
(define-values (univs* wins1*)
|
||||
(for*/fold ([univs (hash)]
|
||||
[wins wins1])
|
||||
([(pp u) univs]
|
||||
[(r m) rolls])
|
||||
(match-define (list p1 s1 p2 s2) pp)
|
||||
(define p1* (% (+ p1 r) 10))
|
||||
(define s1* (+ s1 p1*))
|
||||
(define u* (* u m))
|
||||
(if (>= s1* 21)
|
||||
(values univs (+ wins u*))
|
||||
(values (hash-update univs (list p1* s1* p2 s2) #{+ % u*} 0) wins))))
|
||||
(define-values (univs** wins2*)
|
||||
(for*/fold ([univs (hash)]
|
||||
[wins wins2])
|
||||
([(pp u) univs*]
|
||||
[(r m) rolls])
|
||||
(match-define (list p1 s1 p2 s2) pp)
|
||||
(define p2* (% (+ p2 r) 10))
|
||||
(define s2* (+ s2 p2*))
|
||||
(define u* (* u m))
|
||||
(if (>= s2* 21)
|
||||
(values univs (+ wins u*))
|
||||
(values (hash-update univs (list p1 s1 p2* s2*) #{+ % u*} 0) wins))))
|
||||
(loop univs** wins1* wins2*)])))
|
||||
|
||||
(show-solution part1 part2)
|
Loading…
Reference in New Issue