From 70e902c06dc5b491ea05eaa1f2513d2425c1f0d7 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 26 Dec 2019 22:27:02 -0800 Subject: [PATCH] d15 p1 (stuck) --- 2019/15.rkt | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2019/15.rktd | 1 + 2 files changed, 94 insertions(+) create mode 100644 2019/15.rkt create mode 100644 2019/15.rktd diff --git a/2019/15.rkt b/2019/15.rkt new file mode 100644 index 0000000..2fef60b --- /dev/null +++ b/2019/15.rkt @@ -0,0 +1,93 @@ +#lang br +(require racket/file rackunit) + +(define (string->ints str) (map string->number (string-split str #px",\\s*"))) +(define (string->regs str) (list->vector (string->ints str))) + +(define ((binarize proc) x y) (if (proc x y) 1 0)) + +(define (make-runner program [calling-thd (current-thread)]) + (thread (λ () + (define regs (string->regs program)) + (define (maybe-enlarge-regs ptr) + (unless (< ptr (vector-length regs)) + (define newvec (make-vector (add1 ptr) 0)) + (vector-copy! newvec 0 regs) + (set! regs newvec)) + regs) + (define (reg-ref ptr) (vector-ref (maybe-enlarge-regs ptr) ptr)) + (define (reg-set! ptr val) (vector-set! (maybe-enlarge-regs ptr) ptr val)) + (define relative-base 0) + (let/ec terminate + (let loop ([ptr 0]) + (define inst (for/list ([c (in-string (~r (reg-ref ptr) #:min-width 5 #:pad-string "0"))]) + (string->number (string c)))) + (define-values (opcode resolve) + (match inst + [(list d4 d3 d2 d1 d0) + (values (+ (* 10 d1) d0) + (λ (ptr offset) + (define parameter-value (match offset [1 d2] [2 d3] [3 d4])) + (define ptr-resolver (match parameter-value + [0 reg-ref] ; position + [1 values] ; immediate + [2 (compose1 (λ (ptr) (+ relative-base ptr)) reg-ref)])); relative + (ptr-resolver (+ ptr offset))))])) + (define next-ptr + (match opcode + [(or 1 2 7 8) ; 4-arity: add & multiply & compare + (reg-set! (resolve ptr 3) ((match opcode + [1 +] + [2 *] + [7 (binarize <)] + [8 (binarize =)]) (reg-ref (resolve ptr 1)) (reg-ref (resolve ptr 2)))) + (+ ptr 4)] + [(or 3 4 9) ; 2-arity: input & output + (match opcode + [3 (reg-set! (resolve ptr 1) (thread-receive))] + [4 (thread-send calling-thd (reg-ref (resolve ptr 1)))] + [9 (set! relative-base (+ relative-base (reg-ref (resolve ptr 1))))]) + (+ ptr 2)] + [(or 5 6) ; 3-arity: jump + (if ((match opcode + [5 not] + [6 values]) (zero? (reg-ref (resolve ptr 1)))) + (reg-ref (resolve ptr 2)) + (+ ptr 3))] + [99 (thread-send calling-thd 'done) (terminate)] + [_ (error "unknown opcode" opcode)])) + (loop next-ptr)))))) + +(define th (make-runner (file->string "15.rktd"))) + +(define (step where) + (thread-send th where) + (match (thread-receive) + [0 'wall] + [1 'empty] + [2 'oxygen])) + +(define (dir->cmd dir) + (match dir + [+i 1] + [-i 2] + [-1 3] + [1 4])) + +(require graph) +(define g (unweighted-graph/undirected null)) + +(define (turn-left dir) (* dir +i)) +(define (turn-right dir) (/ dir +i)) + +(define (explore loc [dir +i]) + (define left-dir (turn-left dir)) + (match (step (dir->cmd left-dir)) + ['wall (explore loc (turn-right dir))] + [res (add-edge! g loc (+ loc left-dir)) + (match res + ['empty (explore (+ loc left-dir) left-dir)] + ['oxygen (+ loc left-dir)])])) + +(define oxygen-loc (explore 0)) +(fewest-vertices-path g 0 oxygen-loc) diff --git a/2019/15.rktd b/2019/15.rktd new file mode 100644 index 0000000..c9bf1e7 --- /dev/null +++ b/2019/15.rktd @@ -0,0 +1 @@ +3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,1002,1034,1,1039,101,0,1036,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1105,1,124,1002,1034,1,1039,101,0,1036,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1105,1,124,1001,1034,-1,1039,1008,1036,0,1041,101,0,1035,1040,101,0,1038,1043,1002,1037,1,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,1002,1035,1,1040,102,1,1038,1043,1002,1037,1,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,39,1032,1006,1032,165,1008,1040,39,1032,1006,1032,165,1101,0,2,1044,1105,1,224,2,1041,1043,1032,1006,1032,179,1102,1,1,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,74,1044,1106,0,224,1101,0,0,1044,1106,0,224,1006,1044,247,102,1,1039,1034,102,1,1040,1035,1002,1041,1,1036,1002,1043,1,1038,1002,1042,1,1037,4,1044,1105,1,0,15,82,44,17,88,23,99,42,83,68,98,44,75,66,15,14,89,20,34,89,18,1,84,70,84,69,55,89,65,10,76,63,83,20,80,60,48,47,98,65,82,84,68,89,52,76,63,86,61,75,4,52,82,79,24,28,93,94,95,40,66,76,81,50,31,94,81,54,19,91,92,61,18,28,79,77,43,69,19,5,87,35,14,23,94,10,76,32,73,90,20,86,67,90,80,8,86,25,89,89,26,48,37,81,49,25,87,92,17,46,84,96,95,60,79,52,19,13,93,30,93,99,17,13,89,96,36,93,81,89,18,2,97,42,45,63,86,20,26,76,97,29,75,56,7,97,93,2,78,9,79,8,57,84,38,80,53,98,89,34,71,85,17,96,50,31,93,64,7,81,72,85,32,83,31,99,69,90,88,33,88,81,41,80,46,47,93,75,34,95,8,98,24,7,76,77,17,23,95,72,82,98,24,91,95,50,38,92,91,32,95,40,77,80,84,82,7,90,23,13,92,40,82,37,80,56,24,79,99,64,90,55,58,46,33,4,88,92,7,84,19,45,16,75,94,40,93,21,87,94,79,39,83,52,92,14,21,77,82,5,84,85,48,75,19,26,91,28,99,87,81,86,24,53,98,52,25,2,75,39,82,24,51,77,47,92,53,94,27,34,85,22,25,36,92,79,29,2,10,19,95,13,96,82,56,99,3,91,62,99,43,49,7,91,96,77,89,7,99,86,24,92,57,24,49,3,96,77,35,75,11,86,21,1,82,67,84,90,75,96,9,83,1,47,78,7,98,30,11,88,52,78,58,98,47,90,46,78,14,77,88,3,97,87,70,75,24,98,5,80,87,93,95,22,37,59,85,23,41,89,91,9,7,90,61,3,95,96,92,25,57,47,38,88,14,15,84,31,79,20,79,77,22,33,90,70,89,78,51,24,93,81,21,79,82,17,75,88,78,26,87,24,38,96,50,81,6,46,93,39,91,92,81,39,91,5,79,58,9,87,50,83,63,87,2,29,92,37,81,55,59,99,91,35,9,96,18,82,66,4,89,44,87,92,6,79,88,9,9,63,88,71,77,91,35,29,87,87,51,20,94,19,57,93,72,89,4,77,10,87,20,67,80,79,71,1,75,28,87,88,87,55,37,80,85,5,55,5,97,12,62,88,82,27,6,99,93,42,91,16,75,80,6,20,96,6,84,6,46,84,23,92,93,32,90,79,3,54,7,97,92,92,33,79,9,5,10,90,76,19,76,1,85,83,58,2,91,83,77,59,63,89,26,97,67,96,52,88,62,65,23,91,94,51,31,80,24,5,72,40,81,9,85,79,12,98,44,45,81,25,30,60,5,76,92,62,18,32,78,25,16,76,97,18,96,39,96,60,78,78,47,99,48,82,98,57,96,98,73,89,18,12,91,8,66,85,57,94,22,76,88,98,39,58,96,91,61,98,89,7,77,91,13,96,20,86,2,88,91,27,75,32,29,79,51,81,4,86,10,37,79,84,67,49,75,20,94,91,23,33,92,38,91,37,76,79,55,91,43,80,25,98,77,91,88,44,15,97,45,3,86,73,87,30,91,62,80,80,16,85,54,88,54,75,88,65,18,85,22,90,79,36,10,77,86,65,30,38,85,3,90,44,48,75,81,80,32,59,90,91,41,95,72,79,11,66,26,96,20,4,68,88,23,95,31,98,12,98,56,94,95,80,68,78,39,79,93,85,55,96,4,77,14,80,46,95,84,84,6,93,35,95,46,85,92,81,69,85,92,87,0,0,21,21,1,10,1,0,0,0,0,0,0 \ No newline at end of file