Solve 2024-07
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import { sumBy } from '../../utils/array.ts';
|
||||
|
||||
export function solveFirst(input: string): number {
|
||||
const regex = /^(\d*): (.*)$/gm;
|
||||
const match = input.matchAll(regex);
|
||||
|
||||
const rows = Array.from(match, (m) => ({
|
||||
sum: Number(m[1]),
|
||||
digits: m[2].split(' ').map((n) => Number(n))
|
||||
}));
|
||||
|
||||
const possible = rows.filter((r) => {
|
||||
for (let t = 0; t < Math.pow(2, r.digits.length - 1); t++) {
|
||||
const sol = r.digits.reduce((sum, curr, i) =>
|
||||
evalTry(t, i, sum + curr, sum * curr)
|
||||
);
|
||||
if (sol === r.sum) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
// console.log(possible);
|
||||
return sumBy(possible, (p) => p.sum);
|
||||
}
|
||||
|
||||
export function evalTry<T>(t: number, index: number, ...choices: T[]): T {
|
||||
const base = choices.length;
|
||||
const choice = Math.max(0, Math.floor(t / Math.pow(base, index - 1)) % base);
|
||||
|
||||
return choices[choice];
|
||||
}
|
||||
|
||||
export function solveSecond(input: string): number {
|
||||
const regex = /^(\d*): (.*)$/gm;
|
||||
const match = input.matchAll(regex);
|
||||
|
||||
const rows = Array.from(match, (m) => ({
|
||||
sum: Number(m[1]),
|
||||
digits: m[2].split(' ').map((n) => Number(n))
|
||||
}));
|
||||
|
||||
const possible = rows.filter((r) => {
|
||||
for (let t = 0; t < Math.pow(3, r.digits.length - 1); t++) {
|
||||
const sol = r.digits.reduce((sum, curr, i) =>
|
||||
evalTry(t, i, sum * curr, sum + curr, Number(`${sum}${curr}`))
|
||||
);
|
||||
if (sol === r.sum) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// console.log(possible);
|
||||
return sumBy(possible, (p) => p.sum);
|
||||
}
|
||||
Reference in New Issue
Block a user