diff options
author | 2020-12-19 21:49:56 +0100 | |
---|---|---|
committer | 2020-12-19 21:49:56 +0100 | |
commit | 00614a0fcedb45b9d986d92912c6ad84e7217e49 (patch) | |
tree | 62cc52807b218d94f77ea872f1c62d46d94cfe1b /day19/day19-1.js | |
parent | ad8e0fe91fba37e61a913cc6dd67028c26cac373 (diff) | |
download | advent_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.js | 28 |
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) + |