-
Notifications
You must be signed in to change notification settings - Fork 1
/
day3.go
95 lines (83 loc) · 1.52 KB
/
day3.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
package main
import (
"fmt"
"os"
"regexp"
"strings"
"utils"
)
type step struct {
x int
y int
d int
}
var stepRegex = regexp.MustCompile("([A-Z])(\\d+)")
type wire struct {
x int
y int
d int
path []step
}
func traverse(w wire, direction string, distance int) wire {
dx := 0
dy := 0
switch direction {
case "U":
dx = 1
case "R":
dy = 1
case "D":
dx = -1
case "L":
dy = -1
}
for i := 0; i < distance; i++ {
w.x += dx
w.y += dy
w.d++
w.path = append(w.path, step{w.x, w.y, w.d})
}
return w
}
func intersection(a, b []step) (c []step) {
for _, i := range a {
for _, j := range b {
if i.x == j.x && i.y == j.y {
i.d += j.d
c = append(c, i)
}
}
}
return
}
func run(filepath string) (closest int, shortest int) {
input := utils.ReadFileToLines(filepath)
var wires []wire
for _, line := range input {
paths := strings.Split(line, ",")
w := wire{0, 0, 0, []step{}}
for _, path := range paths {
match := stepRegex.FindStringSubmatch(path)
direction := match[1]
distance := utils.Atoi(match[2])
w = traverse(w, direction, distance)
}
wires = append(wires, w)
}
intersectionPoints := intersection(wires[0].path, wires[1].path)
for _, p := range intersectionPoints {
d := utils.Abs(p.x) + utils.Abs(p.y)
if d < closest || closest == 0 {
closest = d
}
l := p.d
if l < shortest || shortest == 0 {
shortest = l
}
}
return
}
func main() {
closest, shortest := run(os.Args[1])
fmt.Printf("closest: %v\n shortest: %v\n", closest, shortest)
}