parent
44fe53240a
commit
325ec93a06
1 changed files with 76 additions and 0 deletions
@ -0,0 +1,76 @@ |
||||
#+title: Solution to p4 |
||||
|
||||
Yay, a maze. Cool. |
||||
No, not cool. |
||||
|
||||
#+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; easy |
||||
#+begin_src emacs-lisp |
||||
(defun position-valid-p (pos) |
||||
(and (and (>= (car pos) 0) (< (car pos) width)) |
||||
(and (>= (cadr pos) 0) (< (cadr pos) height)))) |
||||
|
||||
(defun roll-at-p (pos data-char) |
||||
(when (position-valid-p pos) |
||||
(eq ?@ (advent/char-at pos data-char)))) |
||||
|
||||
(setq adjacent '((-1 -1) |
||||
(-1 0) |
||||
(-1 1) |
||||
(0 1) |
||||
(0 -1) |
||||
(1 -1) |
||||
(1 0) |
||||
(1 1))) |
||||
|
||||
(defun rolls-adjacent (pos data-char) |
||||
(length (-non-nil (--map (roll-at-p it data-char) (--map (advent/neighbour pos it) adjacent))))) |
||||
|
||||
(length (--filter (< it 4) |
||||
(--map (rolls-adjacent it data-char) (advent/coordinates-of ?@ data-char)))) |
||||
|
||||
#+end_src |
||||
|
||||
#+RESULTS: |
||||
: 1464 |
||||
|
||||
Now for part two, we create a new data-char at each removal step |
||||
I am not particularly happy style-wise, but that is it for today |
||||
#+begin_src emacs-lisp |
||||
(defun tensor (a b) |
||||
(-map (lambda (x) (--map (list it x) a)) b)) |
||||
|
||||
(setq initial-roll-number (length (advent/coordinates-of ?@ data-char)) |
||||
current-roll-number (1+ initial-roll-number)) |
||||
|
||||
(while (> current-roll-number |
||||
(setq current-roll-number (length (advent/coordinates-of ?@ data-char)))) |
||||
(setq data-char |
||||
(-map (lambda (row) |
||||
(--map (if (and (= ?@ (advent/char-at it data-char)) |
||||
(<= 4 (rolls-adjacent it data-char))) |
||||
?@ ?.) |
||||
row)) |
||||
(tensor (-iterate #'1+ 0 width) |
||||
(-iterate #'1+ 0 height))))) |
||||
|
||||
(- initial-roll-number current-roll-number) |
||||
#+end_src |
||||
|
||||
#+RESULTS: |
||||
: 8409 |
||||
Loading…
Reference in new issue