Skip to content

Commit 092ef39

Browse files
committed
day18: solved part 1
1 parent 06b845d commit 092ef39

File tree

1 file changed

+69
-11
lines changed

1 file changed

+69
-11
lines changed

Diff for: day18/main.go

+69-11
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,36 @@ import (
1212

1313
const (
1414
CORRUPTED = -1
15+
UNIVSITED = 0
1516
)
1617

1718
func printSpace(space [][]int) {
19+
var max = len(space) - 1
1820
for y := range space {
1921
for x := range space[y] {
20-
fmt.Printf("%2d ", space[y][x])
22+
switch space[y][x] {
23+
case CORRUPTED:
24+
fmt.Print(" C")
25+
case UNIVSITED:
26+
fmt.Print(" .")
27+
default:
28+
fmt.Printf("%2d", space[y][x])
29+
}
30+
if max > 9 {
31+
fmt.Print(" ")
32+
}
2133
}
2234
fmt.Println()
2335
}
2436
fmt.Println()
2537
}
2638

27-
func main() {
28-
var size = flag.Int("max", 70, "coordinates have range [0,max]")
29-
var count = flag.Int("count", 1024, "number of bytes that have fallen")
30-
flag.Parse()
31-
var space = make([][]int, *size+1)
32-
for y := range space {
33-
space[y] = make([]int, *size+1)
34-
}
35-
39+
func readSpace(space [][]int, count int) {
3640
var scanner = bufio.NewScanner(os.Stdin)
3741
var pattern = regexp.MustCompile(`^(\d+),(\d+)$`)
3842

3943
var fallen int
40-
for scanner.Scan() && fallen < *count {
44+
for scanner.Scan() && fallen < count {
4145
var line = scanner.Text()
4246
var matches = pattern.FindStringSubmatch(line)
4347
var x, y int
@@ -52,6 +56,60 @@ func main() {
5256
fmt.Fprintf(os.Stderr, "Error: %s\n", err)
5357
os.Exit(1)
5458
}
59+
}
5560

61+
func makeSpace(size int) [][]int {
62+
var space = make([][]int, size+1)
63+
for y := range space {
64+
space[y] = make([]int, size+1)
65+
}
66+
return space
67+
}
68+
69+
var directions = []util.Point{{X: -1, Y: 0}, {X: 1, Y: 0}, {X: 0, Y: 1}, {X: 0, Y: -1}}
70+
71+
func markAround(from util.Point, space [][]int, set []util.Point) []util.Point {
72+
var size = len(space)
73+
var steps = space[from.Y][from.X]
74+
for _, direction := range directions {
75+
var to = from.Add(direction)
76+
if to.IsInBounds(size, size) && space[to.Y][to.X] == 0 {
77+
set = append(set, to)
78+
space[to.Y][to.X] = steps + 1
79+
}
80+
}
81+
return set
82+
}
83+
84+
func expandSet(set []util.Point, space [][]int) []util.Point {
85+
var newset = []util.Point{}
86+
for _, point := range set {
87+
newset = markAround(point, space, newset)
88+
}
89+
return newset
90+
}
91+
92+
func searchPath(space [][]int) int {
93+
var max = len(space) - 1
94+
var set []util.Point = []util.Point{{X: 0, Y: 0}}
95+
96+
space[0][0] = 1
97+
for space[max][max] == 0 && len(set) > 0 {
98+
set = expandSet(set, space)
99+
}
100+
101+
return space[max][max]
102+
}
103+
104+
func main() {
105+
var max = flag.Int("max", 70, "coordinates have range [0,max]")
106+
var count = flag.Int("count", 1024, "number of bytes that have fallen")
107+
flag.Parse()
108+
109+
var space = makeSpace(*max)
110+
readSpace(space, *count)
111+
printSpace(space)
112+
var steps = searchPath(space) - 1
113+
fmt.Printf("found exit in %d steps\n", steps)
56114
printSpace(space)
57115
}

0 commit comments

Comments
 (0)