Advertisement
mosredna

AoC 2022 day 18

Dec 18th, 2022 (edited)
1,126
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. let input = fs
  8.     .readFileSync(__dirname + "/data.txt", "utf8")
  9.     .split(eol)
  10.     .map((s) => s.trim())
  11.  
  12. function str2obj(str, explored = false) {
  13.     let [x, y, z] = str.split(",").map(Number)
  14.     return { x, y, z, explored }
  15. }
  16. function obj2str(obj) {
  17.     return `${obj.x},${obj.y},${obj.z}`
  18. }
  19.  
  20. let min = str2obj("Infinity,Infinity,Infinity")
  21. let max = str2obj("-Infinity,-Infinity,-Infinity")
  22. let voxels = new Map()
  23. input.map((item) => {
  24.     voxels.set(item, str2obj(item))
  25. })
  26. function getSurface(map, minMax = true) {
  27.     let surface = 0
  28.     for (let v of map) {
  29.         let sides = 6
  30.         for (let i = -1; i <= 1; i += 2) {
  31.             let x = +(v[1].x + i) + "," + v[1].y + "," + v[1].z
  32.             let y = v[1].x + "," + (v[1].y + i) + "," + v[1].z
  33.             let z = v[1].x + "," + v[1].y + "," + (v[1].z + i)
  34.             map.has(x) && sides--
  35.             map.has(y) && sides--
  36.             map.has(z) && sides--
  37.         }
  38.         if (minMax) {
  39.             min = { x: Math.min(min.x, v[1].x - 1), y: Math.min(min.y, v[1].y - 1), z: Math.min(min.z, v[1].z - 1) }
  40.             max = { x: Math.max(max.x, v[1].x + 1), y: Math.max(max.y, v[1].y + 1), z: Math.max(max.z, v[1].z + 1) }
  41.         }
  42.         surface += sides
  43.     }
  44.     return surface
  45. }
  46. part1 = getSurface(voxels)
  47.  
  48. let box = new Map()
  49. for (let x = min.x; x <= max.x; x++) {
  50.     for (let y = min.y; y <= max.y; y++) {
  51.         for (let z = min.z; z <= max.z; z++) {
  52.             let str = obj2str({ x, y, z })
  53.             if (!voxels.has(str)) box.set(str, str2obj(str))
  54.         }
  55.     }
  56. }
  57.  
  58. function flood(str) {
  59.     let stack = [box.get(str)]
  60.     while (stack.length) {
  61.         let v = stack.pop()
  62.         v.explored = true
  63.         box.delete(obj2str(v))
  64.         for (let i = -1; i <= 1; i += 2) {
  65.             let x = +(v.x + i) + "," + v.y + "," + v.z
  66.             let y = v.x + "," + (v.y + i) + "," + v.z
  67.             let z = v.x + "," + v.y + "," + (v.z + i)
  68.             if (box.has(x) && !box.get(x).explored) stack.push(box.get(x))
  69.             if (box.has(y) && !box.get(y).explored) stack.push(box.get(y))
  70.             if (box.has(z) && !box.get(z).explored) stack.push(box.get(z))
  71.         }
  72.     }
  73. }
  74. flood(obj2str(min))
  75. part2 = part1 - getSurface(box, false)
  76.  
  77. let time = performance.now() - startTime
  78. console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${time} ms`)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement