advent-of-code-2020/solutions/day8/solution.js
Joshua Seigler ebae5e968d Day 8
2020-12-08 01:01:53 -05:00

55 lines
1.4 KiB
JavaScript

const path = require('path')
const { read, position } = require('promise-path')
const fromHere = position(__dirname)
const report = (...messages) => console.log(`[${require(fromHere('../../package.json')).logName} / ${__dirname.split(path.sep).pop()}]`, ...messages)
async function run () {
const input = (await read(fromHere('input.txt'), 'utf8')).trim().split('\n').map(l => /(\w+) (.+)/.exec(l).slice(1))
await solveForFirstStar(input)
await solveForSecondStar(input)
}
function execute (input) {
let pointer = 0; let accumulator = 0
let clean = true
const counts = Array(input.length).fill(0)
const ops = {
nop: () => { pointer++ },
acc: x => { accumulator += x; pointer++ },
jmp: x => { pointer += x }
}
while (pointer < input.length) {
const [op, x] = input[pointer]
counts[pointer]++
if (counts.includes(2)) {
clean = false
break
}
ops[op](1 * x)
}
return { accumulator, clean }
}
function solveForFirstStar (input) {
report('Solution 1:', execute(input).accumulator)
}
async function solveForSecondStar (input) {
const swaps = []
input.forEach(([op, offset], index) => {
if (op === 'nop' || op === 'jmp') {
const swap = input.slice()
swap[index] = [op === 'nop' ? 'jmp' : 'nop', offset]
swaps.push(swap)
}
})
for (const swap of swaps) {
const result = execute(swap)
if (result.clean) {
report('Solution 2:', result.accumulator)
}
}
}
run()