@@ -2,7 +2,6 @@ import Algorithms
22
33struct Report {
44 var value : [ Int ]
5-
65}
76extension Report {
87 init ( _ data: Substring ) {
@@ -14,6 +13,16 @@ func spreadsWell(_ value: Int) -> Bool {
1413 abs ( value) <= 3 && abs ( value) >= 1
1514}
1615
16+ func getPermutationsExcludingOneElement( _ arr: [ Int ] ) -> [ [ Int ] ] {
17+ var perms = [ [ Int] ] ( )
18+ for idx in 0 ..< arr. count {
19+ var copiedArr = arr
20+ let _ = copiedArr. remove ( at: idx)
21+ perms. append ( copiedArr)
22+ }
23+ return perms
24+ }
25+
1726struct ReportAnalyzer {
1827
1928 func isSafe( report: Report , damped: Bool = false ) -> Bool {
@@ -33,25 +42,14 @@ struct ReportAnalyzer {
3342 let spread = diffs. filter { spreadsWell ( $0) }
3443
3544 let isSafe = order. count == 1 && spread. count == diffs. count
36- if damped {
37-
38- let orderIsOffByOne =
39- order. count == 2
40- && ( order [ " desc " , default: [ ] ] . count == 1 || order [ " asc " , default: [ ] ] . count == 1 )
41- // let spreadIsOffByOne = spread.count == diffs.count - 1
42- let spreadDefect = diffs. firstIndex { spreadsWell ( $0) == false }
43- if let defect = spreadDefect {
44- print ( defect, report. value)
45- return ReportAnalyzer ( ) . isSafe (
46- report: Report (
47- value: report. value. filter {
48- $0 == report. value [ defect + 1 ]
49- } ) )
50- }
51- // print("\(report): safe (\(isSafe)) order (\(orderIsOffByOne)) spread (\(spreadIsOffByOne))")
52- return isSafe || orderIsOffByOne
45+ if damped && !isSafe {
46+ let reportPermutations = getPermutationsExcludingOneElement ( report. value)
47+ let isAnySafe =
48+ reportPermutations. map {
49+ return ReportAnalyzer ( ) . isSafe ( report: Report ( value: Array ( $0) ) )
50+ } . filter { $0 } . count >= 1
51+ return isAnySafe
5352 }
54-
5553 return isSafe
5654 }
5755}
@@ -70,6 +68,5 @@ struct Day02: AdventDay {
7068
7169 func part2( ) -> Int {
7270 reports. map { ReportAnalyzer ( ) . isSafe ( report: $0, damped: true ) } . filter { $0 } . count
73-
7471 }
7572}
0 commit comments