44 lines
1.3 KiB
Swift
44 lines
1.3 KiB
Swift
import Foundation
|
|
|
|
typealias Network = [String: Set<String>]
|
|
|
|
func readInput(_ filePath: String) throws -> Network {
|
|
var map: Network = [:]
|
|
try String(contentsOfFile: filePath, encoding: .ascii)
|
|
.split(separator: "\n").map { $0.split(separator: "-") }
|
|
.map { (String($0[0]), String($0[1])) }.forEach { m1, m2 in
|
|
map[m1, default: []].insert(m2)
|
|
map[m2, default: []].insert(m1)
|
|
}
|
|
return map
|
|
}
|
|
|
|
struct Triple : Hashable, CustomStringConvertible {
|
|
let (m1, m2, m3): (String, String, String)
|
|
var description: String { return "\(m1)-\(m2)-\(m3)" }
|
|
var hasT: Bool {
|
|
return m1.first == "t" || m2.first == "t" || m3.first == "t"
|
|
}
|
|
init (_ m1: String, _ m2: String, _ m3: String) {
|
|
let ms = [m1, m2, m3].sorted()
|
|
(self.m1, self.m2, self.m3) = (ms[0], ms[1], ms[2])
|
|
}
|
|
}
|
|
|
|
func checkTriples(_ network: Network) -> Set<Triple> {
|
|
var triples: Set<Triple> = []
|
|
for (m1, m1conns) in network {
|
|
for m2 in m1conns {
|
|
for m3 in network[m2]! {
|
|
if network[m3]!.contains(m1) {
|
|
triples.insert(Triple(m1, m2, m3))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return triples
|
|
}
|
|
|
|
let conns = try readInput(CommandLine.arguments[1])
|
|
print(checkTriples(conns).filter { $0.hasT }.count)
|