diff --git a/input/12.txt b/input/12.txt new file mode 100644 index 0000000..6c4bc30 --- /dev/null +++ b/input/12.txt @@ -0,0 +1,773 @@ +N1 +S4 +L180 +W5 +S5 +E2 +N3 +N5 +E5 +F25 +S5 +F88 +L90 +F8 +R90 +E2 +L90 +F72 +S2 +E2 +F82 +N1 +W4 +R90 +W3 +F29 +L90 +E2 +L90 +W5 +L90 +F82 +R90 +F36 +R180 +F19 +W4 +F40 +W1 +R270 +E5 +N3 +W5 +E5 +L90 +E4 +R90 +F50 +E1 +W2 +R180 +N3 +W2 +S4 +F33 +W1 +L90 +W3 +R90 +F51 +R270 +E3 +R90 +W5 +S4 +F72 +R90 +S4 +E3 +F66 +R270 +S3 +E4 +L90 +E2 +R90 +F94 +L90 +F19 +W2 +L90 +F68 +N2 +S3 +F40 +W3 +F47 +S5 +W1 +R90 +F38 +L180 +F70 +N2 +L90 +F13 +R270 +F57 +E2 +R90 +N5 +L90 +F54 +W3 +S2 +F27 +S3 +E2 +S2 +F29 +F8 +S5 +F6 +N4 +L90 +F94 +W2 +S5 +R180 +S5 +F19 +E3 +N1 +F39 +N5 +W3 +R90 +F28 +L90 +S1 +L180 +E4 +N1 +F16 +R90 +W4 +S3 +F24 +W4 +F31 +E4 +N5 +F39 +S3 +F6 +S2 +L270 +F2 +R90 +S5 +E3 +F61 +S2 +F12 +E4 +N3 +R90 +S5 +F88 +N3 +E2 +R90 +E2 +L90 +W2 +N3 +R90 +N1 +L180 +F8 +E3 +W2 +F57 +R90 +E1 +F69 +N3 +L90 +S5 +W2 +L180 +W4 +L90 +S4 +L90 +E3 +S4 +W3 +F38 +R90 +S1 +E1 +F50 +N5 +E2 +N5 +L90 +W2 +F62 +S4 +R90 +F41 +W2 +F77 +L180 +N5 +L90 +S1 +W1 +L90 +W3 +F89 +N1 +R90 +S2 +F50 +S5 +R180 +E5 +F23 +E5 +S2 +F95 +R90 +F17 +F13 +R90 +E2 +S2 +E2 +S4 +R90 +W4 +F19 +F74 +S4 +R90 +W5 +S5 +F5 +N3 +W5 +R90 +S5 +F45 +R270 +E2 +R90 +W5 +R90 +E5 +R90 +E3 +E4 +F83 +W2 +F70 +W1 +F57 +E5 +S2 +F95 +S5 +S4 +E1 +S5 +L180 +F18 +N2 +F55 +W3 +F22 +W4 +N3 +F78 +W1 +F79 +N3 +F2 +L90 +W3 +N5 +L90 +E1 +L90 +F80 +W4 +R180 +W2 +N4 +F39 +W2 +F53 +L180 +W1 +R90 +F10 +E1 +S1 +F74 +N5 +R90 +N1 +F77 +L90 +E2 +R90 +S2 +R90 +N4 +W5 +F54 +S1 +L90 +W5 +L90 +N2 +L90 +S2 +L90 +S4 +F16 +N1 +F26 +R90 +S4 +R90 +E5 +L90 +F83 +N5 +R90 +S2 +W4 +R90 +W4 +L90 +F90 +S2 +W2 +F13 +S3 +F65 +W1 +L90 +E5 +R90 +S4 +E1 +F49 +W4 +F37 +W4 +L180 +W1 +F72 +S2 +F28 +L90 +N1 +E1 +R90 +F68 +S1 +W3 +N1 +F98 +F18 +E3 +L180 +F38 +W5 +L90 +F39 +W5 +S4 +L90 +S2 +L90 +F80 +W4 +F75 +F70 +E5 +N3 +F21 +L90 +F4 +W3 +F11 +N2 +R90 +F95 +L90 +W2 +F28 +E4 +F53 +N1 +E4 +L90 +F22 +N1 +E2 +N3 +F48 +W4 +F22 +E3 +S1 +F65 +R180 +F12 +S3 +W1 +F86 +E3 +F81 +S4 +E2 +F20 +W4 +L90 +N1 +F44 +R90 +S5 +F51 +W1 +F81 +N5 +W5 +S2 +R90 +S2 +E4 +R90 +F65 +L90 +N4 +F80 +N5 +R90 +S1 +L90 +S4 +R90 +N5 +F51 +E2 +L180 +N3 +R90 +F16 +E1 +S1 +L180 +F62 +L90 +N2 +F58 +E1 +R90 +N3 +L90 +W2 +R90 +S1 +E2 +R180 +F50 +N1 +W4 +N1 +F56 +S1 +W1 +F93 +N3 +R180 +S1 +R90 +N3 +W1 +S1 +L90 +N1 +R90 +E2 +N5 +W3 +L270 +N1 +F9 +N3 +E2 +S1 +L180 +F33 +E1 +F33 +W5 +F99 +E4 +F47 +L180 +S3 +F35 +N5 +E4 +N5 +F25 +R90 +E5 +F59 +L180 +F72 +R180 +F70 +L180 +S1 +F83 +E1 +F79 +R90 +F36 +E1 +N4 +F81 +W2 +L90 +F97 +R180 +F72 +S4 +R90 +F14 +W2 +F4 +N2 +N1 +F88 +R90 +N5 +F33 +S3 +E5 +S5 +E3 +L90 +F29 +E1 +F59 +N3 +R90 +W2 +F67 +R90 +E5 +R90 +N4 +F77 +R90 +E4 +S4 +F43 +R90 +S2 +W4 +L180 +N3 +W4 +L90 +S4 +L90 +W3 +N5 +R90 +S5 +E5 +R90 +F4 +F52 +N2 +F68 +N1 +R180 +W3 +S5 +F91 +W2 +S2 +L90 +F36 +R180 +S3 +L180 +N1 +L90 +S2 +E5 +L90 +F66 +N1 +E4 +L90 +F51 +E1 +S4 +R180 +F42 +S4 +L90 +N1 +E2 +F100 +R90 +N4 +F13 +R270 +W1 +L90 +E1 +L270 +W3 +F86 +W4 +F37 +W2 +F57 +N1 +W3 +F86 +R90 +F7 +R90 +S5 +W5 +E5 +L270 +W2 +F39 +L180 +N2 +F9 +E4 +R180 +S2 +F97 +S1 +R180 +F56 +W4 +R90 +W3 +F56 +L180 +F3 +E1 +F39 +N4 +L90 +F45 +R270 +F66 +L90 +F54 +E5 +L90 +E4 +N5 +L90 +S5 +E2 +N5 +E4 +F36 +L180 +F67 +E2 +N5 +W3 +L90 +N1 +E4 +F44 +E5 +L180 +W3 +N5 +R90 +S3 +R270 +W2 +L90 +N3 +L90 +F46 +N5 +F95 +E4 +L90 +F93 +S3 +W2 +N1 +F14 +L90 +F47 +L90 +N4 +E5 +F14 +E5 +S5 +F32 +W4 +S5 +R90 +N4 +F75 +R90 +W1 +S5 +N1 +R90 +E5 +W1 +F82 +R180 +N4 +E2 +S5 +E4 +S3 +F60 +L90 +W2 +F61 +E2 +L180 +N2 +F9 +W2 +L90 +F20 +W1 +F59 +S5 +L180 +F9 +S2 +S3 +L90 +E1 +N2 +W2 +L90 +W1 +S5 +F56 +S4 +F10 +W2 +N3 +N5 +F41 +S4 +L90 +W2 +S1 +R90 +F47 diff --git a/src/12.rkt b/src/12.rkt new file mode 100644 index 0000000..3a45ffe --- /dev/null +++ b/src/12.rkt @@ -0,0 +1,67 @@ +#lang curly-fn racket + +(require threading + "../lib.rkt") + +(define (parse line) + (match line + [(regexp #px"([NESWLRF])(\\d+)" (list _ dir amt)) + (list (string->symbol dir) (string->number amt))])) + +(define input (map parse (problem-input 12))) + +(define (turn curr-dir dir angle) + (define dirs + (if (symbol=? dir 'R) + '(N E S W) + '(N W S E))) + (define index (index-of dirs curr-dir)) + (list-ref dirs (modulo (+ index (/ angle 90)) 4))) + +(define (rotate x y dir amt) + (cond + [(= amt 180) (list (- x) (- y))] + [(= amt 270) (rotate x y (if (symbol=? dir 'R) 'L 'R) 90)] + [(symbol=? dir 'R) (list (- y) x)] + [(symbol=? dir 'L) (list y (- x))])) + +(define (move instr x y dir) + (match instr + [`(N ,amt) (values x (- y amt) dir)] + [`(E ,amt) (values (+ x amt) y dir)] + [`(S ,amt) (values x (+ y amt) dir)] + [`(W ,amt) (values (- x amt) y dir)] + [`(F ,amt) (move `(,dir ,amt) x y dir)] + [`(,lr ,amt) (values x y (turn dir lr amt))])) + +(define (move* instr x-ship y-ship x-wpt y-wpt) + (match instr + [`(N ,amt) (values x-ship y-ship x-wpt (- y-wpt amt))] + [`(E ,amt) (values x-ship y-ship (+ x-wpt amt) y-wpt)] + [`(S ,amt) (values x-ship y-ship x-wpt (+ y-wpt amt))] + [`(W ,amt) (values x-ship y-ship (- x-wpt amt) y-wpt)] + [`(F ,amt) (values (+ x-ship (* x-wpt amt)) (+ y-ship (* y-wpt amt)) x-wpt y-wpt)] + [`(,lr ,amt) + (match-let ([(list x-wpt y-wpt) (rotate x-wpt y-wpt lr amt)]) + (values x-ship y-ship x-wpt y-wpt))])) + +(define (part1) + (define-values (x y dir) + (for/fold ([x 0] + [y 0] + [dir 'E]) + ([instr input]) + (move instr x y dir))) + (+ (abs x) (abs y))) + +(define (part2) + (define-values (x-ship y-ship x-wpt y-wpt) + (for/fold ([x-ship 0] + [y-ship 0] + [x-wpt 10] + [y-wpt -1]) + ([instr input]) + (move* instr x-ship y-ship x-wpt y-wpt))) + (+ (abs x-ship) (abs y-ship))) + +(show-solution (part1) (part2))