day 4 part 2

This commit is contained in:
Alan Daniels 2025-12-10 20:51:30 +11:00
parent 242088b896
commit 9959416bcc

70
04b.lisp Normal file
View file

@ -0,0 +1,70 @@
(require :uiop)
(load (sb-ext:posix-getenv "ASDF"))
(asdf:load-system 'str)
(defun read-diagram (lines)
(let* (
(dim (length lines))
(diagram (make-array (list dim dim))))
(loop for line in lines
for y from 0
do (loop for char across line
for x from 0
do (if (char-equal char #\@)
(setf (aref diagram y x) 1))))
diagram))
(read-diagram (uiop:read-file-lines "04example.txt"))
(defun make-kernel (diagram -x -y)
(let ( (kernel (make-array '(3 3))))
(loop for y from -1 to 1
do (loop for x from -1 to 1
do (let ((-x (+ -x x))
(-y (+ -y y)))
(if (array-in-bounds-p diagram -y -x)
(setf (aref kernel (+ y 1) (+ x 1)) (aref diagram -y -x))
(setf (aref kernel (+ y 1) (+ x 1)) 0)))))
kernel))
(make-kernel (read-diagram (uiop:read-file-lines "04example.txt")) 0 2)
(defun sum-kernel (kernel)
(and
(= (aref kernel 1 1) 1)
(<
(-
(loop for y from 0 to 2
sum (loop for x from 0 to 2
sum (aref kernel y x)))
1)
4)
))
(sum-kernel (make-kernel (read-diagram (uiop:read-file-lines "04example.txt")) 2 0))
(defun sum-diagram (lines)
(let ((dim (- (length lines) 1))
(diagram (read-diagram lines))
(subtotal 0)
(total 0))
(loop
do
(progn
(setq subtotal (loop for y from 0 to dim
sum (loop for x from 0 to dim
sum (if (sum-kernel (make-kernel diagram x y))
(progn
(setf (aref diagram y x) 0)
1)
0))))
(setq total (+ total subtotal))
)
until (= subtotal 0)
;; do (progn
;; (print diagram)
;; (print subtotal)
;; (print total)
;; (sleep 1))
)
total
))
(sum-diagram (uiop:read-file-lines "04example.txt"))
(sum-diagram (uiop:read-file-lines "04data.txt"))