;;; 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))))