@@ -167,37 +167,39 @@ const resetModules = (modules: Record<string, Module>) => {
167
167
const part2 = ( rawInput : string ) => {
168
168
const modules = parseInput ( rawInput ) ;
169
169
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" } ) ;
184
183
185
- while ( queue . length ) {
186
- const pulse = queue . shift ( ) ;
184
+ while ( queue . length ) {
185
+ const pulse = queue . shift ( ) ;
187
186
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
+ }
191
195
192
- const module = modules [ pulse . to ] ;
196
+ const module = modules [ pulse . to ] ;
193
197
194
- if ( module ) {
195
- queue . push ( ...handleModulePulse ( module , pulse ) ) ;
196
- }
197
- }
198
+ if ( module ) {
199
+ queue . push ( ...handleModulePulse ( module , pulse ) ) ;
198
200
}
199
- } )
200
- . reduce ( lcm , 1 ) ;
201
+ }
202
+ }
201
203
} ;
202
204
203
205
run ( {
0 commit comments