From 5a2032e7341b777074e6395955cef28b74616711 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 19 Dec 2018 11:03:12 -0800 Subject: [PATCH] d09 p1 (fasterer) --- 2018/09.rkt | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/2018/09.rkt b/2018/09.rkt index b630af8..6499555 100644 --- a/2018/09.rkt +++ b/2018/09.rkt @@ -1,47 +1,38 @@ #lang debug br (require racket/file) -(define (mlength mprs [acc 0]) - (if (null? mprs) - acc - (mlength (mcdr mprs) (add1 acc)))) - (define (nth-mpr mprs n) (for/fold ([mprs mprs]) ([i (in-range n)]) (mcdr mprs))) (define (★) - (match-define (list player-count marble-count) + (match-define (list player-count max-marbles) (map string->number (regexp-match* #px"\\d+" (file->string "09.txt")))) (define scores (make-hasheqv)) (define circle (mcons #f (mcons 0 null))) - (let loop ([marble 1] [pos 0]) + (let loop ([marble 1] [marbles-in-circle 1] [pos 0]) (cond - [(> marble marble-count) (argmax cdr (hash->list scores))] + [(> marble max-marbles) (cdr (argmax cdr (hash->list scores)))] [(zero? (modulo marble 23)) - (define marble-count (sub1 (mlength circle))) - (define deletion-pos (modulo (+ (- pos 7) marble-count) marble-count)) + (define deletion-pos (modulo (+ (- pos 7) marbles-in-circle) marbles-in-circle)) (define last-left-mpr (nth-mpr circle deletion-pos)) (define removed-marble (mcar (mcdr last-left-mpr))) (set-mcdr! last-left-mpr (mcdr (mcdr last-left-mpr))) (define player (modulo marble player-count)) (hash-update! scores player (λ (sc) (+ removed-marble marble sc)) 0) - (loop (add1 marble) deletion-pos)] + (loop (add1 marble) (sub1 marbles-in-circle) deletion-pos)] [else - (define marble-count (sub1 (mlength circle))) - (define next-pos (add1 (modulo (add1 pos) marble-count))) + (define next-pos (add1 (modulo (add1 pos) marbles-in-circle))) (define last-left-mpr (nth-mpr circle next-pos)) (set-mcdr! last-left-mpr (mcons marble (mcdr last-left-mpr))) - (loop (add1 marble) next-pos)]))) - -(time (★)) + (loop (add1 marble) (add1 marbles-in-circle) next-pos)]))) #;(define (★★) ) #;(★★) -#;(module+ test +(module+ test (require rackunit) (check-equal? (time (★)) 437654) - (check-equal? (time (★★)) 566)) \ No newline at end of file + #;(check-equal? (time (★★)) 566)) \ No newline at end of file