From 6df188f43225e8e5430982ec4bad2390231c215c Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 8 Dec 2020 23:06:55 -0700 Subject: [PATCH] Solve AOC Day 8 Pt 1 with EmbeddedScript --- kiss/src/kiss/EmbeddedScript.hx | 27 +- kiss/src/kiss/FieldForms.hx | 1 - projects/aoc/src/year2020/BootCode.hx | 10 + projects/aoc/src/year2020/BootCodeDSL.kiss | 34 + projects/aoc/src/year2020/Solutions.hx | 1 + projects/aoc/src/year2020/Solutions.kiss | 10 +- .../aoc/src/year2020/inputs/day8-example.txt | 9 + projects/aoc/src/year2020/inputs/day8.txt | 624 ++++++++++++++++++ 8 files changed, 711 insertions(+), 5 deletions(-) create mode 100644 projects/aoc/src/year2020/BootCode.hx create mode 100644 projects/aoc/src/year2020/BootCodeDSL.kiss create mode 100644 projects/aoc/src/year2020/inputs/day8-example.txt create mode 100644 projects/aoc/src/year2020/inputs/day8.txt diff --git a/kiss/src/kiss/EmbeddedScript.hx b/kiss/src/kiss/EmbeddedScript.hx index 8bc84304..86595802 100644 --- a/kiss/src/kiss/EmbeddedScript.hx +++ b/kiss/src/kiss/EmbeddedScript.hx @@ -20,6 +20,17 @@ class EmbeddedScript { var instructionPointer = 0; var running = false; + // TODO encapsulate these? + public var breakPoints:Map Bool> = []; + public var onBreak:() -> Void = null; + + public function addBreakPoint(instruction:Int, ?condition:() -> Bool) { + if (condition == null) { + condition = () -> true; + } + breakPoints[instruction] = condition; + } + public function new() {} #if macro @@ -58,7 +69,11 @@ class EmbeddedScript { }), name: "instructions", access: [APrivate], - kind: FVar(null, macro [$a{commandList}]) + kind: FFun({ + ret: Helpers.parseComplexType("Array", null), + args: [], + expr: macro return [$a{commandList}] + }) }); classFields.push({ @@ -73,10 +88,16 @@ class EmbeddedScript { ret: null, args: [], expr: macro { - instructions[instructionPointer](); + instructions()[instructionPointer](); ++instructionPointer; - if (instructionPointer >= instructions.length) + if (breakPoints.exists(instructionPointer) && breakPoints[instructionPointer]()) { running = false; + if (onBreak != null) { + onBreak(); + } + } else if (instructionPointer >= instructions().length) { + running = false; + } } }) }); diff --git a/kiss/src/kiss/FieldForms.hx b/kiss/src/kiss/FieldForms.hx index 82b04a85..21eba5f7 100644 --- a/kiss/src/kiss/FieldForms.hx +++ b/kiss/src/kiss/FieldForms.hx @@ -40,7 +40,6 @@ class FieldForms { return switch (nameExp.def) { case MetaExp("mut", nameExp): access.remove(AFinal); - trace('ACCESS $access'); fieldAccess(formName, fieldName, nameExp, access); default: if (formName == "defvar" || formName == "defun") { diff --git a/projects/aoc/src/year2020/BootCode.hx b/projects/aoc/src/year2020/BootCode.hx new file mode 100644 index 00000000..f4317811 --- /dev/null +++ b/projects/aoc/src/year2020/BootCode.hx @@ -0,0 +1,10 @@ +package year2020; + +import kiss.EmbeddedScript; +import kiss.Prelude; + +@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeDSL.kiss", "src/year2020/inputs/day8-example.txt")) +class BootCodeExample extends EmbeddedScript {} + +@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeDSL.kiss", "src/year2020/inputs/day8.txt")) +class BootCodeReal extends EmbeddedScript {} diff --git a/projects/aoc/src/year2020/BootCodeDSL.kiss b/projects/aoc/src/year2020/BootCodeDSL.kiss new file mode 100644 index 00000000..b275db20 --- /dev/null +++ b/projects/aoc/src/year2020/BootCodeDSL.kiss @@ -0,0 +1,34 @@ +(defprop &mut accumulator 0) + +(defmethod setBreakPoint [] (addBreakPoint instructionPointer)) + +(defmethod nop [v] (setBreakPoint)) +(defmethod acc [v] (setBreakPoint) (set accumulator (+ accumulator v))) +(defmethod jmp [v] (setBreakPoint) (set instructionPointer (+ instructionPointer (- v 1)))) + +(defreadermacro "" [stream] #| ReaderExp.CallExp( + { + pos: {file: "bleh", line: 1, column: 1, absoluteChar: 1}, + def: ReaderExp.Symbol(stream.expect("an instruction", function () { stream.takeUntilAndDrop(" "); })) + }, + [ + { + pos: {file: "fefea", line: 1, column: 1, absoluteChar: 1}, + def: ReaderExp.CallExp( + { + pos: {file: "treh", line: 1, column: 1, absoluteChar: 1}, + def: ReaderExp.Symbol(stream.expect("+/-", function () { stream.takeChars(1); })) + }, + [ + { + pos: {file: "smeeh", line: 1, column: 1, absoluteChar: 1}, + def: ReaderExp.Symbol("0") + }, + { + pos: {file: "greeeh", line: 1, column: 1, absoluteChar: 1}, + def: ReaderExp.Symbol(stream.expect("an argument", function () { stream.takeUntilAndDrop("\n"); })) + } + ]) + } + ]) + |#) \ No newline at end of file diff --git a/projects/aoc/src/year2020/Solutions.hx b/projects/aoc/src/year2020/Solutions.hx index 0c15c783..d6d46400 100644 --- a/projects/aoc/src/year2020/Solutions.hx +++ b/projects/aoc/src/year2020/Solutions.hx @@ -12,6 +12,7 @@ import year2020.Passports; import year2020.Seating; import year2020.Customs; import year2020.Bags; +import year2020.BootCode; @:build(kiss.Kiss.build("src/year2020/Solutions.kiss")) class Solutions {} diff --git a/projects/aoc/src/year2020/Solutions.kiss b/projects/aoc/src/year2020/Solutions.kiss index 4a50ec4f..13857f37 100644 --- a/projects/aoc/src/year2020/Solutions.kiss +++ b/projects/aoc/src/year2020/Solutions.kiss @@ -76,5 +76,13 @@ (deflocal :Map shinyGoldParents (new Map)) (Bags.findIndirectContainers "shiny gold" childMap shinyGoldParents) (assert (= 172 (count shinyGoldParents))) - (assert (= 39645 (Bags.totalChildBags "shiny gold" parentMap)))) + (assert (= 39645 (Bags.totalChildBags "shiny gold" parentMap))) + + // Day 8 + (let [example (new BootCodeExample)] + (set example.onBreak (lambda [] (assert (= 5 example.accumulator)))) + (example.run)) + (let [bootCode (new BootCodeReal)] + (set bootCode.onBreak (lambda [] (assert (= 2058 bootCode.accumulator) (assert true)))) + (bootCode.run))) diff --git a/projects/aoc/src/year2020/inputs/day8-example.txt b/projects/aoc/src/year2020/inputs/day8-example.txt new file mode 100644 index 00000000..6fee3494 --- /dev/null +++ b/projects/aoc/src/year2020/inputs/day8-example.txt @@ -0,0 +1,9 @@ +nop +0 +acc +1 +jmp +4 +acc +3 +jmp -3 +acc -99 +acc +1 +jmp -4 +acc +6 \ No newline at end of file diff --git a/projects/aoc/src/year2020/inputs/day8.txt b/projects/aoc/src/year2020/inputs/day8.txt new file mode 100644 index 00000000..11a14d0f --- /dev/null +++ b/projects/aoc/src/year2020/inputs/day8.txt @@ -0,0 +1,624 @@ +acc -7 +acc +6 +acc +4 +nop +191 +jmp +199 +acc +44 +acc -9 +jmp +505 +acc -12 +acc +45 +jmp +204 +jmp +129 +acc +17 +nop +287 +jmp +584 +acc +16 +jmp +363 +acc +4 +nop +142 +acc +34 +nop +345 +jmp +522 +jmp +53 +acc -10 +jmp +524 +jmp +492 +jmp +319 +acc -9 +jmp +550 +acc -19 +jmp +15 +acc +24 +jmp +30 +acc -19 +acc +12 +acc -2 +jmp +274 +nop +91 +acc +10 +acc +4 +jmp +501 +acc +49 +acc +29 +jmp +488 +jmp +504 +jmp +277 +acc +20 +acc +34 +jmp -40 +acc +10 +acc -4 +acc -19 +acc +38 +jmp +239 +acc -16 +acc -3 +nop +513 +jmp +526 +jmp +131 +nop +539 +acc -11 +jmp +470 +acc +30 +jmp +166 +acc +17 +acc -16 +nop +315 +jmp +364 +acc +15 +nop -61 +acc -12 +nop +147 +jmp -31 +acc -9 +jmp +324 +acc +0 +jmp +1 +jmp +321 +acc +0 +acc +6 +acc -17 +acc +13 +jmp +461 +jmp +184 +acc +22 +jmp +182 +jmp +504 +nop +131 +acc +12 +acc -6 +acc +29 +jmp +187 +acc +17 +jmp +67 +jmp -2 +acc +50 +acc +17 +jmp +442 +acc +8 +nop +146 +acc -12 +acc +32 +jmp +237 +jmp +1 +acc +34 +acc +1 +acc +18 +jmp +274 +acc +17 +acc -12 +jmp +282 +acc +49 +acc +11 +acc +28 +acc +40 +jmp +79 +acc +19 +acc -8 +nop +87 +jmp +347 +acc +48 +nop +189 +jmp +419 +acc +31 +jmp +1 +acc +31 +jmp +1 +jmp -94 +nop -45 +nop +412 +acc -14 +acc +35 +jmp -49 +jmp +177 +jmp +127 +jmp +360 +jmp +114 +acc -11 +nop +248 +jmp -64 +acc +31 +acc +23 +acc +4 +nop +110 +jmp +61 +acc +45 +nop +444 +jmp +218 +jmp -131 +acc +36 +jmp -142 +nop +361 +acc -3 +acc +6 +jmp +161 +acc +24 +acc -7 +acc +4 +acc +31 +jmp +91 +jmp -20 +jmp +1 +nop -11 +jmp -146 +acc +25 +acc +33 +jmp +52 +acc -7 +jmp +82 +acc +7 +acc +21 +acc +6 +jmp +397 +acc +12 +acc +5 +acc -9 +acc +24 +jmp +371 +acc +50 +acc +47 +acc +19 +jmp +238 +jmp +396 +acc -16 +nop +394 +jmp +180 +acc +1 +acc +40 +jmp +237 +acc +22 +nop -30 +jmp -129 +acc +22 +jmp +232 +acc +23 +acc +27 +acc +47 +jmp +133 +acc +0 +nop +30 +acc +11 +acc -9 +jmp +381 +jmp +75 +jmp -64 +acc -15 +acc +29 +acc +49 +jmp +195 +nop +113 +acc -16 +nop +312 +acc +6 +jmp -44 +acc +26 +acc +40 +jmp +272 +jmp +83 +jmp +365 +acc +24 +acc +4 +jmp +29 +acc +8 +jmp -137 +acc +13 +jmp +1 +acc +33 +nop -182 +jmp +22 +jmp +9 +nop +20 +acc +14 +nop +291 +jmp -28 +jmp -83 +acc +18 +acc +5 +jmp +32 +acc +48 +nop -128 +acc +28 +jmp +225 +acc +29 +nop +280 +jmp +304 +acc +37 +acc +50 +acc +30 +jmp +131 +jmp -60 +acc +27 +jmp +272 +jmp +358 +acc -1 +acc +37 +jmp +203 +acc +1 +acc +37 +acc +12 +acc -16 +jmp +263 +acc -16 +acc +30 +jmp +86 +acc +26 +acc +6 +jmp +344 +jmp -147 +jmp -185 +acc -5 +acc -3 +acc +7 +acc +9 +jmp -205 +nop -85 +acc -4 +acc -1 +jmp +266 +acc +19 +nop -143 +acc -3 +jmp -12 +acc +12 +acc -18 +jmp +326 +acc +39 +jmp +165 +nop -279 +acc +19 +acc +46 +acc +5 +jmp -163 +acc -13 +jmp +1 +acc +33 +acc +44 +jmp -62 +acc -10 +acc +7 +jmp +240 +acc -19 +jmp -190 +acc -12 +jmp -167 +acc -2 +nop -288 +acc -13 +jmp +303 +acc +24 +jmp -283 +jmp +309 +nop +190 +acc +38 +acc -12 +jmp -47 +acc +15 +acc +31 +jmp -259 +nop +154 +acc +25 +acc +8 +jmp -295 +acc +37 +acc +34 +acc -18 +acc +41 +jmp +156 +acc +17 +acc +37 +jmp -243 +nop -318 +acc +45 +acc +33 +jmp +139 +acc -6 +acc +34 +acc +25 +acc +3 +jmp +260 +jmp +1 +acc +24 +jmp +154 +acc +34 +acc -19 +jmp +211 +acc +28 +jmp +98 +acc +45 +jmp -143 +acc +41 +acc +8 +acc +33 +nop +217 +jmp +119 +acc +21 +jmp -150 +acc +25 +acc +19 +jmp +1 +acc +20 +jmp +209 +acc +43 +acc +18 +acc +2 +jmp -159 +acc +25 +acc +20 +acc -4 +acc +45 +jmp +89 +nop +33 +acc +27 +jmp +190 +acc +47 +acc +36 +jmp +180 +acc +3 +jmp +1 +jmp -349 +jmp -6 +jmp -244 +acc +2 +acc +42 +jmp -357 +acc +3 +jmp -377 +acc +31 +nop -292 +acc +6 +acc +9 +jmp -212 +jmp -91 +acc +11 +jmp +119 +acc -18 +acc +38 +acc +31 +jmp -261 +jmp +1 +acc +2 +jmp -197 +acc +0 +jmp +1 +acc +40 +acc +31 +acc +4 +acc +45 +jmp -68 +acc -17 +acc +8 +nop -384 +jmp -193 +acc +22 +nop +170 +acc -19 +acc +34 +jmp -321 +acc +46 +jmp +130 +acc -19 +jmp +115 +acc -12 +acc +23 +acc +16 +jmp -94 +acc +11 +nop -286 +jmp -276 +acc +36 +acc +25 +jmp -32 +acc +6 +acc +39 +jmp +171 +acc -5 +nop -131 +jmp -368 +acc +41 +acc -7 +nop -336 +jmp -428 +acc +21 +acc +45 +jmp -225 +acc -2 +acc +14 +acc +29 +jmp -439 +acc +36 +acc +26 +jmp -433 +acc +29 +acc +36 +acc +31 +jmp -232 +nop -210 +nop -44 +jmp -382 +nop -119 +acc +43 +jmp +1 +jmp -24 +acc -13 +acc +22 +acc +16 +jmp +90 +nop -443 +acc +23 +acc +15 +acc -3 +jmp -225 +jmp -448 +acc +21 +acc -19 +acc +23 +jmp +1 +jmp -447 +acc +36 +acc -1 +acc +31 +nop +8 +jmp +97 +jmp -96 +acc -16 +acc +7 +acc -2 +jmp +1 +jmp -237 +jmp +1 +acc -12 +acc +29 +acc -1 +jmp -188 +acc +8 +jmp -453 +nop -234 +acc +46 +acc +20 +acc +24 +jmp -68 +jmp -178 +acc +42 +jmp -469 +acc +19 +acc +35 +jmp -4 +acc +49 +jmp +65 +nop +15 +nop -209 +acc +27 +jmp -261 +acc +15 +jmp -344 +acc +13 +acc +43 +jmp -194 +jmp +1 +jmp -335 +nop -424 +acc -13 +nop -387 +jmp -333 +acc +33 +acc +30 +jmp -272 +acc +16 +acc +5 +acc +21 +acc +41 +jmp -312 +acc +50 +jmp -429 +nop +57 +jmp -212 +acc +7 +acc -13 +jmp -252 +jmp -277 +jmp -114 +jmp -528 +jmp -40 +jmp -275 +acc +27 +nop -322 +jmp -356 +acc -11 +jmp -96 +nop -9 +acc -15 +jmp -194 +acc +9 +acc +47 +acc +44 +jmp -459 +acc -2 +acc -12 +nop -354 +jmp -166 +acc +44 +acc +23 +jmp -503 +acc +47 +acc +39 +acc +10 +acc +14 +jmp -543 +acc +43 +jmp -25 +jmp -52 +acc -19 +jmp -423 +acc +35 +acc +22 +acc +10 +acc +16 +jmp -527 +jmp -482 +acc +2 +acc +21 +acc -17 +jmp -417 +jmp -282 +acc +16 +nop -424 +nop -527 +jmp -207 +acc +23 +acc +21 +jmp -503 +acc +17 +acc -14 +jmp -189 +acc +43 +acc +14 +acc +11 +nop -427 +jmp -54 +acc +8 +nop -37 +nop -542 +jmp -332 +acc +27 +jmp +7 +jmp -98 +acc +50 +acc +0 +acc +48 +acc +0 +jmp -517 +acc +15 +acc +10 +jmp -478 +jmp -141 +acc +0 +acc +18 +jmp -468 +acc +49 +jmp -112 +nop -536 +acc -14 +acc -13 +acc +34 +jmp +1