From 2139fc459d16df119262afc7928fdd78c1d5f725 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Mon, 12 Dec 2016 21:23:15 -0800 Subject: [PATCH] finish day12 --- 2016/day12/lang.rkt | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/2016/day12/lang.rkt b/2016/day12/lang.rkt index a00f7fd..39950e4 100644 --- a/2016/day12/lang.rkt +++ b/2016/day12/lang.rkt @@ -1,25 +1,41 @@ #lang br/quicklang ;; http://adventofcode.com/2016/day/12 - -(provide read-syntax) +(provide read-syntax + (rename-out [mb #%module-begin]) + cpy inc dec jnz) (define (read-syntax path port) (strip-bindings #`(module mod "lang.rkt" #,@(for/list ([str (in-lines port)] - #:when (not (equal? str ""))) - (format-datum `(handle ,@(map string->symbol (string-split str)))))))) + #:when (not (zero? (string-length str)))) + (format-datum '(~a) str))))) -(define (mb . INSTS) +(define-macro (mb . INSTS) #'(#%module-begin - (define insts (list . INSTS)) + (define insts (vector . INSTS)) (define regs (make-hash '((a . 0)(b . 0)(c . 0)(d . 0)))) - (let loop ([ptr 0]) - (define inst (list-ref insts ptr)) - (inst regs)))) -(provide (rename-out [mb #%module-begin])) + (println (solve insts regs)) + (hash-set! regs 'c 1) + (println (solve insts regs)))) + +(define (solve insts regs) + (let loop ([ptr 0]) + (if (>= ptr (vector-length insts)) + regs + (loop (+ ptr (let ([move ((vector-ref insts ptr) regs)]) + (if (void? move) 1 move))))))) + +(define-macro (cpy X Y) + #'(λ(regs) + (define val (if (number? 'X) 'X (hash-ref regs 'X))) + (hash-set! regs 'Y val))) + +(define-macro (inc X) #'(λ(regs) (hash-update! regs 'X add1))) + +(define-macro (dec X) #'(λ(regs) (hash-update! regs 'X sub1))) -(define-macro-cases handle - [(_ cpy X Y) #'(λ(regs) 42)]) -(provide handle) - \ No newline at end of file +(define-macro (jnz X Y) + #'(λ(regs) + (when (not (zero? (if (number? 'X) 'X (hash-ref regs 'X)))) + Y)))