function parseInput(input) {
let [rulesArr, messages] = input.split('\n\n').map(txt => txt.split('\n'));
const rulesArr2 = [];
for (let rule of rulesArr) {
let [nr, match] = rule.split(': ');
nr |= 0;
match = match
.split(' | ')
.map(rulePart =>
rulePart
.split(' ')
.map(nr => (+nr + "" === nr ? +nr : nr.slice(1, nr.length - 1)))
);
const isString = typeof match[0][0] === "string";
const pair = [
nr,
{
isString,
match: isString ? match[0] : match
}
];
rulesArr2.push(pair);
}
rulesArr2.sort((a, b) => a[0] - b[0]);
const rules = new Map();
const stringRules = new Map();
for (const [nr, rule] of rulesArr2) {
rules.set(nr, rule);
if (rule.isString) stringRules.set(nr, rule);
}
return { rules, stringRules, messages };
}