diff options
author | j-james | 2022-11-30 09:06:09 +0000 |
---|---|---|
committer | j-james | 2022-11-30 09:06:09 +0000 |
commit | 568b7cde7290a8ae2d5cbcae6a2c6f4044b62214 (patch) | |
tree | 19179dd4a13f0f4007612ac3b2c555e814cb1419 /2020/nineteen.nim | |
parent | 248c2c05719d2d41267207fbf6fba76c5881f293 (diff) |
Day Nineteen, Part I (2020)
Diffstat (limited to '2020/nineteen.nim')
-rw-r--r-- | 2020/nineteen.nim | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/2020/nineteen.nim b/2020/nineteen.nim new file mode 100644 index 0000000..1f815b4 --- /dev/null +++ b/2020/nineteen.nim @@ -0,0 +1,41 @@ +# Day Nineteen: Monster Messages +import std/[os, strutils, sequtils, sugar, algorithm] + +let input = paramStr(1).readFile().strip().split("\n\n") +let rules: seq[string] = input[0].strip().split("\n") + .sortedByIt(it.split(": ")[0].parseInt()).mapIt(it.split(": ")[1]) + +let messages: seq[string] = input[1].strip().split("\n") + +func replace(a: string, target: int, with: string): string = + var replaced = false + for chunk in a.split(" "): + if chunk[0] != '"' and chunk.parseInt() == target and not replaced: + result &= with # probably the bug + replaced = true + else: + result &= chunk + result &= " " + result.strip() + +var stack: seq[string] +var generated: seq[string] +stack.add(rules[0]) +while stack.len > 0: # slow as all hell... but works! + var current = stack.pop + if not current.contains({'0'..'9'}): + generated.add(current) + else: + var nextindex = current.split(" ") + .filterIt(it[0] != '"')[0].parseInt() + var nextrule = rules[nextindex] + for chunk in nextrule.split(" | "): + stack.add(current.replace(nextindex, chunk)) + +generated.applyIt(it.replace("\"", "").replace(" ", "")) + +var sum = 0 +for line in messages: + if line in generated: + inc sum +echo sum |