Compare commits
2 Commits
f3039370f9
...
b6e4b27c7b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6e4b27c7b | ||
|
|
8f6ca57372 |
@@ -4,34 +4,48 @@ const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
|
|||||||
|
|
||||||
let stones: Array<string> = input.slice(0, -1).split(' ');
|
let stones: Array<string> = input.slice(0, -1).split(' ');
|
||||||
|
|
||||||
|
const countMap: { [key: string]: Array<number> } = {};
|
||||||
|
|
||||||
let sum = 0;
|
let sum = 0;
|
||||||
|
|
||||||
function splitStones(stones: Array<string>) {
|
function getCountAfter(stone: string, blink: number, prev: Array<string> = []): number {
|
||||||
const newStones: Array<string> = [];
|
const nextStep = blink - 1;
|
||||||
stones.forEach((stone) => {
|
if (countMap[stone]) {
|
||||||
if (stone === '0') {
|
if (countMap[stone][nextStep]) {
|
||||||
newStones.push('1');
|
return countMap[stone][nextStep];
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
countMap[stone] = [];
|
||||||
|
}
|
||||||
|
let newStones: Array<string>;
|
||||||
|
if (stone === '0') {
|
||||||
|
newStones = ['1'];
|
||||||
|
} else {
|
||||||
const len = stone.length;
|
const len = stone.length;
|
||||||
if (len % 2 === 0) {
|
if (len % 2 === 0) {
|
||||||
newStones.push(stone.slice(0, len / 2));
|
|
||||||
let last = stone.slice(len / 2);
|
let last = stone.slice(len / 2);
|
||||||
newStones.push(''+(parseInt(last)));
|
newStones = [stone.slice(0, len / 2), ''+parseInt(last)];
|
||||||
return;
|
} else {
|
||||||
|
newStones = [''+(parseInt(stone) * 2024)];
|
||||||
}
|
}
|
||||||
newStones.push(''+(parseInt(stone) * 2024));
|
}
|
||||||
|
const len = newStones.length;
|
||||||
|
countMap[stone][0] = len;
|
||||||
|
if (blink === 1) {
|
||||||
|
return len;
|
||||||
|
} else {
|
||||||
|
const newPrev = [...prev, stone];
|
||||||
|
const len = newStones.reduce((carry, newStone) => carry + getCountAfter(newStone, nextStep, newPrev), 0);
|
||||||
|
countMap[stone][nextStep] = len;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const blinks = 75;
|
||||||
|
|
||||||
|
stones.forEach((stone) => {
|
||||||
|
sum += getCountAfter(stone, blinks);
|
||||||
});
|
});
|
||||||
return newStones;
|
|
||||||
}
|
|
||||||
|
|
||||||
let newStones = stones;
|
console.log(sum);
|
||||||
|
|
||||||
const blinks = 25;
|
|
||||||
|
|
||||||
for (let i = 0; i < blinks; i++) {
|
|
||||||
newStones = splitStones(newStones);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(newStones.length);
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user