aboutsummaryrefslogtreecommitdiff
path: root/2022/Day09/part-one.cl
blob: 9e44aa06eb676a15524b56927f264ec52e84c2a9 (plain) (blame)
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
;;; https://gitlab.com/Syndamia/senzill
(require :senzill)
(use-package :senzill.math)
(use-package :senzill.collections)
(use-package :senzill.pair)
(use-package :senzill.io)

(ask-for-stream (prog-input)
  (let ((rhead '(0 . 0)) (rtail '(0 . 0)) (visited '((0 . 0))) (movec '()))
  (flet ((p-longer-than-sqrt2 (c)
           "If c is outside the 3x3 square"
           (or (> (abs (car c)) 1) (> (abs (cdr c)) 1)))

         (movement-vec (c1 c2)
           (cons (- (car c2) (car c1)) (- (cdr c2) (cdr c1))))

         (dir-to-pair (direction)
           (cond ((char= direction #\R) '( 1 .  0))
                 ((char= direction #\L) '(-1 .  0))
                 ((char= direction #\U) '( 0 .  1))
                 ((char= direction #\D) '( 0 . -1)))))

    (doread-lines (inpt :read-line-options (prog-input NIL))
                  (pair+= rhead (*pair (digit-char-p (char inpt 2))
                                       (dir-to-pair (char inpt 0))))

                  (setf movec (movement-vec rtail rhead))

                  (if (p-longer-than-sqrt2 movec)
                    (progn (setf movec (pair-round (dist-resize-by movec -1))) ; We dont want to move tail on the head, but behind it
                           (pair+= rtail movec)

                           (loop for intermvec = movec then (pair-round (dist-resize-by intermvec -1))
                                 until (pair= intermvec '(0 . 0))
                                 if (not (member (pair- rtail intermvec) visited))
                                   do (push (pair- rtail intermvec) visited)))))
    (print visited))))