Day 22: Cleanup
This commit is contained in:
parent
515621bbd5
commit
ab0a576334
77
src/22.rkt
77
src/22.rkt
|
@ -24,48 +24,39 @@
|
|||
(combat (rest player1)
|
||||
(append (rest player2) (list p2 p1)))))]))
|
||||
|
||||
(define memo (make-hash '()))
|
||||
|
||||
(define (recursive-combat player1 player2 game)
|
||||
(if (hash-has-key? memo (list player1 player2))
|
||||
(hash-ref memo (list player1 player2))
|
||||
#;(printf "~a " game)
|
||||
(let loop ([player1* player1]
|
||||
[player2* player2]
|
||||
[seen (set)])
|
||||
(cond
|
||||
[(empty? player1*)
|
||||
(hash-set! memo (list player1 player2) (list #f player2*))
|
||||
(list #f player2*)]
|
||||
[(empty? player2*)
|
||||
(hash-set! memo (list player1 player2) (list #t player1*))
|
||||
(list #t player1*)]
|
||||
[(set-member? seen (list player1* player2*))
|
||||
(hash-set! memo (list player1 player2) (list #t player1*))
|
||||
(list #t player1*)]
|
||||
[else
|
||||
(let ([p1 (first player1*)]
|
||||
[p2 (first player2*)]
|
||||
[seen (set-add seen (list player1* player2*))])
|
||||
(cond
|
||||
[(and (<= p1 (sub1 (length player1*)))
|
||||
(<= p2 (sub1 (length player2*))))
|
||||
(match-let ([(list p1-won? deck) (recursive-combat (take (rest player1*) p1) (take (rest player2*) p2) (add1 game))])
|
||||
(if p1-won?
|
||||
(loop (append (rest player1*) (list p1 p2))
|
||||
(rest player2*)
|
||||
seen)
|
||||
(loop (rest player1*)
|
||||
(append (rest player2*) (list p2 p1))
|
||||
seen)))]
|
||||
[(> p1 p2)
|
||||
(loop (append (rest player1*) (list p1 p2))
|
||||
(rest player2*)
|
||||
seen)]
|
||||
[(< p1 p2)
|
||||
(loop (rest player1*)
|
||||
(append (rest player2*) (list p2 p1))
|
||||
seen)]))]))))
|
||||
(define (recursive-combat player1 player2)
|
||||
(let loop ([player1 player1]
|
||||
[player2 player2]
|
||||
[seen (set)])
|
||||
(cond
|
||||
[(empty? player1) (list #f player2)]
|
||||
[(empty? player2) (list #t player1)]
|
||||
[(set-member? seen (list player1 player2)) (list #t player1)]
|
||||
[else
|
||||
(let ([p1 (first player1)]
|
||||
[p2 (first player2)]
|
||||
[seen (set-add seen (list player1 player2))])
|
||||
(cond
|
||||
[(and (<= p1 (sub1 (length player1)))
|
||||
(<= p2 (sub1 (length player2))))
|
||||
(match-define (list p1-won? deck)
|
||||
(recursive-combat (take (rest player1) p1)
|
||||
(take (rest player2) p2)))
|
||||
(if p1-won?
|
||||
(loop (append (rest player1) (list p1 p2))
|
||||
(rest player2)
|
||||
seen)
|
||||
(loop (rest player1)
|
||||
(append (rest player2) (list p2 p1))
|
||||
seen))]
|
||||
[(> p1 p2)
|
||||
(loop (append (rest player1) (list p1 p2))
|
||||
(rest player2)
|
||||
seen)]
|
||||
[(< p1 p2)
|
||||
(loop (rest player1)
|
||||
(append (rest player2) (list p2 p1))
|
||||
seen)]))])))
|
||||
|
||||
(define part1
|
||||
(let ([deck (combat player1 player2)])
|
||||
|
@ -74,7 +65,7 @@
|
|||
(* card score))))
|
||||
|
||||
(define part2
|
||||
(match-let ([(list _ deck) (recursive-combat player1 player2 1)])
|
||||
(match-let ([(list _ deck) (recursive-combat player1 player2)])
|
||||
(for/sum ([card deck]
|
||||
[score (reverse (range 1 (add1 (length deck))))])
|
||||
(* card score))))
|
||||
|
|
Loading…
Reference in New Issue