-
Notifications
You must be signed in to change notification settings - Fork 0
/
Solution_2019_06.swift
77 lines (62 loc) · 2.16 KB
/
Solution_2019_06.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import Foundation
private typealias OrbitMap = [String: [String]]
struct Solution_2019_06: Solution {
var input: Input
func run() throws {
let input = try self.input.get()
.split { $0.isNewline }
.map { line in
line.split(separator: ")").map { String($0) }
}
// ------- Part 1 -------
let orbitMap = input
.reduce(into:OrbitMap()) { acc, x in
acc[x[0], default:[]].append(x[1])
}
func countOrbits(in orbitMap: OrbitMap) -> Int {
func count(keys: [String]) -> Int {
let directCount = keys
.compactMap { orbitMap[$0]?.count }
.reduce(0, +)
let indirectCount = keys
.compactMap { orbitMap[$0] }
.map { count(keys: $0) }
.reduce(0, +)
return directCount + indirectCount
}
return count(keys: Array(orbitMap.keys))
}
let part1 = countOrbits(in: orbitMap)
print(part1)
// ------- Part 2 -------
let reverseOrbitMap = input
.reduce(into:[String: String]()) { acc, x in
acc[x[1]] = x[0]
}
func findParent(for object: String) -> String? {
reverseOrbitMap[object]
}
let yourParent = findParent(for: "YOU")
let santaParent = findParent(for: "SAN")
var parent1 = yourParent
var parent2 = santaParent
var pathToCommonParent1 = 0
var pathToCommonParent2 = 0
while parent1 != parent2 {
pathToCommonParent1 += 1
parent1 = findParent(for: parent1!)
parent2 = santaParent
pathToCommonParent2 = 0
while parent2 != nil && parent2 != parent1 {
parent2 = findParent(for: parent2!)
pathToCommonParent2 += 1
}
}
let part2 = pathToCommonParent1 + pathToCommonParent2
print(part2)
// ------- Test -------
assert(part1 == 145250, "WA")
assert(part2 == 274, "WA")
//: [Next](@next)
}
}