61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package d15
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func expand(in [][]int) [][]int {
|
|
height := len(in)
|
|
width := len(in[0])
|
|
|
|
expanded := make([][]int, height*5)
|
|
|
|
for y := range expanded {
|
|
expanded[y] = make([]int, width*5)
|
|
}
|
|
|
|
for y, line := range in {
|
|
for x, num := range line {
|
|
for i := 0; i < 5; i++ {
|
|
for j := 0; j < 5; j++ {
|
|
expanded[y+(height*i)][x+(width*j)] = (num + i + j) % 9
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return expanded
|
|
}
|
|
|
|
func expandMap(in string) string {
|
|
lines := make([][]int, 0)
|
|
for _, line := range strings.Split(strings.TrimSpace(in), "\n") {
|
|
nums := make([]int, 0)
|
|
for _, weight := range strings.Split(line, "") {
|
|
weight, _ := strconv.Atoi(weight)
|
|
nums = append(nums, weight)
|
|
}
|
|
lines = append(lines, nums)
|
|
}
|
|
|
|
expanded := expand(lines)
|
|
|
|
newMap := ""
|
|
|
|
for _, line := range expanded {
|
|
for _, num := range line {
|
|
newMap = newMap + fmt.Sprint(num)
|
|
}
|
|
|
|
newMap += "\n"
|
|
}
|
|
|
|
return newMap
|
|
}
|
|
|
|
func P2(in string) int {
|
|
weights, neighbors := weightNeighbors(expandMap(in))
|
|
return dijkstra(0, node(len(weights)-1), weights, neighbors)
|
|
}
|