Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const fs = require("fs")
- const performance = require("perf_hooks").performance
- const eol = require("os").EOL
- let startTime = performance.now()
- let part1 = 0
- let part2 = 0
- let input = fs.readFileSync(__dirname + "/data.txt", "utf8").split(eol)
- let pos
- let map = input.map((val, i) => {
- let row = val.split("")
- let sPos = row.indexOf("S")
- if (sPos > -1) {
- pos = { x: sPos, y: i }
- row[sPos] = "J" // My startNode, might be different for other maps
- }
- return row
- })
- const topN = "|JL"
- const leftN = "-7J"
- const bottomN = "|7F"
- const rightN = "-LF"
- const visited = new Set()
- function getNext(pos) {
- let type = map[pos.y][pos.x]
- if (topN.includes(type) && !visited.has(`${pos.x}-${pos.y - 1}`)) return { x: pos.x, y: pos.y - 1 }
- if (leftN.includes(type) && !visited.has(`${pos.x - 1}-${pos.y}`)) return { x: pos.x - 1, y: pos.y }
- if (bottomN.includes(type) && !visited.has(`${pos.x}-${pos.y + 1}`)) return { x: pos.x, y: pos.y + 1 }
- if (rightN.includes(type) && !visited.has(`${pos.x + 1}-${pos.y}`)) return { x: pos.x + 1, y: pos.y }
- }
- while (true) {
- visited.add(`${pos.x}-${pos.y}`)
- pos = getNext(pos)
- if (pos == undefined) break
- }
- part1 = visited.size / 2
- function countCrossings(inputString) {
- const matches = inputString.match(/\||L7|FJ/g)
- return matches ? matches.length : 0
- }
- map.forEach((row, y) => {
- let rowM = ""
- row.forEach((element, x) => {
- let poly = visited.has(`${x}-${y}`)
- if (poly && element != "-") rowM += element
- if (!poly && countCrossings(rowM) & 1) part2++
- })
- })
- let endTime = performance.now() - startTime
- console.log(`Part 1: ${part1}\nPart 2: ${part2}\nTimer: ${endTime} ms`)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement