|
@@ -12,7 +12,7 @@ type Point struct {
|
|
value byte
|
|
value byte
|
|
}
|
|
}
|
|
|
|
|
|
-func key(p Point) string {
|
|
|
|
|
|
+func (p *Point) key() string {
|
|
return fmt.Sprintf("%d_%d", p.y, p.x)
|
|
return fmt.Sprintf("%d_%d", p.y, p.x)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -50,7 +50,7 @@ func getMoves(reindeer Point, matrix [][]byte, xMax, yMax int) []Point {
|
|
return moves
|
|
return moves
|
|
}
|
|
}
|
|
|
|
|
|
-func hike(reindeer Point, matrix [][]byte, xMax, yMax int, hash func(Point) string) int {
|
|
|
|
|
|
+func hike(reindeer Point, matrix [][]byte, xMax, yMax int, oneWay bool) int {
|
|
var nines int
|
|
var nines int
|
|
visited := make(map[string]bool)
|
|
visited := make(map[string]bool)
|
|
|
|
|
|
@@ -64,9 +64,13 @@ func hike(reindeer Point, matrix [][]byte, xMax, yMax int, hash func(Point) stri
|
|
|
|
|
|
newMoves := getMoves(current, matrix, xMax, yMax)
|
|
newMoves := getMoves(current, matrix, xMax, yMax)
|
|
for _, newMove := range newMoves {
|
|
for _, newMove := range newMoves {
|
|
- if !visited[hash(newMove)] {
|
|
|
|
|
|
+ if oneWay {
|
|
|
|
+ if !visited[newMove.key()] {
|
|
|
|
+ moves = append(moves, newMove)
|
|
|
|
+ visited[newMove.key()] = true
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
moves = append(moves, newMove)
|
|
moves = append(moves, newMove)
|
|
- visited[hash(newMove)] = true
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -74,7 +78,7 @@ func hike(reindeer Point, matrix [][]byte, xMax, yMax int, hash func(Point) stri
|
|
return nines
|
|
return nines
|
|
}
|
|
}
|
|
|
|
|
|
-func part1(matrix [][]byte) int {
|
|
|
|
|
|
+func solve(matrix [][]byte, oneWay bool) int {
|
|
var result int
|
|
var result int
|
|
xMax := len(matrix[0])
|
|
xMax := len(matrix[0])
|
|
yMax := len(matrix)
|
|
yMax := len(matrix)
|
|
@@ -83,7 +87,7 @@ func part1(matrix [][]byte) int {
|
|
for x := range matrix[y] {
|
|
for x := range matrix[y] {
|
|
if matrix[y][x] == '0' {
|
|
if matrix[y][x] == '0' {
|
|
reindeer := Point{x: x, y: y, value: '0'}
|
|
reindeer := Point{x: x, y: y, value: '0'}
|
|
- result += hike(reindeer, matrix, xMax, yMax, key)
|
|
|
|
|
|
+ result += hike(reindeer, matrix, xMax, yMax, oneWay)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -91,42 +95,6 @@ func part1(matrix [][]byte) int {
|
|
return result
|
|
return result
|
|
}
|
|
}
|
|
|
|
|
|
-func hike2(reindeer Point, matrix [][]byte, xMax, yMax int) int {
|
|
|
|
- var nines int
|
|
|
|
-
|
|
|
|
- moves := []Point{reindeer}
|
|
|
|
- for len(moves) > 0 {
|
|
|
|
- current := moves[0]
|
|
|
|
- moves = moves[1:]
|
|
|
|
- if matrix[current.y][current.x] == '9' {
|
|
|
|
- nines++
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- newMoves := getMoves(current, matrix, xMax, yMax)
|
|
|
|
- for _, newMove := range newMoves {
|
|
|
|
- moves = append(moves, newMove)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return nines
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func part2(matrix [][]byte) int {
|
|
|
|
- var result int
|
|
|
|
- xMax := len(matrix[0])
|
|
|
|
- yMax := len(matrix)
|
|
|
|
-
|
|
|
|
- for y := range matrix {
|
|
|
|
- for x := range matrix[y] {
|
|
|
|
- if matrix[y][x] == '0' {
|
|
|
|
- reindeer := Point{x: x, y: y, value: '0'}
|
|
|
|
- result += hike2(reindeer, matrix, xMax, yMax)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return result
|
|
|
|
-}
|
|
|
|
func main() {
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
if len(os.Args) < 2 {
|
|
log.Fatal("You need to specify a file!")
|
|
log.Fatal("You need to specify a file!")
|
|
@@ -139,6 +107,6 @@ func main() {
|
|
}
|
|
}
|
|
|
|
|
|
matrix := readInput(file)
|
|
matrix := readInput(file)
|
|
- fmt.Println("Part1:", part1(matrix))
|
|
|
|
- fmt.Println("Part2:", part2(matrix))
|
|
|
|
|
|
+ fmt.Println("Part1:", solve(matrix, true))
|
|
|
|
+ fmt.Println("Part2:", solve(matrix, false))
|
|
}
|
|
}
|