mosredna

AoC 2023 day 3

Dec 3rd, 2023
899
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 1.38 KB | Source Code | 0 0
  1. const fs = require("fs")
  2. const { performance } = require("perf_hooks")
  3. const os = require("os")
  4.  
  5. const startTime = performance.now()
  6. let part1 = 0
  7. let part2 = 0
  8.  
  9. const input = fs.readFileSync(__dirname + "/data.txt", "utf8").split(os.EOL)
  10. const isNumberInRange = (number, min, max) => number >= min && number <= max
  11.  
  12. const numbersList = input.flatMap((item, y) => {
  13.     let indexOffset = 0
  14.     return item.match(/\d+/g).map((num) => {
  15.         index = item.indexOf(num, indexOffset)
  16.         indexOffset = index + num.length
  17.         return { x: index, y, length: num.length, num: +num, used: false }
  18.     })
  19. })
  20.  
  21. input.forEach((item, y) => {
  22.     ;[...item].forEach((char, x) => {
  23.         let charList = []
  24.         if (/[^0-9.]/.test(char)) {
  25.             numbersList.filter((v) => {
  26.                 const valid =
  27.                     isNumberInRange(x, v.x - 1, v.x + v.length) && isNumberInRange(v.y, y - 1, y + 1) && !v.used
  28.                 valid && (v.used = true)
  29.                 char == "*" && valid && charList.push(v.num)
  30.                 return valid
  31.             })
  32.         }
  33.         if (charList.length == 2) {
  34.             part2 += charList[0] * charList[1]
  35.         }
  36.     })
  37. })
  38.  
  39. part1 = numbersList.reduce((sum, obj) => (obj.used ? sum + obj.num : sum), 0)
  40. const time = performance.now() - startTime
  41. console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${time} ms`)
  42.  
Advertisement
Add Comment
Please, Sign In to add comment