-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay19.swift
79 lines (60 loc) · 1.56 KB
/
Day19.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
78
79
import Collections
import Foundation
import Tools
final class Day19Solver: DaySolver {
let dayNumber: Int = 19
struct Input {
let program: [Int]
}
func solvePart1(withInput input: Input) -> Int {
var counter = 0
for y in 0 ..< 50 {
for x in 0 ..< 50 {
let intcode = IntcodeProcessor(program: input.program)
guard let output = intcode.continueProgramTillOutput(input: [x, y]) else {
break
}
counter += output
}
}
return counter
}
func solvePart2(withInput input: Input) -> Int {
var slidingWindow: Deque<(y: Int, startX: Int, endX: Int)> = []
for y in 1100 ..< 10_000 {
var startX: Int = -1
var endX: Int = -1
var x = 350
while x < 1_000 {
let intcode = IntcodeProcessor(program: input.program)
let output = intcode.continueProgramTillOutput(input: [x, y])!
if output == 1, startX == -1 {
startX = x
x += 100
} else if output == 0, startX != -1 {
endX = x - 1
break
}
x += 1
}
if (endX - startX) + 1 >= 100 {
slidingWindow.append((y: y, startX: startX, endX: endX))
} else {
slidingWindow.removeAll()
}
if slidingWindow.count == 100 {
let bottomLeftStartX = slidingWindow.last!.startX
let topRightEndX = slidingWindow.first!.endX
if (topRightEndX - bottomLeftStartX + 1) >= 100 {
return (bottomLeftStartX * 10_000) + slidingWindow.first!.y
} else {
slidingWindow.removeFirst()
}
}
}
fatalError()
}
func parseInput(rawString: String) -> Input {
return .init(program: rawString.parseCommaSeparatedInts())
}
}