Skip to content

Instantly share code, notes, and snippets.

@warriordog
Created December 15, 2020 13:29
Show Gist options
  • Save warriordog/8eb6e0eb19d191af162b915fc1c6ba52 to your computer and use it in GitHub Desktop.
Save warriordog/8eb6e0eb19d191af162b915fc1c6ba52 to your computer and use it in GitHub Desktop.
Solution to Advent of Code 2020 Day 15 in JavaScript
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