aoc-2025/01a.lisp
2025-12-02 18:31:49 +11:00

37 lines
1,019 B
Common Lisp

(require :uiop)
(defun split-instruction (s)
"Splits the given instruction into a pair"
(cons (subseq s 0 1)
(subseq s 1)))
(defun turn-dial (dial instruction)
(let ((cons-instruction (split-instruction instruction)))
(let ((op (intern (car cons-instruction)))
(amount (parse-integer (cdr cons-instruction))))
(mod
(funcall
(cond
((eql 'L op) #'-)
((eql 'R op) #'+)
(t (error "unknown op")))
dial amount)
100)
)
))
;; (turn-dial 50 "L68")
;; (turn-dial 82 "L30")
;; (turn-dial 52 "R48")
(defun rec-dial-vm (accum dial lines)
(let ((instruction (pop lines)))
(if instruction
(let ((new-dial (turn-dial dial instruction)))
(if (= new-dial 0)
(rec-dial-vm accum new-dial lines)
(rec-dial-vm (+ 1 accum) new-dial lines)))
accum)))
(rec-dial-vm 0 50 (uiop:read-file-lines "01example.txt"))
(rec-dial-vm 0 50 (uiop:read-file-lines "01data.txt"))