Skip to content

Commit 19dd000

Browse files
committed
refactor
1 parent 7668d08 commit 19dd000

File tree

1 file changed

+33
-48
lines changed

1 file changed

+33
-48
lines changed

src/2025/day10.js

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,71 @@
11
import { memoize } from "../utils/memoize.js";
22

3-
// Helper function to generate all combinations
4-
function* product(...arrays) {
3+
function* product(arrays) {
54
if (arrays.length === 0) yield [];
65
else {
7-
const [head, ...tail] = arrays;
8-
for (const item of head) {
9-
for (const rest of product(...tail)) {
10-
yield [item, ...rest];
11-
}
6+
let [head, ...tail] = arrays;
7+
for (let item of head) {
8+
for (let rest of product(tail)) yield [item, ...rest];
129
}
1310
}
1411
}
1512

1613
function parse(input) {
17-
let parseTuple = str => str.slice(1, -1).split(",").map(Number);
18-
let machines = input.split("\n").map(line => {
19-
const parts = line.split(" ");
20-
const dia = Array.from(parts[0].slice(1, -1)).map(c => (c === "#" ? 1 : 0));
21-
const buttons = parts.slice(1, -1).map(x => parseTuple(x));
22-
const jolts = parseTuple(parts[parts.length - 1]);
23-
return { dia, buttons, jolts };
14+
return input.split("\n").map(line => {
15+
let parts = line.replaceAll(/[[\](){}]/g, "").split(" ");
16+
let indicator = parts[0].replace(/./g, c => (c === "#" ? 1 : 0));
17+
let buttons = parts.map(x => x.split(",").map(Number));
18+
let jolts = parts.at(-1).split(",").map(Number);
19+
return { indicator, buttons, jolts };
2420
});
25-
return machines;
2621
}
2722

28-
function producePatterns(buttons, jolts) {
29-
const ops = {},
30-
patterns = {};
31-
for (const pressed of product(...Array(buttons.length).fill([0, 1]))) {
32-
const jolt = Array(jolts.length).fill(0);
23+
function producePatterns(buttons, length) {
24+
let patterns = {};
25+
for (let pressed of product(Array(buttons.length).fill([0, 1]))) {
26+
let lights = Array(length).fill(0);
3327
for (let i = 0; i < pressed.length; i++) {
34-
if (pressed[i]) {
35-
for (const j of buttons[i]) jolt[j] += pressed[i];
36-
}
28+
if (pressed[i]) for (let j of buttons[i]) lights[j] = lights[j] ? 0 : 1;
3729
}
38-
const lights = jolt.map(x => x % 2);
39-
const key = JSON.stringify(pressed);
40-
const lightsKey = JSON.stringify(lights);
41-
ops[key] = jolt;
42-
if (!patterns[lightsKey]) patterns[lightsKey] = [];
43-
patterns[lightsKey].push(pressed);
30+
let key = lights.join("");
31+
patterns[key] = [...(patterns[key] || []), pressed];
4432
}
45-
return { ops, patterns };
33+
return patterns;
4634
}
4735

4836
export function part1(input) {
4937
let machines = parse(input);
5038
let p1 = 0;
51-
for (const { dia, buttons, jolts } of machines) {
52-
const { patterns } = producePatterns(buttons, jolts);
53-
const diaKey = JSON.stringify(dia);
54-
p1 += Math.min(...patterns[diaKey].map(x => x.reduce((a, b) => a + b, 0)));
39+
for (let { indicator, buttons } of machines) {
40+
let patterns = producePatterns(buttons, indicator.length);
41+
let sums = patterns[indicator].map(x => x.reduce((a, b) => a + b, 0));
42+
p1 += Math.min(...sums);
5543
}
5644
return p1;
5745
}
5846

5947
export function part2(input) {
60-
let p2 = 0;
6148
let machines = parse(input);
62-
63-
for (const { buttons, jolts } of machines) {
64-
const { ops, patterns } = producePatterns(buttons, jolts);
65-
49+
let p2 = 0;
50+
for (let { buttons, jolts } of machines) {
51+
let patterns = producePatterns(buttons, jolts.length);
6652
let presses = memoize(target => {
6753
if (target.every(x => x === 0)) return 0;
6854
if (target.some(x => x < 0)) return Infinity;
6955

70-
const lights = target.map(x => x % 2);
71-
const lightsKey = JSON.stringify(lights);
72-
if (!patterns[lightsKey]) return Infinity;
73-
7456
let total = Infinity;
75-
for (const pressed of patterns[lightsKey]) {
76-
const diff = ops[JSON.stringify(pressed)];
77-
const newTarget = diff.map((a, i) => (target[i] - a) / 2);
78-
const sum = pressed.reduce((a, b) => a + b, 0);
57+
let options = patterns[target.map(x => x % 2).join("")] || [];
58+
for (let pressed of options) {
59+
let jolt = Array(jolts.length).fill(0);
60+
for (let i = 0; i < pressed.length; i++) {
61+
if (pressed[i]) for (let j of buttons[i]) jolt[j] += pressed[i];
62+
}
63+
let newTarget = jolt.map((a, i) => (target[i] - a) / 2);
64+
let sum = pressed.reduce((a, b) => a + b, 0);
7965
total = Math.min(total, sum + 2 * presses(newTarget));
8066
}
8167
return total;
8268
});
83-
8469
p2 += presses(jolts);
8570
}
8671
return p2;

0 commit comments

Comments
 (0)