Published
Edited
Dec 17, 2020
Insert cell
Insert cell
Insert cell
rangeTester = ( low, high, val ) => low <= val && val <= high
Insert cell
parse = input => {
let mode = 'rules';
let myTicket = [];
const lines = input.split('\n'),
rules = {},
nearby = [];

for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (line === '') continue;
if (line === 'your ticket:' || line === 'nearby tickets:') {
mode = line;
continue;
}

if (mode === 'rules') {
const matches = line.match(/^(.*): (\d+)-(\d+) or (\d+)-(\d+)$/);
rules[matches[1]] = n =>
rangeTester(matches[2], matches[3], n) ||
rangeTester(matches[4], matches[5], n);
continue;
} else if (mode === 'nearby tickets:') {
nearby.push(line.split(',').map(n => parseInt(n)));
} else if (mode === 'your ticket:') {
myTicket = line.split(',').map(n => parseInt(n));
}
}

return { rules, nearby, myTicket };
}
Insert cell
parse(testInput)
Insert cell
findInvalid = input => {
const { rules, nearby } = parse(input);

return nearby
.map(ticket =>
ticket.filter(n => Object.values(rules).some(rule => rule(n)))
)
.flat()
.reduce((sum, n) => sum + n);
}
Insert cell
findInvalid(testInput)
Insert cell
Insert cell
Insert cell
findInvalid(input)
Insert cell
Insert cell
Insert cell
removeIndex= ( arr, idx ) => arr.slice(0,idx).concat(arr.slice(idx + 1))
Insert cell
removeIndex([1, 2], 0)
Insert cell
findFields = input => {
const { rules, nearby, myTicket } = parse(input);

const validTickets = nearby.filter(ticket =>
ticket.every(n => Object.values(rules).some(rule => rule(n)))
);

let availableRules = Object.keys(rules);

const numRules = Object.keys(rules).length;
const validRules = Array.apply(null, { length: numRules }).map(i => []);

do {
for (let i = 0; i < numRules; i++) {
if (validRules[i] && validRules[i].length === 1) continue;
validRules[i] = availableRules.filter(name =>
validTickets.every(ticket => rules[name](ticket[i]))
);
if (validRules[i].length === 1) {
availableRules = availableRules.filter(
name => name !== validRules[i][0]
);
}
}
} while (availableRules.length > 0);

return _.zip(validRules.flat(), myTicket)
.filter(f => f[0].startsWith('departure'))
.reduce((acc, field) => acc * field[1], 1);
}
Insert cell
findFields(testInput)
Insert cell
findFields(input)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more