From 94b33b1a7201dcc74388118153c873195b5ea17c Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Fri, 23 Dec 2022 12:55:57 -0800 Subject: [PATCH] Day 23: Keep track of whether elves have moved instead of doing set comparisons --- README.md | 2 +- src/23.rkt | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7dd7d4c..b046b9b 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,4 @@ Approximate execution times of the hardest problems, compiled with `raco exe`. | 15 | 3.81 | | 16 | 20.6 | | 19 | 75.7 | -| 23 | 15.8 | +| 23 | 14.0 | diff --git a/src/23.rkt b/src/23.rkt index c2b7d23..316be9c 100644 --- a/src/23.rkt +++ b/src/23.rkt @@ -67,14 +67,17 @@ (hash-update ps (apply (propose elves r) elf) #{cons elf %} '()))) (define (round elves r) - (for/fold ([elves* (set)]) + (for/fold ([elves* (set)] + [moved? #f]) ([(p es) (proposals elves r)]) (match es - [`(,e1 ,e2) (set-add (set-add elves* e1) e2)] - [`(,e) (set-add elves* p)]))) + [`(,e1 ,e2) (values (set-add (set-add elves* e1) e2) moved?)] + [`(,e) #:when (not (equal? p e)) (values (set-add elves* p) #t)] + [`(,e) (values (set-add elves* p) moved?)]))) (define part1 (for/fold ([elves elves] + [_ #f] #:result (grounds elves)) ([r (in-range 10)]) (round elves r))) @@ -82,7 +85,7 @@ (define part2 (let loop ([elves elves] [r 1]) - (define elves* (round elves r)) - (if (set=? elves elves*) (add1 r) (loop elves* (add1 r))))) + (define-values (elves* moved?) (round elves r)) + (if moved? (loop elves* (add1 r)) (add1 r)))) (show-solution part1 part2) \ No newline at end of file