Skip to content

Commit fa1440d

Browse files
committed
refactor(2025/day/10): separate masks from parsing
1 parent 3ffdcfe commit fa1440d

2 files changed

Lines changed: 25 additions & 23 deletions

File tree

2025/day/10/manuals.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export function parseManual(text: string) {
2+
return text.split("\n").map((line) => {
3+
const [lightsText, ...rest] = line.split(" ");
4+
const lights = lightsText.slice(1, -1);
5+
const buttons = rest.slice(0, -1)
6+
.map((text) => text.slice(1, -1).split(",").map(Number));
7+
const requirements = rest.at(-1)!.slice(1, -1).split(",").map(Number);
8+
return { lights, buttons, requirements };
9+
});
10+
}

2025/day/10/part/1/solve.ts

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
11
import subsets from "@lib/subsets.ts";
2+
import { parseManual } from "../../manuals.ts";
23

34
export default function solve(input: string) {
4-
const lines = input.split("\n").map((line) => {
5-
const [lightsText, ...rest] = line.split(" ");
6-
const lights = +`0b${
7-
Array.from(lightsText.slice(1, -1), (c) => (c === "#" ? "1" : "0"))
8-
.reverse().join("")
9-
}`;
10-
const buttons = rest.slice(0, -1)
11-
.map((text) =>
12-
text.slice(1, -1).split(",").map(Number)
13-
.reduce((sum, n) => sum + 2 ** n, 0)
14-
);
15-
const requirements = rest.at(-1)!.slice(1, -1).split(",").map(Number);
16-
return { lights, buttons, requirements };
17-
});
5+
const manual = parseManual(input);
186
let sum = 0;
19-
for (const { lights, buttons } of lines) {
20-
let min = Infinity;
21-
for (const presses of subsets(new Set(buttons))) {
22-
if (presses.size >= min) continue;
23-
let actual = 0;
24-
for (const press of presses) actual ^= press;
25-
if (actual !== lights) continue;
26-
min = presses.size;
7+
for (const { lights, buttons } of manual) {
8+
const lightsMask = Array.from(lights, (c, i) => (c === "#" ? 1 << i : 0))
9+
.reduce((mask, bit) => mask | bit, 0);
10+
const buttonMasks = buttons.map((indices) =>
11+
indices.reduce((mask, i) => mask | (1 << i), 0)
12+
);
13+
let minPresses = Infinity;
14+
for (const presses of subsets(new Set(buttonMasks))) {
15+
if (presses.size >= minPresses) continue;
16+
let pressMask = 0;
17+
for (const mask of presses) pressMask ^= mask;
18+
if (pressMask === lightsMask) minPresses = presses.size;
2719
}
28-
sum += min;
20+
sum += minPresses;
2921
}
3022
return sum;
3123
}

0 commit comments

Comments
 (0)