From 9ae4e6d3fa866ead1e6188c588063ecca583a6ad Mon Sep 17 00:00:00 2001 From: Joseph Chamochumbi Date: Wed, 9 Nov 2022 17:38:00 +0100 Subject: [PATCH] feat: 2021 day 12, part two with Swift --- 2021/swift/day-12.swift | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) 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) }