From ecb7df09a8d25245bd032693aafcb126bc602a94 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Mon, 21 Dec 2020 22:43:07 -0800 Subject: [PATCH] Day 22: Cleanup --- src/22.rkt | 77 ++++++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/src/22.rkt b/src/22.rkt index 112c01a..aa9b3e8 100644 --- a/src/22.rkt +++ b/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))))