mosredna

AoC 2024 day 5

Dec 5th, 2024 (edited)
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 1.91 KB | Source Code | 0 0
  1. const fs = require("fs")
  2.  
  3. const input = fs.readFileSync(__dirname + (process.argv.includes("--test") ? "/test.txt" : "/input.txt"), "utf8")
  4.  
  5. const parseInput = (rawInput) => {
  6.     const [rulesSection, updatesSection] = rawInput.replace(/\r\n/g, "\n").split("\n\n")
  7.     const rules = rulesSection.split("\n").map((line) => line.split("|").map(Number))
  8.     const updates = updatesSection.split("\n").map((line) => line.split(",").map(Number))
  9.     return { rules, updates }
  10. }
  11.  
  12. const isUpdateInOrder = (update, rules) => {
  13.     for (const [before, after] of rules) {
  14.         const beforeIndex = update.indexOf(before)
  15.         const afterIndex = update.indexOf(after)
  16.         if (beforeIndex !== -1 && afterIndex !== -1 && beforeIndex > afterIndex) {
  17.             return false
  18.         }
  19.     }
  20.     return true
  21. }
  22.  
  23. const getMiddlePage = (update) => update[Math.floor(update.length / 2)]
  24.  
  25. const reorderUpdate = (update, rules) => {
  26.     const ruleMap = new Map()
  27.     for (const [a, b] of rules) {
  28.         if (!ruleMap.has(b)) ruleMap.set(b, new Set())
  29.         ruleMap.get(b).add(a)
  30.     }
  31.  
  32.     return update.slice().sort((a, b) => {
  33.         if (ruleMap.get(a)?.has(b)) return 1
  34.         if (ruleMap.get(b)?.has(a)) return -1
  35.         return 0
  36.     })
  37. }
  38.  
  39. const part1 = ({ rules, updates }) =>
  40.     updates
  41.         .filter((update) => isUpdateInOrder(update, rules))
  42.         .map(getMiddlePage)
  43.         .reduce((sum, middle) => sum + middle, 0)
  44.  
  45. const part2 = ({ rules, updates }) =>
  46.     updates
  47.         .filter((update) => !isUpdateInOrder(update, rules))
  48.         .map((update) => reorderUpdate(update, rules))
  49.         .map(getMiddlePage)
  50.         .reduce((sum, middle) => sum + middle, 0)
  51.  
  52. const data = parseInput(input)
  53.  
  54. console.time("Part 1 Time")
  55. console.log("Part 1:", part1(data))
  56. console.timeEnd("Part 1 Time")
  57.  
  58. console.time("Part 2 Time")
  59. console.log("Part 2:", part2(data))
  60. console.timeEnd("Part 2 Time")
  61.  
Advertisement
Add Comment
Please, Sign In to add comment