Skip to content

Commit 1404fe9

Browse files
Refactor day 20
1 parent 447de2f commit 1404fe9

File tree

2 files changed

+30
-28
lines changed

2 files changed

+30
-28
lines changed

aoc2023/.aocrunner.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,13 @@
315315
"solved": true,
316316
"result": "925955316",
317317
"attempts": [],
318-
"time": 11.7628
318+
"time": 11.8734
319319
},
320320
"part2": {
321321
"solved": true,
322322
"result": "241528477694627",
323323
"attempts": [],
324-
"time": 118.3545
324+
"time": 34.7705
325325
}
326326
},
327327
{

aoc2023/src/day20/index.ts

+28-26
Original file line numberDiff line numberDiff line change
@@ -167,37 +167,39 @@ const resetModules = (modules: Record<string, Module>) => {
167167
const part2 = (rawInput: string) => {
168168
const modules = parseInput(rawInput);
169169

170-
const lastModule =
171-
modules[
172-
Object.keys(modules).find((key) => modules[key].outputIds.includes("rx"))
173-
];
174-
175-
return lastModule.inputIds
176-
.map((subSectionId) => {
177-
resetModules(modules);
178-
let queue: Pulse[] = [];
179-
180-
let buttonPushes = 0;
181-
while (true) {
182-
buttonPushes++;
183-
queue.push({ from: "button", strength: "low", to: "broadcaster" });
170+
const cycleInterval = modules[
171+
Object.keys(modules).find((key) => modules[key].outputIds.includes("rx"))
172+
].inputIds.reduce(
173+
(prev, id) => ({ ...prev, [id]: 0 }),
174+
{} as Record<string, number>
175+
);
176+
177+
let queue: Pulse[] = [];
178+
179+
let buttonPresses = 0;
180+
while (true) {
181+
buttonPresses++;
182+
queue.push({ from: "button", strength: "low", to: "broadcaster" });
184183

185-
while (queue.length) {
186-
const pulse = queue.shift();
184+
while (queue.length) {
185+
const pulse = queue.shift();
187186

188-
if (pulse.to === subSectionId && pulse.strength === "low") {
189-
return buttonPushes;
190-
}
187+
if (pulse.strength === "low" && cycleInterval[pulse.to] === 0) {
188+
cycleInterval[pulse.to] = buttonPresses;
189+
if (!Object.keys(cycleInterval).some((k) => cycleInterval[k] === 0)) {
190+
return Object.keys(cycleInterval)
191+
.map((k) => cycleInterval[k])
192+
.reduce(lcm, 1);
193+
}
194+
}
191195

192-
const module = modules[pulse.to];
196+
const module = modules[pulse.to];
193197

194-
if (module) {
195-
queue.push(...handleModulePulse(module, pulse));
196-
}
197-
}
198+
if (module) {
199+
queue.push(...handleModulePulse(module, pulse));
198200
}
199-
})
200-
.reduce(lcm, 1);
201+
}
202+
}
201203
};
202204

203205
run({

0 commit comments

Comments
 (0)