Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const fs = require("fs")
- const input = fs.readFileSync(__dirname + (process.argv.includes("--test") ? "/test.txt" : "/input.txt"), "utf8")
- const parseInput = (rawInput) => {
- const [rulesSection, updatesSection] = rawInput.replace(/\r\n/g, "\n").split("\n\n")
- const rules = rulesSection.split("\n").map((line) => line.split("|").map(Number))
- const updates = updatesSection.split("\n").map((line) => line.split(",").map(Number))
- return { rules, updates }
- }
- const isUpdateInOrder = (update, rules) => {
- for (const [before, after] of rules) {
- const beforeIndex = update.indexOf(before)
- const afterIndex = update.indexOf(after)
- if (beforeIndex !== -1 && afterIndex !== -1 && beforeIndex > afterIndex) {
- return false
- }
- }
- return true
- }
- const getMiddlePage = (update) => update[Math.floor(update.length / 2)]
- const reorderUpdate = (update, rules) => {
- const ruleMap = new Map()
- for (const [a, b] of rules) {
- if (!ruleMap.has(b)) ruleMap.set(b, new Set())
- ruleMap.get(b).add(a)
- }
- return update.slice().sort((a, b) => {
- if (ruleMap.get(a)?.has(b)) return 1
- if (ruleMap.get(b)?.has(a)) return -1
- return 0
- })
- }
- const part1 = ({ rules, updates }) =>
- updates
- .filter((update) => isUpdateInOrder(update, rules))
- .map(getMiddlePage)
- .reduce((sum, middle) => sum + middle, 0)
- const part2 = ({ rules, updates }) =>
- updates
- .filter((update) => !isUpdateInOrder(update, rules))
- .map((update) => reorderUpdate(update, rules))
- .map(getMiddlePage)
- .reduce((sum, middle) => sum + middle, 0)
- const data = parseInput(input)
- console.time("Part 1 Time")
- console.log("Part 1:", part1(data))
- console.timeEnd("Part 1 Time")
- console.time("Part 2 Time")
- console.log("Part 2:", part2(data))
- console.timeEnd("Part 2 Time")
Advertisement
Add Comment
Please, Sign In to add comment