diff options
author | Leah Neukirchen <leah@vuxu.org> | 2022-12-16 17:07:07 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2022-12-16 17:07:07 +0100 |
commit | c8dcd8c01985ea47007898c3d9c48c515c03879c (patch) | |
tree | 4a8c35a57a7ceba55c9473c238d2a5d6cf9566a2 /day15.rkt | |
parent | f922face91f81cf19ee76121928de5f3eea9d4e0 (diff) | |
download | adventofcode2022-c8dcd8c01985ea47007898c3d9c48c515c03879c.tar.gz adventofcode2022-c8dcd8c01985ea47007898c3d9c48c515c03879c.tar.xz adventofcode2022-c8dcd8c01985ea47007898c3d9c48c515c03879c.zip |
day15
Diffstat (limited to 'day15.rkt')
-rw-r--r-- | day15.rkt | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/day15.rkt b/day15.rkt new file mode 100644 index 0000000..c31b64a --- /dev/null +++ b/day15.rkt @@ -0,0 +1,50 @@ +#lang racket +;; ala https://github.com/narimiran/AdventOfCode2022/blob/main/clojure/day15.clj + +(define data + (for/list ([line (file->lines "day15")]) + (map string->number (regexp-match* #rx"[0-9]+" line)))) + +(define (dist x1 y1 x2 y2) + (+ (abs (- x1 x2)) + (abs (- y1 y2)))) + +(define (seen-in-row row) + (append-map (lambda (line) + (let* ([sx (first line)] + [sy (second line)] + [r (dist sx sy (third line) (fourth line))] + [d (- r (abs (- row sy)))]) + (if (positive? d) + (list (list (- sx d) (+ sx d))) + (list)))) + data)) + +(define (part1) + (let* ([seen (seen-in-row 2000000)] + [a (first (first (sort seen < #:key first)))] + [b (second (first (sort seen > #:key second)))]) + (- b a))) + +(part1) +;; 5147333 + +(define (find-a-hole seen) + (let loop ([highest 0] + [seen (sort seen < #:key first)]) + (if (null? seen) + #f + (if (<= (caar seen) (+ highest 1)) + (loop (max highest (cadar seen)) (rest seen)) + (- (caar seen) 1))))) + +(define (part2) + (let loop ([row 4000000]) + (let* ([seen (seen-in-row row)] + [hole (find-a-hole seen)]) + (if hole + (+ (* 4000000 hole) row) + (loop (- row 1)))))) + +(part2) +;; 13734006908372 |