70 lines
2.1 KiB
Common Lisp
70 lines
2.1 KiB
Common Lisp
(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"))
|