diff --git a/2020/13.rkt b/2020/13.rkt index da2b801..eff8c26 100644 --- a/2020/13.rkt +++ b/2020/13.rkt @@ -1,5 +1,5 @@ #lang br -(require racket/file rackunit) +(require racket/file rackunit racket/dict) (match-define (cons target buses-all) (for/list ([tok @@ -8,13 +8,34 @@ (string-replace (file->string "13.rktd") "," " ")))]) tok)) -(define buses (filter integer? buses-all)) - (define (overshoot bus) (for/last ([i (in-naturals)] #:final (> (* i bus) target)) (- (* i bus) target))) -(define winner (argmin overshoot buses)) +(define (solve-1) + (define winner (argmin overshoot (filter integer? buses-all))) + (* winner (overshoot winner))) + +(check-equal? (solve-1) 246) + +(define (solve-2) + (define pairs (for/list ([(b i) (in-indexed buses-all)] + #:when (integer? b)) + (cons b i))) + (for/fold ([t 0] + [increment 1] + #:result t) + ([(bus overshoot) (in-dict pairs)]) + (define mod-target (let loop ([overshoot overshoot]) + (cond + [(zero? overshoot) 0] + [(< overshoot bus) (- bus overshoot)] + [else (loop (- overshoot bus))]))) + (define multiplier + (for/first ([multiplier (in-naturals)] + #:when (= (modulo (+ t (* increment multiplier)) bus) mod-target)) + multiplier)) + (values (+ t (* increment multiplier)) (* increment bus)))) -(check-equal? (* winner (overshoot winner)) 246) \ No newline at end of file +(check-equal? (solve-2) 939490236001473) \ No newline at end of file