Skip to content

Commit 3bf0137

Browse files
committed
Tweak normal solution
1 parent bc69a77 commit 3bf0137

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

16.dxdy.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func energized(by beam: Beam) -> Int {
4646

4747
func trace(beam: Beam, visited: inout Set<Beam>) {
4848
var (beam, bt) = (beam, beam)
49+
4950
while isInBounds(beam) && !visited.contains(beam) {
5051
visited.insert(beam)
5152

16.swift

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ struct Beam: Hashable {
3232
}
3333
}
3434

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))
3737
}
3838

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))
4141
}
4242

4343
var reflectL: Beam { Beam(x: x - 1, y: y, d: .l) }
@@ -57,35 +57,39 @@ func trace(beam: Beam, visited: inout Set<Beam>) {
5757
return
5858
}
5959

60-
var beam = beam
61-
var next: [Beam]?
60+
var (beam, bt) = (beam, beam)
61+
var next: [Beam] = []
6262

63-
while isInBounds(beam) && next == nil {
63+
while isInBounds(beam) {
6464
visited.insert(beam)
6565

6666
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)
6973
case .fslash:
7074
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
7579
}
7680
case .bslash:
7781
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
8286
}
8387
default:
8488
beam = beam.step
8589
}
8690
}
8791

88-
next?.filter(isInBounds).forEach { trace(beam: $0, visited: &visited) }
92+
next.filter(isInBounds).forEach { trace(beam: $0, visited: &visited) }
8993
}
9094

9195
func isInBounds(_ beam: Beam) -> Bool {

0 commit comments

Comments
 (0)