Files
aoc/2024/11/index.ts
T
2024-12-11 15:30:15 +01:00

74 lines
1.8 KiB
TypeScript

import { sumArray } from '../../utils/array.ts';
import { MultiMap } from '../../utils/multi-map.ts';
export function solveFirstSlow(input: string): number {
const stones = input.split(' ');
for (let i = 0; i < 25; i++) {
let j = 0;
while (j < stones.length) {
const stone = stones[j];
if (stone === '0') {
stones[j] = '1';
j++;
continue;
}
if (stone.length % 2 === 0) {
const secondStone = stone.substring(stone.length / 2);
stones.splice(j + 1, 0, String(Number(secondStone)));
stones[j] = stone.substring(0, stone.length / 2);
j += 2;
continue;
}
stones[j] = String(Number(stone) * 2024);
j++;
}
}
return stones.length;
}
const lookup = new MultiMap<number, [number, string]>();
function splits(stone: string, times: number): number {
const lookedUp = lookup.multiGet(times, stone);
if (lookedUp !== undefined) {
return lookedUp;
}
if (times <= 0) {
const result = 1;
lookup.multiSet(result, times, stone);
return result;
}
if (stone === '0') {
const result = splits('1', times - 1);
lookup.multiSet(result, times, stone);
return result;
}
if (stone.length % 2 === 0) {
const secondStone = stone.substring(stone.length / 2);
const firstStone = stone.substring(0, stone.length / 2);
const result =
splits(firstStone, times - 1) +
splits(String(Number(secondStone)), times - 1);
lookup.multiSet(result, times, stone);
return result;
}
const result = splits(String(Number(stone) * 2024), times - 1);
lookup.multiSet(result, times, stone);
return result;
}
export function solve(input: string, iterations: number): number {
const stones = input.split(' ');
const count = stones.map((stone) => splits(stone, iterations));
return sumArray(count);
}