Created
December 15, 2020 13:29
-
-
Save warriordog/8eb6e0eb19d191af162b915fc1c6ba52 to your computer and use it in GitHub Desktop.
Solution to Advent of Code 2020 Day 15 in JavaScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const input = [ 6, 4, 12, 1, 20, 0, 16 ]; | |
function part1(debug) { | |
const memory = Array.from(input); | |
for (let i = input.length; i < 2020; i++) { | |
const lastNumber = memory[memory.length - 1]; | |
const lastNumberIndex = memory.lastIndexOf(lastNumber, memory.length - 1); | |
const lastNumberLastIndex = memory.lastIndexOf(lastNumber, lastNumberIndex - 1); | |
if (lastNumberLastIndex >= 0) { | |
// number has been seen before | |
memory.push(lastNumberIndex - lastNumberLastIndex); | |
} else { | |
// number has never been seen before | |
memory.push(0); | |
} | |
if (debug !== undefined) { | |
console.log(`Iteration ${ i + 1 - input.length }: index=${ i } this=${ memory[i] } last=${ lastNumber } index(last)=${ lastNumberIndex } index-1(last)=${ lastNumberLastIndex }`); | |
} | |
} | |
return memory[memory.length - 1]; | |
} | |
function part2(debug) { | |
/** @type {Map<number, number>} */ | |
const memory = new Map(); | |
input.forEach((n, i) => memory.set(n, i)); | |
let lastNumber = input[input.length - 1]; | |
let lastNumberIndex = input.length - 1; | |
let lastNumberLastIndex = undefined; | |
for (let i = input.length; i < 30000000; i++) { | |
let thisNumber; | |
if (lastNumberLastIndex !== undefined) { | |
// number has been seen before | |
thisNumber = lastNumberIndex - lastNumberLastIndex; | |
} else { | |
// number has never been seen before | |
thisNumber = 0; | |
} | |
if (debug !== undefined) { | |
console.log(`Iteration ${ i + 1 - input.length }: index=${ i } this=${ memory[i] } last=${ lastNumber } index(last)=${ lastNumberIndex } index-1(last)=${ lastNumberLastIndex }`); | |
} | |
lastNumber = thisNumber; | |
lastNumberIndex = i; | |
lastNumberLastIndex = memory.get(thisNumber); | |
memory.set(thisNumber, i); | |
} | |
return lastNumber; | |
} | |
const part1answer = part1(); | |
console.log(`Part 1: The 2020th number spoken is ${ part1answer }`); | |
const part2answer = part2(); | |
console.log(`Part 2: The 30000000th number spoken is ${ part2answer }`); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment