blob: 3d4fafde588dd459b127451b88aa542e71b0b175 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
(ql:quickload '(fiveam str cl-ppcre arrows uiop))
(setf markers
(loop for line in (uiop:read-file-lines "eg-in")
for (sx sy bx by) = (multiple-value-bind (match values)
(cl-ppcre:scan-to-strings "Sensor at x=(-?\\d+), y=\(-?\\d+\): closest beacon is at x=(-?\\d+), y=(-?\\d+)"
line)
(map 'list #'parse-integer values))
nconc (list (cons sx sy) (cons bx by))))
(defun bounds (markers)
(list (list
(loop for (x . y) in markers minimize x)
(loop for (x . y) in markers maximize x))
(list
(loop for (x . y) in markers minimize y)
(loop for (x . y) in markers maximize y))))
(defun grid (bounds)
(destructuring-bind ((xmin xmax) (ymin ymax)) bounds
(make-array (* (- xmax xmin -1) (- ymax ymin -1)) :initial-element 0 :element-type '(unsigned-byte 2))))
(defun in-grid (bounds)
(destructuring-bind ((xmin xmax) (ymin ymax)) bounds
(let ((stride (- xmax xmin -1)))
(lambda (x y)
(when (and (<= xmin x xmax) (<= ymin y ymax))
(+ (- x xmin) (* (- y ymin) stride)))))))
(defun draw-grid (grid stride)
(let ((out (make-string-output-stream)))
(loop for elt across grid
for idx from 0
do (progn (when (= 0 (mod idx stride)) (terpri out))
(princ (case elt
(0 ".")
(1 "S")
(2 "B")) out)))
(get-output-stream-string out)))
(let* ((bounds (bounds markers))
(loc (in-grid bounds))
(grid (grid bounds)))
(loop for ((sx . sy) (bx . by)) on markers by #'cddr
do (progn (princ (list sx sy bx by))
(setf (aref grid (funcall loc sx sy)) 1)
(setf (aref grid (funcall loc bx by)) 2)))
(destructuring-bind ((xmin xmax) a) bounds
(princ (draw-grid grid (- xmax xmin -1)))
)
)
|