mosredna

AoC 2022 day 13

Dec 13th, 2022 (edited)
831
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const fs = require("fs")
  2. const performance = require("perf_hooks").performance
  3. const eol = require("os").EOL
  4.  
  5. let startTime = performance.now()
  6. let part1 = (part2 = 0)
  7. const data = fs.readFileSync(__dirname + "/data.txt", "utf8")
  8.  
  9. function compare(left, right) {
  10.     let leftIsNum = typeof left == "number"
  11.     let rightIsNum = typeof right == "number"
  12.  
  13.     if (leftIsNum && rightIsNum) return left - right
  14.     if (leftIsNum) left = [left]
  15.     else if (rightIsNum) right = [right]
  16.  
  17.     for (let i = 0; i < left.length; i++) {
  18.         if (!right[i]) return 1
  19.         const c = compare(left[i], right[i])
  20.         if (c != 0) return c
  21.     }
  22.     return left.length == right.length ? 0 : -1
  23. }
  24.  
  25. let input1 = data.split(eol + eol).map((a) => a.split(eol).map(JSON.parse))
  26. input1.forEach((item, i) => {
  27.     if (compare(...item) <= 0) part1 += i + 1
  28. })
  29. let dividers = [[[2]], [[6]]]
  30. let input2 = data
  31.     .split(eol + eol)
  32.     .map((a) => a.split(eol).map(JSON.parse))
  33.     .flat()
  34.     .concat(dividers)
  35.     .sort(compare)
  36. part2 = dividers.map((d) => input2.indexOf(d) + 1).reduce((acc, n) => acc * n)
  37.  
  38. let time = performance.now() - startTime
  39. console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${time} ms`)
Advertisement
Add Comment
Please, Sign In to add comment