-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay03.swift
72 lines (51 loc) · 1.25 KB
/
Day03.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
import Foundation
import Tools
final class Day03Solver: DaySolver {
let dayNumber: Int = 3
struct Input {
let squareID: Int
}
/// Source of this function: https://math.stackexchange.com/a/163101
private func spiralPoint(for n: Int) -> Point2D {
let k = Int(ceil((sqrt(Float(n)) - 1) / 2))
var t = 2 * k + 1
var m = t * t
t = t - 1
if n >= m - t {
return .init(x: k - (m - n), y: -k)
}
m = m - t
if n >= m - t {
return .init(x: -k, y: -k + (m - n))
}
m = m - t
if n >= m - t {
return .init(x: -k + (m - n), y: k)
} else {
return .init(x: k, y: k - (m - n - t))
}
}
func solvePart1(withInput input: Input) -> Int {
let point = spiralPoint(for: input.squareID)
return abs(point.x) + abs(point.y)
}
func solvePart2(withInput input: Input) -> Int {
var sumsPerPoint: [Point2D: Int] = [:]
for n in 1 ... 100 {
let point = spiralPoint(for: n)
let neighbors = point.neighbors(includingDiagonals: true)
var sum = 0
for neighborPoint in neighbors {
sum += sumsPerPoint[neighborPoint, default: 0]
}
if sum > input.squareID {
return sum
}
sumsPerPoint[point] = max(1, sum)
}
return 0
}
func parseInput(rawString: String) -> Input {
return .init(squareID: 277_678)
}
}