1
1
enum Module {
2
2
case flip( String , [ Int ] , UInt8 )
3
- case conjunction( String , Int , [ Int ] , UInt64 )
3
+ case conjunction( String , [ Int ] , [ Int ] , UInt64 )
4
4
case broadcast( String , [ Int ] )
5
5
case other( String )
6
6
}
@@ -29,14 +29,24 @@ extension Module: CustomStringConvertible {
29
29
30
30
var stateString : String ? {
31
31
switch self {
32
- case . conjunction( _, let inputCount, _, let state) :
33
- String ( String ( state, radix: 2 ) . suffix ( inputCount) )
32
+ case . conjunction( _, let ik, _, let state) : _conjunctionString ( ik, state)
34
33
case . flip( _, _, let state) : state == 1 ? " 1 " : " 0 "
35
34
default : nil
36
35
}
37
36
}
38
37
}
39
38
39
+ func _conjunctionString( _ ik: [ Int ] , _ state: UInt64 ) -> String {
40
+ var result = [ Character] ( )
41
+ for (i, c) in Array ( String ( state, radix: 2 ) ) . reversed ( ) . enumerated ( ) {
42
+ if ik. firstIndex ( of: i) != nil {
43
+ result. append ( c)
44
+ }
45
+ }
46
+ return String ( result)
47
+ }
48
+
49
+
40
50
var modulesIndexToName : [ Int : String ] = [ : ]
41
51
var rxIndex : Int ?
42
52
let verbose = switch CommandLine . arguments. last {
@@ -46,7 +56,6 @@ let verbose = switch CommandLine.arguments.last {
46
56
default : 0
47
57
}
48
58
49
-
50
59
func readInput( ) -> [ Module ] {
51
60
let broadcast = " broadcaster "
52
61
@@ -56,7 +65,7 @@ func readInput() -> [Module] {
56
65
let name = String ( words. first!)
57
66
let partial : Module ? = switch line. first {
58
67
case " % " : . flip( " " , [ ] , 0 )
59
- case " & " : . conjunction( " " , 0 , [ ] , 0 )
68
+ case " & " : . conjunction( " " , [ ] , [ ] , 0 )
60
69
default : name == broadcast ? . broadcast( " " , [ ] ) : . other( name)
61
70
}
62
71
let outputs = Array ( words. dropFirst ( 1 ) . map { String ( $0) } )
@@ -93,11 +102,13 @@ func readInput() -> [Module] {
93
102
case . conjunction:
94
103
var state = UInt64 . max
95
104
let ins = inputs [ name] !
105
+ var ik = [ Int] ( )
96
106
for input in ins {
97
107
let k = keys. firstIndex ( of: input) !
108
+ ik. append ( k)
98
109
state ^= ( 1 << k)
99
110
}
100
- result. append ( . conjunction( name, ins . count , js!, state) )
111
+ result. append ( . conjunction( name, ik , js!, state) )
101
112
}
102
113
103
114
modulesIndexToName [ result. count - 1 ] = name
@@ -142,14 +153,14 @@ func propogate(pulse: Pulse, module: Module) -> ([Pulse], Module)? {
142
153
state = toggle ( state)
143
154
return ( emit ( state == 1 , outputs) , . flip( name, outputs, state) )
144
155
}
145
- case . conjunction( let name, let n , let outputs, var state) :
156
+ case . conjunction( let name, let ik , let outputs, var state) :
146
157
if pulse. value {
147
158
state |= ( 1 << pulse. from)
148
159
} else {
149
160
state &= ~ ( 1 << pulse. from)
150
161
}
151
162
let value = state != . max
152
- return ( emit ( value, outputs) , . conjunction( name, n , outputs, state) )
163
+ return ( emit ( value, outputs) , . conjunction( name, ik , outputs, state) )
153
164
}
154
165
}
155
166
@@ -206,8 +217,10 @@ func showPreamble(modules: [Module]) {
206
217
var names = [ String] ( )
207
218
for m in modules {
208
219
switch m {
209
- case . flip( let name, _, _) : names. append ( padn ( name, n: 2 ) )
210
- case . conjunction( let name, let n, _, _) : names. append ( padn ( name, n: max ( n + 1 , 2 ) ) )
220
+ case . flip( let name, _, _) :
221
+ names. append ( padn ( name, n: 2 ) )
222
+ case . conjunction( let name, let ik, _, _) :
223
+ names. append ( padn ( name, n: max ( ik. count + 1 , 2 ) ) )
211
224
default : continue
212
225
}
213
226
}
@@ -219,7 +232,7 @@ func show(modules: [Module]) {
219
232
if verbose > 1 {
220
233
print ( modules. map ( { $0. description } ) . joined ( separator: " · " ) )
221
234
} else if verbose > 0 {
222
- print ( modules. compactMap ( { $0. stateString } ) . joined ( separator: " · " ) )
235
+ print ( modules. compactMap ( { $0. stateString } ) . joined ( separator: " " ) )
223
236
}
224
237
}
225
238
0 commit comments