1
0
Fork 0

Day 22: Cleanup

This commit is contained in:
Jonathan Chan 2020-12-21 22:43:07 -08:00 committed by Jonathan Chan
parent 515621bbd5
commit ab0a576334
1 changed files with 34 additions and 43 deletions

View File

@ -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))))