aboutsummaryrefslogtreecommitdiff
path: root/2022/Day09/part-one.cl
diff options
context:
space:
mode:
Diffstat (limited to '2022/Day09/part-one.cl')
-rw-r--r--2022/Day09/part-one.cl29
1 files changed, 13 insertions, 16 deletions
diff --git a/2022/Day09/part-one.cl b/2022/Day09/part-one.cl
index 9e44aa0..f76fa8d 100644
--- a/2022/Day09/part-one.cl
+++ b/2022/Day09/part-one.cl
@@ -7,13 +7,10 @@
(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"
+ (flet ((norm>sqrt2p (c) ; If c's eucledian length is less than sqrt(2). In other words, if c is outside the 3x3 square.
+ "Optimized version of (> (norm p) (sqrt 2))"
(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))
@@ -21,17 +18,17 @@
((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))))
+ (loop for i from 1 to (parse-integer inpt :start 2)
- (setf movec (movement-vec rtail rhead))
+ do
+ (pair+= rhead (dir-to-pair (char inpt 0)))
+ (setf movec (pair- rhead rtail))
- (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)
+ if (norm>sqrt2p movec)
+ do
+ ;; dist-resize so we don't put the knot on top of the head, but behind it
+ (pair+= rtail (pair-round (dist-resize-by movec -1)))
+ (if (not (member-if (lambda (x) (pair= x rtail)) visited))
+ (push rtail visited))))
- (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))))
+ (print (length visited)))))