58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
const sample = await Deno.readTextFile("sample.txt");
|
|
const input = await Deno.readTextFile("input.txt");
|
|
|
|
const parseInputData1 = (data: string): [number, number][] => {
|
|
const lines = data.trim().split("\n").filter(Boolean);
|
|
const [times, distances] = lines
|
|
.map((line) =>
|
|
line
|
|
.split(/:\ +/)[1]
|
|
.split(/\ +/)
|
|
.map(Number)
|
|
);
|
|
return times.map((time, i) => [time, distances[i]]);
|
|
};
|
|
|
|
const solvePart1 = (data: string): number => {
|
|
const races = parseInputData1(data);
|
|
|
|
return races
|
|
.map(([time, distance]) =>
|
|
Array.from(new Array(time), (_, i) => i).map((
|
|
t,
|
|
) => [distance, t * (time - t)])
|
|
.filter(([distance, total]) => total > distance)
|
|
).map((winingRaces) => winingRaces.length)
|
|
.reduce((s, v) => s * v);
|
|
};
|
|
|
|
console.log("Sample:", solvePart1(sample)); // 286
|
|
console.log("Input", solvePart1(input)); // 227850
|
|
|
|
const parseInputData2 = (data: string): [number, number] => {
|
|
const lines = data.trim().split("\n").filter(Boolean);
|
|
const [time, distance] = lines
|
|
.map((line) =>
|
|
Number(line
|
|
.split(/:\ +/)[1]
|
|
.replace(/\ +/g, ''))
|
|
);
|
|
return [time, distance]
|
|
};
|
|
|
|
|
|
const solvePart2 = (data: string): number => {
|
|
const [time, distance] = parseInputData2(data);
|
|
let result = 0;
|
|
|
|
for (let t = 0; t < time ; t += 1) {
|
|
const total = t * (time - t)
|
|
if (total > distance) result++
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
console.log("Sample:", solvePart2(sample)); // 71503
|
|
console.log("Input", solvePart2(input)); // 42948149
|