Advertisement
Guest User

Day 19

a guest
Dec 20th, 2017
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.39 KB | None | 0 0
  1. (defvar *letters* nil)
  2. (defvar *steps* 0)
  3. (defstruct coord nil (y 0) (x 0))
  4. (defvar dir (new coord y 1 x 0))
  5. (defvar p (new coord))
  6. (defvar *map*
  7.   (vec-list
  8.    (mapcar (lambda (l)
  9.              (vec-list
  10.               (mapcar (lambda (c)
  11.                         (caseq c
  12.                                (#\space nil)
  13.                                ((#\| #\- #\+) t)
  14.                                (t c)))
  15.                       l)))
  16.            (get-lines))))
  17. (defun is-in-bounds (y x)
  18.     (and (<= 0 x (- (len [*map* 0]) 1))
  19.      (<= 0 y (- (len *map*) 1))))
  20.  
  21. (defun find-new-dir ()
  22.   (let ((new-dir (new coord))
  23.         (new-p (copy-struct p))
  24.         (slot (if (= dir.x 0) 'x 'y)))
  25.     (inc (slot new-p slot))
  26.     (if [[*map* new-p.y] new-p.x]
  27.         (inc (slot new-dir slot)))
  28.     (dec (slot new-p slot) 2)
  29.     (if [[*map* new-p.y] new-p.x]
  30.         (dec (slot new-dir slot)))
  31.     (if (= new-dir.x new-dir.y) nil new-dir)))
  32.  
  33. (set p.x (car (where (fun use) [*map* 0])))
  34. (while t
  35.   (inc *steps*)
  36.   (if (chrp [[*map* p.y] p.x])
  37.       (set *letters* (cons [[*map* p.y] p.x] *letters*)))
  38.   (cond ((or (not (is-in-bounds (+ p.y dir.y) (+ p.x dir.x)))
  39.              (not [[*map* (+ p.y dir.y)] (+ p.x dir.x)]))
  40.          (set dir (find-new-dir))
  41.          (unless dir (return))))
  42.   (inc p.x dir.x)
  43.   (inc p.y dir.y))
  44.  
  45. (mapcar (fun put-char) (nreverse *letters*))
  46. (format t "\n~a\n" *steps*)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement