aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/03/solver.el
diff options
context:
space:
mode:
Diffstat (limited to 'AoC2022/03/solver.el')
-rw-r--r--AoC2022/03/solver.el40
1 files changed, 14 insertions, 26 deletions
diff --git a/AoC2022/03/solver.el b/AoC2022/03/solver.el
index 355ddf7..62b91e2 100644
--- a/AoC2022/03/solver.el
+++ b/AoC2022/03/solver.el
@@ -15,6 +15,7 @@
;;
;;; Code:
(require 'subr-x)
+(require 'ert)
(defsubst solver-recover-value (cross)
(let ((result 0))
(while (= 0 (logand cross 1))
@@ -34,45 +35,32 @@
(defun solver-line-priority (str)
(cl-assert (length> str 0))
- (let ((mid (/ (length str) 2))
- (left-pack 0) (right-pack 0))
- (cl-loop for l across (substring str 0 mid)
- for r across (substring str mid)
- do (progn
- (setf left-pack (logior left-pack (ash 1 (- l 64)))) ;; ASCII letters start at 65=A
- (setf right-pack (logior right-pack(ash 1 (- r 64)))))
- for cross = (logand left-pack right-pack)
- when (< 0 cross)
- return (solver-to-priority (solver-recover-value cross)))))
+ (let ((mid (/ (length str) 2)))
+ (thread-first
+ (cl-intersection (string-to-list (substring str 0 mid))
+ (string-to-list (substring str mid)))
+ (car) (- 64)
+ (solver-to-priority))))
(ert-deftest test-line-priority ()
(should (= 16 (solver-line-priority "vJrwpWtwJgWrhcsFMMfFFhFp")))
(should (= 19 (solver-line-priority "hMHLcmGLMLhHmsRMsSvsQSqrsrlJTTdV" )))
(should (= 20 (solver-line-priority "ttgJtRGJQctTZtZT"))))
-(defsubst solver-badge (packs)
- (seq-reduce (lambda (acc item)
- (logior acc (ash 1 (- item 64))))
- packs 0))
-
(defun solver-badge-priority (group-packs)
(thread-last group-packs
- (split-string)
- (mapcar #'solver-badge)
- (apply #'logand)
- (solver-recover-value)
+ (mapcar #'string-to-list)
+ (cl-reduce #'cl-intersection)
+ (car) (+ -64)
(solver-to-priority)))
(defun solver (task lines)
(with-temp-buffer
(insert-file-contents "input")
- (goto-char (point-min))
- (cl-loop while (not (eobp))
- sum
- (funcall task
- (buffer-substring-no-properties (point)
- (line-end-position lines)))
- do (forward-line lines))))
+ (let ((packs (split-string (buffer-string))))
+ (apply #'+
+ (mapcar task (if (= lines 1)
+ packs (seq-partition packs 3)))))))
(ert-deftest test-problems ()
(should (= 8072 (solver #'solver-line-priority 1)))