diff options
author | Leah Neukirchen <leah@vuxu.org> | 2022-12-20 18:48:19 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2022-12-20 18:48:19 +0100 |
commit | dfa12a8e6cc0383f7cff37d445f310e87c4d9e95 (patch) | |
tree | 41aecfe5ae04852b81a8e78968570501234fd1a3 /day18.rkt | |
parent | fa9c75b979cec6b23a009f31f14397230f2ea3da (diff) | |
download | adventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.tar.gz adventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.tar.xz adventofcode2022-dfa12a8e6cc0383f7cff37d445f310e87c4d9e95.zip |
day18
Diffstat (limited to 'day18.rkt')
-rw-r--r-- | day18.rkt | 47 |
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 |