diff --git a/04b.lisp b/04b.lisp new file mode 100644 index 0000000..8f39b46 --- /dev/null +++ b/04b.lisp @@ -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"))