Commit Diff


commit - 1fa9aa89ff2daf4cc4a43f917512963bf9a4ab6b
commit + 2b131a0c9cea5786a70d136aa843d2877776ef0e
blob - 7e8d84559591ab7e57b22b2120649f4569cc6c8a
blob + b4988defaa20510b273a0bea5c2622be580f2e0d
--- src/day-3.lisp
+++ src/day-3.lisp
@@ -3,21 +3,22 @@
   (:export #:day-3))
 (in-package #:aoc/day-3)
 
+(defparameter *regex* "(mul\\((\\d+),(\\d+)\\))|((do|don't)\\(\\))")
+
 (defun day-3 (input)
   (let ((input-string (read-stream-content-into-string input))
         (mul-enabled t)
         (task-1 0)
         (task-2 0))
-    (ppcre:do-scans (start end reg-starts reg-ends "(mul\\(\\d+,\\d+\\))|((do|don't)\\(\\))" input-string)
+    (ppcre:do-scans (start end reg-starts reg-ends *regex* input-string)
       (case (aref input-string start)
         (#\d
          (setf mul-enabled (char/= (aref input-string (+ start 2)) #\n)))
         (#\m
-         (multiple-value-bind (num-1 end)
-             (parse-integer input-string :start (+ start 4) :junk-allowed t)
-           (let* ((num-2 (parse-integer input-string :start (1+ end) :junk-allowed t))
-                  (result (* num-1 num-2)))
-             (incf task-1 result)
-             (when mul-enabled
-               (incf task-2 result)))))))
+         (let* ((num-1 (parse-integer input-string :start (aref reg-starts 1) :end (aref reg-ends 1)))
+                (num-2 (parse-integer input-string :start (aref reg-starts 2) :end (aref reg-ends 2)))
+                (result (* num-1 num-2)))
+           (incf task-1 result)
+           (when mul-enabled
+             (incf task-2 result))))))
     (values task-1 task-2)))