@@ -37,12 +37,14 @@ extension Module: CustomStringConvertible {
37
37
}
38
38
39
39
var modulesIndexToName : [ Int : String ] = [ : ]
40
- var verbose = switch CommandLine . arguments. last {
40
+ var rxIndex : Int ?
41
+ let verbose = switch CommandLine . arguments. last {
41
42
case " -v " : 1
42
43
case " -vv " : 2
43
44
default : 0
44
45
}
45
46
47
+
46
48
func readInput( ) -> [ Module ] {
47
49
let broadcast = " broadcaster "
48
50
@@ -96,6 +98,9 @@ func readInput() -> [Module] {
96
98
}
97
99
98
100
modulesIndexToName [ result. count - 1 ] = name
101
+ if name == " rx " {
102
+ rxIndex = result. count - 1
103
+ }
99
104
}
100
105
101
106
return result
@@ -145,9 +150,10 @@ func propogate(pulse: Pulse, module: Module) -> ([Pulse], Module)? {
145
150
}
146
151
}
147
152
148
- func simulate( modules: inout [ Module ] ) -> Int {
153
+ func simulate( modules: inout [ Module ] ) -> ( Int , Int ) {
149
154
let buttonPress = Pulse ( value: false , from: - 1 , to: 0 )
150
155
156
+
151
157
var ( ct, cf) = ( 0 , 0 )
152
158
func count( _ pulse: Pulse ) {
153
159
if ( verbose > 1 ) {
@@ -158,7 +164,8 @@ func simulate(modules: inout [Module]) -> Int {
158
164
}
159
165
160
166
var n = 0
161
- while n < 1000 {
167
+ var rxn : Int ? = rxIndex == nil ? 0 : nil
168
+ while n < 1000 || rxn == nil {
162
169
n += 1
163
170
show ( modules: modules)
164
171
@@ -169,6 +176,10 @@ func simulate(modules: inout [Module]) -> Int {
169
176
count ( pulse)
170
177
pi += 1
171
178
179
+ if ( pulse. to == rxIndex && !pulse. value) {
180
+ rxn = n
181
+ }
182
+
172
183
let module = modules [ pulse. to]
173
184
if let ( pulses, newModule) = propogate ( pulse: pulse, module: module) {
174
185
modules [ pulse. to] = newModule
@@ -180,7 +191,7 @@ func simulate(modules: inout [Module]) -> Int {
180
191
if verbose > 0 {
181
192
print ( " counts " , ct, cf)
182
193
}
183
- return ct * cf
194
+ return ( ct * cf, rxn ?? 0 )
184
195
}
185
196
186
197
func show( modules: [ Module ] ) {
0 commit comments