mosredna

AoC 2022 day 14

Dec 14th, 2022 (edited)
733
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 maxX = -Infinity
  8. let maxY = -Infinity
  9. let input = [...new Set(fs.readFileSync(__dirname + "/data.txt", "utf8").split(eol))].map((r) =>
  10.     r.split(" -> ").map((i) => {
  11.         coord = i.split(",").map(Number)
  12.         maxX = Math.max(coord[0] + 1, maxX)
  13.         maxY = Math.max(coord[1] + 1, maxY)
  14.         return coord
  15.     })
  16. )
  17.  
  18. class Cave {
  19.     map
  20.     overFlow = false
  21.     count = 0
  22.     constructor(width, height) {
  23.         this.map = Array(height)
  24.             .fill()
  25.             .map(() => Array(width).fill(" "))
  26.     }
  27.     setTile(x, y, value) {
  28.         this.map[y][x] = value
  29.     }
  30.     getTile(x, y) {
  31.         if (this.map[y] === undefined) {
  32.             this.overFlow = true
  33.             return ""
  34.         }
  35.         let state = this.map[y][x]
  36.         return state
  37.     }
  38.     addSand(x, y) {
  39.         while (true) {
  40.             if (this.getTile(x, y + 1) === " ") y += 1
  41.             else if (this.getTile(x - 1, y + 1) === " ") (x -= 1), (y += 1)
  42.             else if (this.getTile(x + 1, y + 1) === " ") (x += 1), (y += 1)
  43.             else break
  44.         }
  45.         !this.overFlow && this.setTile(x, y, "0")
  46.         if ((x == 500) & (y == 0)) this.overFlow = true
  47.         return this.overFlow
  48.     }
  49.     floodSand(x, y) {
  50.         this.count++
  51.         if (this.getTile(x, y + 1) === " ") this.floodSand(x, y + 1)
  52.         if (this.getTile(x - 1, y + 1) === " ") this.floodSand(x - 1, y + 1)
  53.         if (this.getTile(x + 1, y + 1) === " ") this.floodSand(x + 1, y + 1)
  54.         this.setTile(x, y, "0")
  55.     }
  56.     addLine(startX, startY, endX, endY) {
  57.         let [sX, eX] = [startX, endX].sort((a, b) => a - b)
  58.         let [sY, eY] = [startY, endY].sort((a, b) => a - b)
  59.         if (sX == eX) for (let y = sY; y <= eY; y++) this.setTile(sX, y, "#")
  60.         if (sY == eY) for (let x = sX; x <= eX; x++) this.setTile(x, sY, "#")
  61.     }
  62. }
  63.  
  64. let cave = new Cave(maxX * 2, maxY + 2)
  65. input.forEach((row) => {
  66.     for (let i = 0; i < row.length - 1; i++) {
  67.         cave.addLine(...row[i], ...row[i + 1])
  68.     }
  69. })
  70.  
  71. while (!cave.addSand(500, 0)) part1++
  72. cave.addLine(0, maxY + 1, maxX * 2, maxY + 1)
  73. cave.floodSand(500, 0)
  74.  
  75. part2 = cave.count + part1
  76. let time = performance.now() - startTime
  77. console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${time} ms`)
Advertisement
Add Comment
Please, Sign In to add comment