Skip to content

Instantly share code, notes, and snippets.

@amoilanen
Created December 20, 2020 20:43
Show Gist options
  • Save amoilanen/16a4a74e5621466f7263796e350ff31b to your computer and use it in GitHub Desktop.
Save amoilanen/16a4a74e5621466f7263796e350ff31b to your computer and use it in GitHub Desktop.
Solution in Typescript for Day 15 of Advent of Code 2020
interface NumberIndexes {
[key: number]: number;
}
const input: string = '0,13,1,16,6,17';
function withTimings<T>(f: () => T): T {
const startTime = new Date().getTime();
const result = f();
const endTime = new Date().getTime();
console.log(`Elapsed ${endTime - startTime}ms`);
return result;
}
// Parser
function parseStartingNumbers(input: string): number[] {
return input.split(',')
.map(x => parseInt(x, 10));
}
// Solution
function elementsWithIndexes(numbers: number[], preallocatedIndicesSize: number): number[] {
const indices = (new Array(preallocatedIndicesSize)) as Array<number>;
return numbers
.map((element, index) => [element, index])
.reduce((acc, [element, index]) => {
acc[element] = index;
return acc;
}, indices);
}
function nthPlayNumber(previousNumbers: Array<number>, n: number) {
const desiredIndex = n - 1;
let elementIndices = elementsWithIndexes(previousNumbers, n);
let currentIndex = previousNumbers.length - 1;
let currentNumber = previousNumbers[currentIndex];
while (currentIndex < desiredIndex) {
const currentNumberLastIndex = elementIndices[currentNumber];
elementIndices[currentNumber] = currentIndex;
currentNumber = (currentNumberLastIndex === undefined) ? 0 :
currentIndex - currentNumberLastIndex;
currentIndex++;
}
return currentNumber;
}
// Display numbers
const startingNumbers = parseStartingNumbers(input);
console.log("Part 1:")
console.log(
withTimings(
() =>
nthPlayNumber(startingNumbers, 2020)));
console.log("Part 2:")
console.log(
withTimings(
() =>
nthPlayNumber(startingNumbers, 30000000)));
//Part 1:
//Elapsed 0ms
//234
//Part 2:
//Elapsed 586ms
//8984
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment