-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathday19.js
70 lines (57 loc) · 1.92 KB
/
day19.js
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const fs = require('fs');
const lines = fs.readFileSync('day19.txt', {encoding: 'utf-8'}).split('\n\n').filter(x => x);
const rules = {};
lines[0].split('\n').forEach((rule) => {
const {groups} = /^(?<key>\d+): (?<value>.*)$/.exec(rule);
rules[groups.key] = groups.value;
});
const messages = lines[1].split('\n');
let ruleToRegexp = {};
function computeRules(value, rules) {
if(value in ruleToRegexp) {
return ruleToRegexp[value];
}
// console.log({value, rules});
let result = '';
if(/^".*"$/.test(value)) {
result = value.replace(/"/g, '');
} else if(/\|/.test(value)) {
const options = value.split(' | ');
result = `(${computeRules(options[0], rules)}|${computeRules(options[1], rules)})`;
} else {
const keys = value.split(' ');
result = keys.map(key => computeRules(rules[key], rules)).join('');
}
ruleToRegexp[value] = result;
return result;
}
computeRules(rules[0], rules);
const mainRule = new RegExp('^'+ruleToRegexp[rules[0]]+'$');
let sum=0;
for (const message of messages) {
if(mainRule.test(message)) {
sum++;
}
}
console.log(sum);
rules['0'] = '8 11';
rules['8'] = '42 | 42 8'; // 42 at least one time
rules['11'] = '42 31 | 42 11 31'; // 42{n}31{n}
computeRules(rules[42], rules);
computeRules(rules[31], rules);
const rule = new RegExp('^(?<group42>('+ruleToRegexp[rules[42]]+')+)(?<group31>('+ruleToRegexp[rules[31]]+')+)$');
sum=0;
for (const message of messages) {
const matches = rule.exec(message);
if(matches) {
const {groups} = matches;
// console.log(groups);
const matches42 = groups.group42.match(new RegExp(ruleToRegexp[rules[42]], 'g')).length;
const matches31 = groups.group31.match(new RegExp(ruleToRegexp[rules[31]], 'g')).length;
// console.log({matches31, matches42});
if(matches42 > matches31) {
sum++;
}
}
}
console.log(sum);