feat(tazjin/aoc2020): Add solution for day 8, part 2

Change-Id: I03f46faf9b5b1b578b1131ecd08746f1adc3e87f
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2243
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2020-12-10 13:50:08 +01:00 committed by tazjin
parent 2485006197
commit ea936e0a78

View file

@ -13,13 +13,16 @@
(s-lines (s-chomp (f-read "/tmp/aoc/day8.txt")))))) (s-lines (s-chomp (f-read "/tmp/aoc/day8.txt"))))))
(defun day8/step (code position acc) (defun day8/step (code position acc)
(if (>= position (length code))
(cons 'final acc)
(let ((current (aref code position))) (let ((current (aref code position)))
(aset code position nil) (aset code position :done)
(pcase current (pcase current
('() (cons 'final acc)) (:done (cons 'loop acc))
(`(nop . ,val) (cons (+ position 1) acc)) (`(nop . ,val) (cons (+ position 1) acc))
(`(acc . ,val) (cons (+ position 1) (+ acc val))) (`(acc . ,val) (cons (+ position 1) (+ acc val)))
(`(jmp . ,val) (cons (+ position val) acc))))) (`(jmp . ,val) (cons (+ position val) acc))))))
;; Puzzle 1 ;; Puzzle 1
@ -28,6 +31,33 @@
(position 0) (position 0)
(acc 0)) (acc 0))
(cl-loop for next = (day8/step code position acc) (cl-loop for next = (day8/step code position acc)
when (equal 'final (car next)) return (cdr next) when (equal 'loop (car next)) return (cdr next)
do (setq position (car next)) do (setq position (car next))
do (setq acc (cdr next))))) do (setq acc (cdr next)))))
;; Puzzle 2
(defun day8/flip-at (code pos)
(pcase (aref code pos)
(`(nop . ,val) (aset code pos `(jmp . ,val)))
(`(jmp . ,val) (aset code pos `(nop . ,val)))
(other (error "Unexpected flip op: %s" other))))
(defun day8/try-flip (flip-at code position acc)
(day8/flip-at code flip-at)
(cl-loop for next = (day8/step code position acc)
when (equal 'loop (car next)) return nil
when (equal 'final (car next)) return (cdr next)
do (setq position (car next))
do (setq acc (cdr next))))
(message "Solution to day8/2: %s"
(let ((flip-options (cl-loop for op being the elements of day8/input
using (index idx)
for opcode = (car op)
when (or (equal 'nop opcode)
(equal 'jmp opcode))
collect idx)))
(cl-loop for flip-at in flip-options
for result = (day8/try-flip flip-at (copy-sequence day8/input) 0 0)
when result return result)))