diff --git a/2021/swift/day-12.swift b/2021/swift/day-12.swift index 915ea88..9c243f0 100644 --- a/2021/swift/day-12.swift +++ b/2021/swift/day-12.swift @@ -2,7 +2,7 @@ import Foundation let filename = "../input/day-12.in" -func search(_ root: String, _ adj: [String: [String]], _ history: Set, _ acc: [String]) -> [String] { +func search(_ root: String, _ adj: [String: [String]], _ history: Set, _ acc: [String], _ allow: String? = nil) -> [String] { let paths = acc.map { input in var next = input @@ -20,13 +20,26 @@ func search(_ root: String, _ adj: [String: [String]], _ history: Set, _ continue } - if node.lowercased() == node { - visited.insert(node) + if allow == nil { + if node.lowercased() == node { + visited.insert(node) + } + + let localResult = search(node, adj, visited, paths) + + result.append(contentsOf: localResult) + } else { + if node == allow { + let localResult = search(node, adj, visited, paths) + result.append(contentsOf: localResult) + } else { + if node.lowercased() == node { + visited.insert(node) + } + let localResult = search(node, adj, visited, paths, allow) + result.append(contentsOf: localResult) + } } - - let localResult = search(node, adj, visited, paths) - - result.append(contentsOf: localResult) } return result @@ -53,6 +66,19 @@ func main() { let partOne = search("start", adj, Set(), ["start"]) print("Part one:", partOne.count) + + let smallCaves = adj.keys.filter { $0.lowercased() == $0 }.filter { $0 != "start" } + + var partTwo = Set() + + for cave in smallCaves { + let result = search("start", adj, Set(), ["start"], cave) + + partTwo.formUnion(result) + } + + print("Part two:", partTwo.count) + } catch { print(error) }