You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

277 lines
4.2 KiB

#+title: Solution to p10
Load the file into a list of lines
#+begin_src emacs-lisp
(require 'dash)
(with-temp-buffer
(insert-file-contents "input")
(goto-char (point-min))
(replace-regexp "^" "\"")
(goto-char (point-min))
(replace-regexp "$" "\"")
(goto-char (point-min))
(insert "(setq data '(")
(goto-char (point-max))
(insert "))")
(eval-buffer))
#+end_src
#+RESULTS:
and split into a list of list of heights, calculating height and width
#+begin_src emacs-lisp
(setq data-heights (-map (lambda (str) (--map (- (string-to-char it) ?0) (split-string str "\\|.+" t)))
data)
height (length data-heights)
width (length (car data-heights)))
#+end_src
#+RESULTS:
: 41
here we define some helper functions
#+begin_src emacs-lisp
(defun acceptable-p (p)
(let ((x (car p))
(y (cadr p)))
(and (>= x 0) (>= y 0) (< x width) (< y height)) ))
(defun neighbours (p)
(let ((x (car p))
(y (cadr p)))
(-filter #'acceptable-p
(-map (lambda (q) (list (+ x (car q)) (+ y (cadr q)))) '((+1 0) (-1 0) (0 1) (0 -1))))))
(defun height (p)
(nth (car p) (nth (cadr p) data-heights)))
#+end_src
#+RESULTS:
: height
This yields the coordinates of the trailheads
#+begin_src emacs-lisp
(setq trail-heads (-map #'cadr
(--filter (eq (car it) 0)
(-mapcat #'identity
(-map-indexed (lambda (y l) (-map-indexed (lambda (x el) (list el (list x y))) l)) data-heights)))))
#+end_src
#+RESULTS:
| 2 | 0 |
| 14 | 0 |
| 17 | 0 |
| 22 | 0 |
| 33 | 0 |
| 35 | 0 |
| 12 | 1 |
| 18 | 1 |
| 32 | 1 |
| 1 | 2 |
| 3 | 2 |
| 35 | 2 |
| 6 | 3 |
| 14 | 3 |
| 19 | 3 |
| 24 | 3 |
| 26 | 3 |
| 37 | 3 |
| 7 | 4 |
| 14 | 4 |
| 20 | 4 |
| 21 | 4 |
| 23 | 4 |
| 28 | 4 |
| 30 | 4 |
| 36 | 4 |
| 38 | 4 |
| 0 | 5 |
| 24 | 5 |
| 29 | 5 |
| 33 | 5 |
| 7 | 6 |
| 9 | 6 |
| 14 | 6 |
| 19 | 6 |
| 25 | 6 |
| 26 | 6 |
| 28 | 6 |
| 38 | 6 |
| 39 | 6 |
| 2 | 7 |
| 6 | 7 |
| 4 | 8 |
| 17 | 8 |
| 27 | 8 |
| 35 | 8 |
| 40 | 8 |
| 8 | 9 |
| 12 | 9 |
| 20 | 9 |
| 39 | 9 |
| 8 | 10 |
| 9 | 10 |
| 27 | 10 |
| 31 | 10 |
| 33 | 10 |
| 0 | 11 |
| 12 | 11 |
| 24 | 11 |
| 39 | 11 |
| 0 | 12 |
| 1 | 12 |
| 4 | 12 |
| 8 | 12 |
| 10 | 12 |
| 13 | 12 |
| 25 | 12 |
| 14 | 13 |
| 22 | 13 |
| 27 | 13 |
| 37 | 13 |
| 10 | 14 |
| 13 | 14 |
| 15 | 14 |
| 33 | 14 |
| 36 | 14 |
| 5 | 15 |
| 17 | 15 |
| 21 | 15 |
| 32 | 15 |
| 16 | 16 |
| 20 | 16 |
| 31 | 16 |
| 38 | 16 |
| 8 | 17 |
| 9 | 17 |
| 19 | 17 |
| 0 | 18 |
| 7 | 18 |
| 17 | 18 |
| 19 | 18 |
| 28 | 18 |
| 34 | 18 |
| 10 | 19 |
| 17 | 19 |
| 23 | 19 |
| 30 | 19 |
| 32 | 19 |
| 33 | 19 |
| 2 | 20 |
| 7 | 20 |
| 13 | 20 |
| 39 | 20 |
| 5 | 21 |
| 6 | 21 |
| 19 | 21 |
| 30 | 21 |
| 0 | 22 |
| 7 | 22 |
| 16 | 22 |
| 22 | 22 |
| 24 | 22 |
| 29 | 22 |
| 30 | 22 |
| 35 | 22 |
| 37 | 22 |
| 12 | 23 |
| 22 | 23 |
| 29 | 23 |
| 32 | 23 |
| 22 | 24 |
| 23 | 24 |
| 38 | 24 |
| 3 | 25 |
| 10 | 25 |
| 21 | 25 |
| 26 | 25 |
| 31 | 25 |
| 36 | 25 |
| 39 | 25 |
| 40 | 26 |
| 6 | 27 |
| 11 | 27 |
| 16 | 27 |
| 23 | 27 |
| 28 | 27 |
| 31 | 27 |
| 33 | 27 |
| 39 | 27 |
| 8 | 28 |
| 18 | 28 |
| 0 | 29 |
| 1 | 29 |
| 3 | 29 |
| 11 | 29 |
| 37 | 29 |
| 2 | 30 |
| 19 | 30 |
| 21 | 30 |
| 31 | 30 |
| 8 | 31 |
| 15 | 31 |
| 26 | 31 |
| 27 | 31 |
| 4 | 32 |
| 5 | 32 |
| 7 | 32 |
| 11 | 32 |
| 12 | 32 |
| 29 | 32 |
| 38 | 32 |
| 13 | 33 |
| 24 | 33 |
| 40 | 33 |
| 5 | 34 |
| 7 | 34 |
| 20 | 34 |
| 32 | 34 |
| 13 | 35 |
| 15 | 35 |
| 21 | 35 |
| 29 | 35 |
| 34 | 35 |
| 37 | 35 |
| 39 | 35 |
| 40 | 35 |
| 26 | 36 |
| 29 | 36 |
| 33 | 36 |
| 39 | 36 |
| 10 | 37 |
| 13 | 37 |
| 15 | 37 |
| 17 | 37 |
| 38 | 37 |
| 1 | 38 |
| 25 | 38 |
| 2 | 39 |
| 39 | 39 |
| 1 | 40 |
| 2 | 40 |
| 4 | 40 |
| 14 | 40 |
| 22 | 40 |
| 23 | 40 |
| 24 | 40 |
these follow the trails to the top, calculating the two properties of each trailhead
#+begin_src emacs-lisp
(defun tails (p h)
(when (eq (height p) h)
(if (eq h 9) (list p)
(--mapcat (tails it (+ 1 h)) (neighbours p)))))
(defun score (p)
(length (-distinct (tails p 0))))
(defun rating (p)
(length (tails p 0)))
(-reduce #'+ (-map #'score trail-heads))
(-reduce #'+ (-map #'rating trail-heads))
#+end_src
#+RESULTS:
: 1186