@@ -32,12 +32,12 @@ struct Beam: Hashable {
32
32
}
33
33
}
34
34
35
- var hsplit : [ Beam ] {
36
- [ Beam ( x: x - 1 , y: y, d: . l) , Beam ( x: x + 1 , y: y, d: . r) ]
35
+ var hsplit : ( Beam , Beam ) {
36
+ ( Beam ( x: x - 1 , y: y, d: . l) , Beam ( x: x + 1 , y: y, d: . r) )
37
37
}
38
38
39
- var vsplit : [ Beam ] {
40
- [ Beam ( x: x, y: y - 1 , d: . u) , Beam ( x: x, y: y + 1 , d: . d) ]
39
+ var vsplit : ( Beam , Beam ) {
40
+ ( Beam ( x: x, y: y - 1 , d: . u) , Beam ( x: x, y: y + 1 , d: . d) )
41
41
}
42
42
43
43
var reflectL : Beam { Beam ( x: x - 1 , y: y, d: . l) }
@@ -57,35 +57,39 @@ func trace(beam: Beam, visited: inout Set<Beam>) {
57
57
return
58
58
}
59
59
60
- var beam = beam
61
- var next : [ Beam ] ?
60
+ var ( beam, bt ) = ( beam, beam )
61
+ var next : [ Beam ] = [ ]
62
62
63
- while isInBounds ( beam) && next == nil {
63
+ while isInBounds ( beam) {
64
64
visited. insert ( beam)
65
65
66
66
switch item ( at: beam) {
67
- case . vbar where beam. isHorizontal: next = beam. vsplit
68
- case . hbar where beam. isVertical: next = beam. hsplit
67
+ case . vbar where beam. isHorizontal:
68
+ ( beam, bt) = beam. vsplit
69
+ next. append ( bt)
70
+ case . hbar where beam. isVertical:
71
+ ( beam, bt) = beam. hsplit
72
+ next. append ( bt)
69
73
case . fslash:
70
74
switch beam. d {
71
- case . l: next = [ beam. reflectD]
72
- case . r: next = [ beam. reflectU]
73
- case . u: next = [ beam. reflectR]
74
- case . d: next = [ beam. reflectL]
75
+ case . l: beam = beam. reflectD
76
+ case . r: beam = beam. reflectU
77
+ case . u: beam = beam. reflectR
78
+ case . d: beam = beam. reflectL
75
79
}
76
80
case . bslash:
77
81
switch beam. d {
78
- case . l: next = [ beam. reflectU]
79
- case . r: next = [ beam. reflectD]
80
- case . u: next = [ beam. reflectL]
81
- case . d: next = [ beam. reflectR]
82
+ case . l: beam = beam. reflectU
83
+ case . r: beam = beam. reflectD
84
+ case . u: beam = beam. reflectL
85
+ case . d: beam = beam. reflectR
82
86
}
83
87
default :
84
88
beam = beam. step
85
89
}
86
90
}
87
91
88
- next? . filter ( isInBounds) . forEach { trace ( beam: $0, visited: & visited) }
92
+ next. filter ( isInBounds) . forEach { trace ( beam: $0, visited: & visited) }
89
93
}
90
94
91
95
func isInBounds( _ beam: Beam ) -> Bool {
0 commit comments