1
0
Fork 0

Refactored Day 8.

This commit is contained in:
Jonathan Chan 2020-12-07 23:29:37 -08:00 committed by Jonathan Chan
parent ff28685df8
commit d8c6e95046
1 changed files with 15 additions and 16 deletions

View File

@ -10,28 +10,27 @@
(define input (list->vector (map parse (problem-input 8)))) (define input (list->vector (map parse (problem-input 8))))
(define (run instrs [part1 #f]) (define (run instrs try)
(let loop ([pc 0] [acc 0] [ran (set)]) (let loop ([pc 0] [acc 0] [ran (set)] [backtrack (const #f)])
(define (get-backtrack next-pc)
(if (and try (= pc try))
(const (loop next-pc acc (set-add ran pc) (const #f)))
backtrack))
(cond (cond
[(>= pc (vector-length instrs)) acc] [(>= pc (vector-length instrs)) acc]
[(set-member? ran pc) (if part1 acc #f)] [(set-member? ran pc) (if try (backtrack) acc)]
[else (match (vector-ref instrs pc) [else (match (vector-ref instrs pc)
[`(nop . ,arg) (loop (add1 pc) acc (set-add ran pc))] [`(acc . ,arg) (loop (add1 pc) (+ acc arg) (set-add ran pc) backtrack)]
[`(acc . ,arg) (loop (add1 pc) (+ acc arg) (set-add ran pc))] [`(nop . ,arg) (loop (add1 pc) acc (set-add ran pc) (get-backtrack (+ pc arg)))]
[`(jmp . ,arg) (loop (+ pc arg) acc (set-add ran pc))])]))) [`(jmp . ,arg) (loop (+ pc arg) acc (set-add ran pc) (get-backtrack (add1 pc)))])])))
(define (try-run instrs) (define (try-run instrs)
(for/last ([i (range (vector-length instrs))] (for/or ([i (range (vector-length instrs))]
#:when (member (car (vector-ref instrs i)) '(nop jmp))) #:when (member (car (vector-ref instrs i)) '(nop jmp)))
(define acc (match-let* ([`(,op . ,arg) (vector-ref instrs i)])
(match-let* ([`(,op . ,arg) (vector-ref instrs i)] (run instrs i))))
[op (if (symbol=? op 'nop) 'jmp 'nop)])
(or (run instrs)
(run (vector-set!* instrs i `(,op . ,arg))))))
#:final acc
acc))
(define-values (part1 part2) (define-values (part1 part2)
(values (run input #t) (try-run input))) (values (run input #f) (try-run input)))
(show-solution part1 part2) (show-solution part1 part2)