Public
Edited
Nov 15, 2022
15 forks
1 star
Insert cell
Insert cell
Insert cell
Insert cell
function parseRules(input) {
return new Map(
input.map((s) => {
const fields = s.match(/(.+): (\d+)-(\d+) or (\d+)-(\d+)/);
return [fields[1], fields.slice(2).map(Number)];
})
);
}
Insert cell
Insert cell
Insert cell
function invalidFields(ranges, ticket) {
const applyRules = (f) =>
ranges.every(
([mn1, mx1, mn2, mx2]) => (f < mn1 || f > mx1) && (f < mn2 || f > mx2)
);
return ticket.filter(applyRules);
}
Insert cell
function part1([ruleInput, tickets]) {
const ranges = [...parseRules(ruleInput).values()];
return AOC.sum(tickets.map((ticket) => invalidFields(ranges, ticket)).flat());
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function validTickets(rules, tickets) {
const ranges = [...rules.values()];
return tickets.filter((ticket) => invalidFields(ranges, ticket).length == 0);
}
Insert cell
Insert cell
function satisfiedRules(n, rules) {
return new Set([
...new Map(
AOC.filterSet(
rules,
([_, [mn1, mx1, mn2, mx2]]) =>
(n >= mn1 && n <= mx1) || (n >= mn2 && n <= mx2)
)
).keys()
]);
}
Insert cell
Insert cell
function satisfiedAtPos(pos, rules, tickets) {
return AOC.intersections(tickets.map((ns) => satisfiedRules(ns[pos], rules)));
}
Insert cell
Insert cell
function rulesAtPositions(rules, tickets) {
return new Map(
AOC.range(0, tickets[0].length - 1).map((pos) => [
pos,
satisfiedAtPos(pos, rules, tickets)
])
);
}
Insert cell
Insert cell
Insert cell
function departurePositions(rules) {
return [...rules]
.filter(([k, _]) => k.startsWith("departure"))
.map(([_, v]) => v);
}
Insert cell
Insert cell
function depVals(ticket, depPos) {
return depPos.map((pos) => ticket[pos]);
}
Insert cell
function part2([ruleInput, myTicket, ticketInput]) {
const rules = parseRules(ruleInput);
const vTickets = validTickets(rules, ticketInput);
const fieldPositions = AOC.invertMap(
AOC.eliminate(rulesAtPositions(rules, vTickets))
);
return AOC.product(depVals(myTicket, departurePositions(fieldPositions)));
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
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