-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path03.swift
70 lines (57 loc) · 1.93 KB
/
03.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
import Foundation
guard let input = try? String(contentsOf: URL(fileURLWithPath: "03.txt")) else {
fatalError("File error")
}
struct Rucksack {
let first: Set<Character>
let second: Set<Character>
static func from(_ characters: String) -> Rucksack {
let halfLength = characters.count / 2
let firstPart = characters.prefix(halfLength)
let secondPart = characters.suffix(halfLength)
return Rucksack(first: Set(Array(firstPart)), second: Set(Array(secondPart)))
}
func getCommon() -> Character? {
return first.intersection(second).first
}
func allItems() -> Set<Character> {
return first.union(second)
}
static func getScore(_ character: Character) -> Int {
guard let value = character.asciiValue else {
fatalError("Parse error")
}
switch character.isLowercase {
case true: return Int(value) - Int(Character("a").asciiValue!) + 1
case false: return Int(value) - Int(Character("A").asciiValue!) + 27
}
}
}
struct ElfGroup {
let rucksacks: [Rucksack]
func findCommon() -> Character? {
return rucksacks.reduce(rucksacks.first!.allItems(), { acc, value in acc.intersection(value.allItems()) }).first
}
}
let rucksacks = input.components(separatedBy: .newlines).map { Rucksack.from($0) }
let scores1: [Int] = rucksacks.map {
guard let common = $0.getCommon() else {
fatalError("Data error")
}
return Rucksack.getScore(common)
}
let answer1 = scores1.reduce(0, +)
print(answer1)
assert(answer1 == 7742)
let groups = stride(from: 0, to: rucksacks.endIndex, by: 3).map {
ElfGroup(rucksacks: Array(rucksacks[$0..<min($0+3, rucksacks.count)]))
}
let scores2: [Int] = groups.map {
guard let common = $0.findCommon() else {
fatalError("Data error")
}
return Rucksack.getScore(common)
}
let answer2 = scores2.reduce(0, +)
print(answer2)
assert(answer2 == 2276)