about summary refs log tree commit diff
path: root/day18.rkt
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-12-20 18:48:19 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-12-20 18:48:19 +0100
commitdfa12a8e6cc0383f7cff37d445f310e87c4d9e95 (patch)
tree41aecfe5ae04852b81a8e78968570501234fd1a3 /day18.rkt
parentfa9c75b979cec6b23a009f31f14397230f2ea3da (diff)
downloadadventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.tar.gz
adventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.tar.xz
adventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.zip
day18
Diffstat (limited to 'day18.rkt')
-rw-r--r--day18.rkt47
1 files changed, 47 insertions, 0 deletions
diff --git a/day18.rkt b/day18.rkt
new file mode 100644
index 0000000..1594eba
--- /dev/null
+++ b/day18.rkt
@@ -0,0 +1,47 @@
+#lang racket
+
+(define points (for/set ([line (file->lines "day18")])
+                 (list->vector (map string->number (string-split line ",")))))
+
+(define (neighbors p)
+  (for/list ([o '(#(-1  0  0)
+                  #( 1  0  0)
+                  #( 0 -1  0)
+                  #( 0  1  0)
+                  #( 0  0  1)
+                  #( 0  0 -1))])
+    (vector-map + p o)))
+
+(for/sum ([p points])
+  (for/sum ([n (neighbors p)])
+    (if (not (set-member? points n))
+        1
+        0)))
+;; 3550
+
+(define (foldl1 op lst)
+  (foldl op (car lst) (cdr lst)))
+
+(let ([minx (foldl1 min (map (lambda (v) (vector-ref v 0)) (set->list points)))]
+      [maxx (foldl1 max (map (lambda (v) (vector-ref v 0)) (set->list points)))]
+      [miny (foldl1 min (map (lambda (v) (vector-ref v 1)) (set->list points)))]
+      [maxy (foldl1 max (map (lambda (v) (vector-ref v 1)) (set->list points)))]
+      [minz (foldl1 min (map (lambda (v) (vector-ref v 2)) (set->list points)))]
+      [maxz (foldl1 max (map (lambda (v) (vector-ref v 2)) (set->list points)))]
+      [exterior (mutable-set)])
+  (define (flood-fill p)
+    (when (and (<= (- minx 1) (vector-ref p 0) (+ maxx 1))
+               (<= (- miny 1) (vector-ref p 1) (+ maxy 1))
+               (<= (- minz 1) (vector-ref p 2) (+ maxz 1))
+               (not (set-member? points p))
+               (not (set-member? exterior p)))
+      (set-add! exterior p)
+      (for-each flood-fill (neighbors p))))
+  (flood-fill (vector (- minx 1) (- miny 1) (- minz 1)))
+  
+  (for/sum ([p points])
+    (for/sum ([n (neighbors p)])
+      (if (set-member? exterior n)
+          1
+          0))))
+;; 2028