#+title: Solution to p7 Yay, another 2D problem #+begin_src emacs-lisp :results none (with-temp-buffer (insert-file-contents "input") (advent/replace-multiple-regex-buffer '(("^\\(.*\\)$" . "\"\\1\" "))) (goto-char (point-min)) (insert "(setq data '(") (goto-char (point-max)) (insert "))") (eval-buffer)) (setq data-char (-map #'advent/split-string-into-char-list data) width (length (car data-char)) height (length data-char)) #+end_src This is for part 1; #+begin_src emacs-lisp (defun position-valid-p (pos) (and (and (>= (car pos) 0) (< (car pos) width)) (and (>= (cadr pos) 0) (< (cadr pos) height)))) (advent/char-at '(-1 0) data-char) (defun tachyon-step (el) (if (not (position-valid-p el)) (list el) (let ((down (advent/neighbour el '(0 1)))) (if (or (not (position-valid-p down)) (not (eq ?^ (advent/char-at down data-char)))) (list down) (push down splits) (--map (advent/neighbour el it) '((-1 0) (1 0))))))) (setq tachyons (advent/coordinates-of ?S data-char)) (setq splits nil) (length (--fix (-distinct (-mapcat 'tachyon-step it)) tachyons)) (length (-distinct splits)) #+end_src #+RESULTS: : 1507 #+begin_src emacs-lisp (defun tachyon-step-freq (el) (--map (cons it (cdr el)) (tachyon-step (car el)))) (setq tachyons (cons (car (advent/coordinates-of ?S data-char)) 1)) (defun compress (li) (--map (cons it (-sum (-map #'cdr (-filter (lambda (x) (equal it (car x))) li)))) (-distinct (-map #'car li)))) (-sum (-map #'cdr (--fix (compress (-mapcat 'tachyon-step-freq it)) (list tachyons)))) #+end_src #+RESULTS: : 1537373473728