Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const fs = require("fs")
- const { performance } = require("perf_hooks")
- const os = require("os")
- const startTime = performance.now()
- let part1 = 0
- let part2 = 0
- const input = fs.readFileSync(__dirname + "/data.txt", "utf8").split(os.EOL)
- const isNumberInRange = (number, min, max) => number >= min && number <= max
- const numbersList = input.flatMap((item, y) => {
- let indexOffset = 0
- return item.match(/\d+/g).map((num) => {
- index = item.indexOf(num, indexOffset)
- indexOffset = index + num.length
- return { x: index, y, length: num.length, num: +num, used: false }
- })
- })
- input.forEach((item, y) => {
- ;[...item].forEach((char, x) => {
- let charList = []
- if (/[^0-9.]/.test(char)) {
- numbersList.filter((v) => {
- const valid =
- isNumberInRange(x, v.x - 1, v.x + v.length) && isNumberInRange(v.y, y - 1, y + 1) && !v.used
- valid && (v.used = true)
- char == "*" && valid && charList.push(v.num)
- return valid
- })
- }
- if (charList.length == 2) {
- part2 += charList[0] * charList[1]
- }
- })
- })
- part1 = numbersList.reduce((sum, obj) => (obj.used ? sum + obj.num : sum), 0)
- const time = performance.now() - startTime
- console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${time} ms`)
Advertisement
Add Comment
Please, Sign In to add comment