From c815845330aa9e4f7e476b5f5782ed230cb153b0 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 30 Dec 2017 23:56:07 -0800 Subject: [PATCH] d18 s2 --- 2017/d18/main2.rkt | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2017/d18/star2.rkt | 42 ++++++++++++++++++++++++++++++++++++++ 2017/d18/test2.rkt | 8 ++++++++ 3 files changed, 100 insertions(+) create mode 100644 2017/d18/main2.rkt create mode 100644 2017/d18/star2.rkt create mode 100644 2017/d18/test2.rkt diff --git a/2017/d18/main2.rkt b/2017/d18/main2.rkt new file mode 100644 index 0000000..68649d5 --- /dev/null +++ b/2017/d18/main2.rkt @@ -0,0 +1,50 @@ +#lang reader "../aoc-lang.rkt" +(provide (rename-out [#%mb #%module-begin]) ★★) + +(define-macro (#%mb (STARS) TOKS ...) + #`(#%module-begin + (time (STARS (vector (λ () TOKS) ...))))) + +(define cur-program (make-parameter #f)) +(define cur-receiver (make-parameter #f)) + +(provide snd set add mul mod rcv jgz) +(define-macro (value VAL) #'(let ([val 'VAL]) (if (number? val) val (hash-ref! (cur-program) val 0)))) +(define-macro (set REG VAL) #'(hash-set! (cur-program) 'REG (value VAL))) +(define-macro (add REG VAL) #'(hash-update! (cur-program) 'REG (λ (val) (+ val (value VAL))) 0)) +(define-macro (mul REG VAL) #'(hash-update! (cur-program) 'REG (λ (val) (* val (value VAL))) 0)) +(define-macro (mod REG VAL) #'(hash-update! (cur-program) 'REG (λ (val) (modulo val (value VAL))) 0)) +(define-macro (snd VAL) #'(begin + (hash-update! (cur-program) 'sends add1 0) + (hash-update! (cur-receiver) 'msgs (λ (vals) (append vals (list (value VAL)))) null))) +(define-macro (rcv REG) #'(let ([msgs (hash-ref! (cur-program) 'msgs null)]) + (when (empty? msgs) + (hash-set! (cur-program) 'waiting #t) + (raise 'waiting)) + (hash-set! (cur-program) 'waiting #f) + (hash-update! (cur-program) 'msgs cdr) + (hash-set! (cur-program) 'REG (car msgs)))) +(define-macro (jgz X Y) #'(when (positive? (value X)) (raise (value Y)))) + +(define (do-inst p rcvr insts) + (hash-update! p 'offset (λ (offset) + (+ offset + (with-handlers ([(curry eq? 'waiting) (const 0)] + [integer? values]) + (parameterize ([cur-program p] + [cur-receiver rcvr]) + (define inst (vector-ref insts offset)) + (inst)) + 1))))) + +(define (★★ insts) + (define p0 (make-hasheq '((p . 0)))) + (define p1 (make-hasheq '((p . 1)))) + (define (offset-valid? p) (<= 0 (hash-ref! p 'offset 0) (sub1 (vector-length insts)))) + (define (waiting? p) (hash-ref! p 'waiting #f)) + (for ([i (in-naturals)] + #:break (or (and (not (offset-valid? p0)) (not (offset-valid? p1))) + (and (waiting? p0) (waiting? p1)))) + (when (offset-valid? p0) (do-inst p0 p1 insts)) + (when (offset-valid? p1) (do-inst p1 p0 insts))) + (hash-ref p1 'sends)) diff --git a/2017/d18/star2.rkt b/2017/d18/star2.rkt new file mode 100644 index 0000000..534378a --- /dev/null +++ b/2017/d18/star2.rkt @@ -0,0 +1,42 @@ +#lang reader "main2.rkt" ★★ ; 5969 +set i 31 +set a 1 +mul p 17 +jgz p p +mul a 2 +add i -1 +jgz i -2 +add a -1 +set i 127 +set p 464 +mul p 8505 +mod p a +mul p 129749 +add p 12345 +mod p a +set b p +mod b 10000 +snd b +add i -1 +jgz i -9 +jgz a 3 +rcv b +jgz b -1 +set f 0 +set i 126 +rcv a +rcv b +set p a +mul p -1 +add p b +jgz p 4 +snd a +set a b +jgz 1 3 +snd b +set f 1 +add i -1 +jgz i -11 +snd a +jgz f -16 +jgz a -19 \ No newline at end of file diff --git a/2017/d18/test2.rkt b/2017/d18/test2.rkt new file mode 100644 index 0000000..0cfef24 --- /dev/null +++ b/2017/d18/test2.rkt @@ -0,0 +1,8 @@ +#lang reader "main2.rkt" ★★ ; 3 +snd 1 +snd 2 +snd p +rcv a +rcv b +rcv c +rcv d \ No newline at end of file