-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
104 lines (85 loc) · 2.07 KB
/
main.go
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"fmt"
"slices"
"strings"
"github.com/Alex-Waring/AoC/utils"
)
type Grid map[utils.Position]int
func part1(input []string) {
defer utils.Timer("part1")()
grid := Grid{}
for _, line := range input {
start := strings.Split(line, " ")[0]
end := strings.Split(line, " ")[2]
x1 := utils.IntegerOf(strings.Split(start, ",")[0])
x2 := utils.IntegerOf(strings.Split(end, ",")[0])
y1 := utils.IntegerOf(strings.Split(start, ",")[1])
y2 := utils.IntegerOf(strings.Split(end, ",")[1])
if isLine(x1, x2, y1, y2) {
for _, y := range utils.MakeRange(y1, y2) {
for _, x := range utils.MakeRange(x1, x2) {
grid[utils.Position{Row: y, Col: x}]++
}
}
}
}
count := 0
for _, v := range grid {
if v > 1 {
count++
}
}
fmt.Println("Overlapping squares: ", count)
}
func part2(input []string) {
defer utils.Timer("part2")()
grid := Grid{}
for _, line := range input {
start := strings.Split(line, " ")[0]
end := strings.Split(line, " ")[2]
x1 := utils.IntegerOf(strings.Split(start, ",")[0])
x2 := utils.IntegerOf(strings.Split(end, ",")[0])
y1 := utils.IntegerOf(strings.Split(start, ",")[1])
y2 := utils.IntegerOf(strings.Split(end, ",")[1])
if isLine(x1, x2, y1, y2) {
for _, y := range utils.MakeRange(y1, y2) {
for _, x := range utils.MakeRange(x1, x2) {
grid[utils.Position{Row: y, Col: x}]++
}
}
} else {
x_range := makeOrderedRange(x1, x2)
y_range := makeOrderedRange(y1, y2)
if len(x_range) != len(y_range) {
panic("line not at 45 degrees")
}
for i := 0; i < len(x_range); i++ {
grid[utils.Position{Row: y_range[i], Col: x_range[i]}]++
}
}
}
count := 0
for _, v := range grid {
if v > 1 {
count++
}
}
fmt.Println("Overlapping squares: ", count)
}
func makeOrderedRange(a int, b int) []int {
if a > b {
return utils.MakeRange(a, b)
}
r := utils.MakeRange(b, a)
slices.Reverse(r)
return r
}
func isLine(x1 int, x2 int, y1 int, y2 int) bool {
return x1 == x2 || y1 == y2
}
func main() {
input := utils.ReadInput("input.txt")
part1(input)
part2(input)
}