summaryrefslogtreecommitdiffstats
path: root/day19/day19-1.js
diff options
context:
space:
mode:
authorGravatar Piotr Russ <mail@pruss.it> 2020-12-19 21:49:56 +0100
committerGravatar Piotr Russ <mail@pruss.it> 2020-12-19 21:49:56 +0100
commit00614a0fcedb45b9d986d92912c6ad84e7217e49 (patch)
tree62cc52807b218d94f77ea872f1c62d46d94cfe1b /day19/day19-1.js
parentad8e0fe91fba37e61a913cc6dd67028c26cac373 (diff)
downloadadvent_of_code_2020-00614a0fcedb45b9d986d92912c6ad84e7217e49.tar.gz
advent_of_code_2020-00614a0fcedb45b9d986d92912c6ad84e7217e49.tar.bz2
advent_of_code_2020-00614a0fcedb45b9d986d92912c6ad84e7217e49.zip
day19
Diffstat (limited to 'day19/day19-1.js')
-rw-r--r--day19/day19-1.js28
1 files changed, 28 insertions, 0 deletions
diff --git a/day19/day19-1.js b/day19/day19-1.js
new file mode 100644
index 0000000..03cad56
--- /dev/null
+++ b/day19/day19-1.js
@@ -0,0 +1,28 @@
+const data = require('./data')
+const rules = {}, regexps = {}
+const [unorderedRules, messages] = data.split('\n\n').map(l => l.split(/\n/g).filter(Boolean))
+unorderedRules.forEach(r => rules[r.split(': ')[0]] = r.split(': ')[1])
+
+const find = (rule, rules) => {
+ if (rule in regexps) { return regexps[rule] }
+
+ let newRule = ''
+ if (/^".*"$/.test(rule)) {
+ newRule = rule.replace(/"/g, '')
+ } else if (/\|/.test(rule)) {
+ const [r1, r2] = rule.split(' | ')
+ newRule = `(${find(r1, rules)}|${find(r2, rules)})`
+ } else {
+ newRule = rule.split(' ').map(nr => find(rules[nr], rules)).join('')
+ }
+ regexps[rule] = newRule
+ return newRule
+}
+
+find(rules[0], rules)
+const regexp = new RegExp(`^${regexps[rules[0]]}$`)
+
+let result = 0
+messages.forEach(m => { if (regexp.test(m)) { result++ } })
+console.log('Answer: ', result)
+