(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"))