From a7951564fb42ea032a80ccaf179eb0444dc1ff1b Mon Sep 17 00:00:00 2001 From: Jacopo De Simoi Date: Sat, 12 Apr 2025 08:51:31 -0400 Subject: [PATCH] p12.1 --- p10/p10.org | 1 - p12/p12.org | 69 ++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/p10/p10.org b/p10/p10.org index e846529..8b38187 100644 --- a/p10/p10.org +++ b/p10/p10.org @@ -56,7 +56,6 @@ This yields the coordinates of the trailheads (-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 | diff --git a/p12/p12.org b/p12/p12.org index 45cf9eb..2a481cc 100644 --- a/p12/p12.org +++ b/p12/p12.org @@ -4,7 +4,7 @@ Load the file into a list of lines #+begin_src emacs-lisp (require 'dash) (with-temp-buffer - (insert-file-contents "input-test") + (insert-file-contents "input") (goto-char (point-min)) (replace-regexp "^" "\"") (goto-char (point-min)) @@ -27,22 +27,63 @@ and split into a list of list of chars #+end_src #+RESULTS: -: 10 +: 140 -#+begin_src emacs-lisp - (defun acceptable-p (p) - (let ((x (car p)) - (y (cadr p))) - (and (>= x 0) (>= y 0) (< x width) (< y height)) )) +#+begin_src emacs-lisp :results silent + (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))) - (-map (lambda (q) (list (+ x (car q)) (+ y (cadr q)))) '((+1 0) (-1 0) (0 1) (0 -1))))) + (defun neighbours (p) + (let ((x (car p)) + (y (cadr p))) + (-map (lambda (q) (list (+ x (car q)) (+ y (cadr q)))) '((+1 0) (-1 0) (0 1) (0 -1))))) (defun acceptable-neighbours (p) - (-filter #'acceptable-p (neighbours p))) + (-filter #'acceptable-p (neighbours p))) + + (defun plant (p) + (if (not (acceptable-p p)) ?. + (nth (car p) (nth (cadr p) data-chars)))) +#+end_src + +collect all plants type and return a list of list of positions + +now we need to split each group into regions +ACC is a list of regions. The function +#+begin_src emacs-lisp :results none + (defun agglomerate (acc el) + (let ((nbhs (acceptable-neighbours el))) + (cons (-mapcat #'identity (cons (list el) (--filter (-intersection it nbhs) acc))) + (--filter (not (-intersection it nbhs)) acc)) + ) + ) + + (setq regions (--mapcat (-reduce-from #'agglomerate nil it) groups)) +#+end_src + +#+begin_src emacs-lisp + (defun count-fence (el) + (let ((i (plant el)) + (pos el)) + (length (--filter (not (eq i it)) (-map #'plant (neighbours pos)))))) - (defun height (p) - (nth (car p) (nth (cadr p) data-heights))) + (defun count-vertices (el) + + ) + (-reduce #'+ (--map (* (car it) (cdr it)) + (-zip-pair (-map #'length regions) + (-map (lambda (region) (-reduce #'+ (-map #'count-fence region))) regions)))) #+end_src + +#+RESULTS: +: 1451030 + + +#+begin_src emacs-lisp :no-results + (setq areas (-frequencies (-mapcat #'identity data-chars))) +#+end_src + + +(plant ' (0 9))