aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/03/solver.el
diff options
context:
space:
mode:
authorOscar Najera <hi@oscarnajera.com>2022-12-04 19:05:57 +0100
committerOscar Najera <hi@oscarnajera.com>2022-12-04 19:06:42 +0100
commitf040734a83a241ebb654d48624f649658d9030de (patch)
tree212e2c8d411165ce982429f323b5c454d905ed8e /AoC2022/03/solver.el
parentc8d32ae16184f660b441a3ddc490a1dae44a2eb1 (diff)
downloadscratch-f040734a83a241ebb654d48624f649658d9030de.tar.gz
scratch-f040734a83a241ebb654d48624f649658d9030de.tar.bz2
scratch-f040734a83a241ebb654d48624f649658d9030de.zip
[AoC2022] ELisp 03-01
Diffstat (limited to 'AoC2022/03/solver.el')
-rw-r--r--AoC2022/03/solver.el66
1 files changed, 66 insertions, 0 deletions
diff --git a/AoC2022/03/solver.el b/AoC2022/03/solver.el
new file mode 100644
index 0000000..d2c7c05
--- /dev/null
+++ b/AoC2022/03/solver.el
@@ -0,0 +1,66 @@
+;;; solver.el --- Day 03 -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2022 Óscar Nájera
+;;
+;; Author: Óscar Nájera <hi@oscarnajera.com>
+;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
+;; Created: December 04, 2022
+;; Modified: December 04, 2022
+;;
+;; This file is not part of GNU Emacs.
+;;
+;;; Commentary:
+;;
+;; Day 03
+;;
+;;; Code:
+
+(defsubst solver-recover-value (cross)
+ (let ((result 0))
+ (while (= 0 (logand cross 1))
+ (setq cross (ash cross -1))
+ (cl-incf result))
+ result))
+
+(ert-deftest test-recover ()
+ (should (eq ?t (+ 64 (solver-recover-value (ash 1 (- ?t 64))))))
+ (should (eq ?s (+ 64 (solver-recover-value (ash 1 (- ?s 64))))))
+ (should (eq ?C (+ 64 (solver-recover-value (ash 1 (- ?C 64))))))) ;; small cap starts at a=97, but already took 64
+
+(defsubst solver-to-priority (value)
+ (if (< value 31) ;; It is a capital letter in range [1;26]
+ (+ value 26)
+ (- value 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)))))
+
+(ert-deftest test-line-priority ()
+ (should (= 16 (solver-line-priority "vJrwpWtwJgWrhcsFMMfFFhFp")))
+ (should (= 19 (solver-line-priority "hMHLcmGLMLhHmsRMsSvsQSqrsrlJTTdV" )))
+ (should (= 20 (solver-line-priority "ttgJtRGJQctTZtZT"))))
+
+(ert-deftest test-problems ()
+ (should (= 8072
+ (with-temp-buffer
+ ;; (insert "vJrwpWtwJgWrhcsFMMfFFhFp")
+ (insert-file-contents "input")
+ (goto-char (point-min))
+ (let ((result 0))
+ (while (not (eobp))
+ (cl-incf result (solver-line-priority
+ (buffer-substring-no-properties
+ (line-beginning-position) (line-end-position))))
+ (forward-line))
+ result)))))
+