blob: c013e5e312ee5824becd4fe308cb3f7fbec97185 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# Day Nineteen: Monster Messages
import std/[os, strutils, sequtils, sugar, algorithm]
let input = paramStr(1).readFile().strip().split("\n\n")
var 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
|