AoC/2015/Day9.playground/Contents.swift

70 lines
1.9 KiB
Swift
Raw Normal View History

2022-11-23 16:45:30 +01:00
var input: [(from: String, to: String, distance: Int)] = [
("Tristram", "AlphaCentauri", 34),
("Tristram", "Snowdin", 100),
("Tristram", "Tambi", 63),
("Tristram", "Faerun", 108),
("Tristram", "Norrath", 111),
("Tristram", "Straylight", 89),
("Tristram", "Arbre", 132),
("AlphaCentauri", "Snowdin", 4),
("AlphaCentauri", "Tambi", 79),
("AlphaCentauri", "Faerun", 44),
("AlphaCentauri", "Norrath", 147),
("AlphaCentauri", "Straylight", 133),
("AlphaCentauri", "Arbre", 74),
("Snowdin", "Tambi", 105),
("Snowdin", "Faerun", 95),
("Snowdin", "Norrath", 48),
("Snowdin", "Straylight", 88),
("Snowdin", "Arbre", 7),
("Tambi", "Faerun", 68),
("Tambi", "Norrath", 134),
("Tambi", "Straylight", 107),
("Tambi", "Arbre", 40),
("Faerun", "Norrath", 11),
("Faerun", "Straylight", 66),
("Faerun", "Arbre", 144),
("Norrath", "Straylight", 115),
("Norrath", "Arbre", 135),
("Straylight", "Arbre", 127),
]
var distances: [String: [String: Int]] = input.reduce(into: [:]) { result, input in
let (from, to, distance) = input
result[from, default: [:]][to] = distance
result[to, default: [:]][from] = distance
}
func totalDistance(route: [String]) -> Int {
var distance = 0
var current = route[0]
for place in route.dropFirst() {
distance += distances[current]![place]!
current = place
}
return distance
}
func combinations(_ s: Set<String>) -> [[String]] {
if s.count <= 2 {
return [Array(s)]
}
return s.reduce([]) { result, first in
let rest = s.subtracting([first])
return result + combinations(rest).map { sub in
var result = [first]
result.append(contentsOf: sub)
return result
}
}
}
combinations(Set(distances.keys))
.map { totalDistance(route: $0) }
.max()