-
Notifications
You must be signed in to change notification settings - Fork 1
/
day6.go
77 lines (68 loc) · 1.68 KB
/
day6.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
package main
import (
"fmt"
"log"
"math"
"os"
"regexp"
"strconv"
"utils"
)
func main() {
lines := utils.ReadFileToLines(os.Args[1])
var xCoords []int
var yCoords []int
var coordArea []int
const coordPattern = "(\\d+), (\\d+)"
coordReg := regexp.MustCompile(coordPattern)
for _, line := range lines {
coordMatch := coordReg.FindStringSubmatch(line)
if coordMatch != nil {
if n, err := strconv.Atoi(coordMatch[1]); err != nil {
log.Fatal(err)
} else {
xCoords = append(xCoords, n)
}
if n, err := strconv.Atoi(coordMatch[2]); err != nil {
log.Fatal(err)
} else {
yCoords = append(yCoords, n)
}
coordArea = append(coordArea, 0)
}
}
xMax := utils.MaxValue(xCoords)
yMax := utils.MaxValue(yCoords)
closeToAllArea := 0
for x := 0; x < xMax+1; x++ {
for y := 0; y < yMax+1; y++ {
var closestCoord int
closestCoordDistance := math.MaxInt64
coordDistanceSum := 0
for i := 0; i < len(coordArea); i++ {
distance := utils.Abs(x-xCoords[i]) + utils.Abs(y-yCoords[i])
if distance < closestCoordDistance {
closestCoord = i
closestCoordDistance = distance
} else if distance == closestCoordDistance {
closestCoord = -1 // No ONE is closest
}
coordDistanceSum += distance
}
if coordDistanceSum < 10000 {
closeToAllArea++
}
if closestCoord == -1 || coordArea[closestCoord] == -1 {
continue
}
if x == 0 || x == xMax || y == 0 || y == yMax {
coordArea[closestCoord] = -1
} else {
coordArea[closestCoord]++
}
}
}
maxIndex, maxArea := utils.Max(coordArea)
fmt.Printf("%d %d %d %d\n", maxIndex, xCoords[maxIndex], yCoords[maxIndex], maxArea)
fmt.Printf("%d\n", closeToAllArea)
}