7637e92b8c
This passes all tests I could find so far, but doesn't work on the website. I wrote an interactive debugger for looking at the input, and haven't found anything incorrect, so not sure what it wants from me. Change-Id: I506001735e15b2d02eaaebc6d1da8c26e92acde0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10188 Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
110 lines
3.1 KiB
EmacsLisp
110 lines
3.1 KiB
EmacsLisp
(defun aoc23d3-symbol-p (c)
|
|
(not (or (= c ? )
|
|
(and (>= c ?0)
|
|
(<= c ?9)))))
|
|
|
|
(defun rectangle-for-bounds (bounds)
|
|
(let* ((start (save-excursion
|
|
(goto-char (car bounds))
|
|
(let ((col (current-column)))
|
|
(forward-line -1)
|
|
(move-to-column (max 0 (1- col))))
|
|
(point)))
|
|
(end (save-excursion
|
|
(goto-char (cdr bounds))
|
|
(let ((col (current-column)))
|
|
(forward-line 1)
|
|
(move-to-column (1+ col)))
|
|
(point))))
|
|
(list start end)))
|
|
|
|
(defun get-machine-part ()
|
|
(interactive)
|
|
(when-let* ((num-raw (number-at-point))
|
|
(num (abs num-raw))
|
|
;; handles negative number edge case (bounds contain the `-')
|
|
(bounds-raw (bounds-of-thing-at-point 'number))
|
|
(bounds (if (< num-raw 0)
|
|
(cons (1- (car bounds-raw)) (cdr bounds-raw))
|
|
bounds-raw))
|
|
(rectangle (rectangle-for-bounds bounds))
|
|
(neighbours (apply #'concat
|
|
(apply #'extract-rectangle rectangle))))
|
|
(if (-any #'aoc23d3-symbol-p (string-to-list neighbours))
|
|
(cons num rectangle)
|
|
(cons nil rectangle))))
|
|
|
|
|
|
(defun find-machine-parts (input)
|
|
(with-temp-buffer
|
|
(insert input)
|
|
(goto-char (point-min))
|
|
(save-excursion
|
|
(replace-string "." " "))
|
|
|
|
(cl-loop while (forward-word)
|
|
for result = (get-machine-part)
|
|
when (car result) collect (car result))))
|
|
|
|
|
|
;; debugging
|
|
|
|
(defvar aoc23d3-example "467..114..
|
|
...*......
|
|
..35..633.
|
|
......#...
|
|
617*......
|
|
.....+.58.
|
|
..592.....
|
|
......755.
|
|
...$.*....
|
|
.664.598..")
|
|
|
|
(defvar aoc23d3-example2 "12.......*..
|
|
+.........34
|
|
.......-12..
|
|
..78........
|
|
..*....60...
|
|
78..........
|
|
.......23...
|
|
....90*12...
|
|
............
|
|
2.2......12.
|
|
.*.........*
|
|
1.1.......56")
|
|
|
|
(defvar aoc23d3-example3 "243.
|
|
..*.
|
|
....")
|
|
|
|
(defun aoc23d3-debug (p)
|
|
"Interactive debugger for the solution, can be bound to a key in
|
|
an input buffer. Dots should already have been replaced with
|
|
spaces."
|
|
(interactive "P")
|
|
(unless p
|
|
(goto-char aoc23d3-last))
|
|
(rectangle-mark-mode 1)
|
|
(forward-word)
|
|
(setq aoc23d3-last (point))
|
|
(pcase (get-machine-part)
|
|
(`(nil ,b ,e) (progn (set-mark b)
|
|
(goto-char e)
|
|
(set-face-attribute 'region nil :background "#FAA0A0")))
|
|
(`(,num ,b ,e) (progn (set-mark b)
|
|
(goto-char e)
|
|
(set-face-attribute 'region nil :background "#d1ffbd")))
|
|
(other (deactivate-mark))))
|
|
|
|
(cl-assert (= 4361 (-sum (find-machine-parts aoc23d3-example))) nil
|
|
"example from website is working")
|
|
|
|
(cl-assert (= 413 (-sum (find-machine-parts aoc23d3-example2))) nil
|
|
"example from subreddit is working")
|
|
|
|
(cl-assert (= 243 (-sum (find-machine-parts aoc23d3-example3))) nil
|
|
"example from telegram is working")
|
|
|
|
;; day 1 (incomplete)
|
|
|
|
(-sum (find-machine-parts (s-trim (f-read "~/Downloads/input.txt"))))
|