about summary refs log tree commit diff
path: root/day15.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'day15.rkt')
-rw-r--r--day15.rkt50
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