Day12
This commit is contained in:
parent
f3cb16ac9a
commit
6401908349
160
day12/day12.go
160
day12/day12.go
@ -5,43 +5,44 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ActivePath struct {
|
|
||||||
activePosition [2]int
|
|
||||||
visitedPositions [][2]int
|
|
||||||
steps int
|
|
||||||
}
|
|
||||||
|
|
||||||
type FieldPoint struct {
|
type FieldPoint struct {
|
||||||
cost int
|
cost int
|
||||||
height int
|
height int
|
||||||
|
before [2]int
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
//args := os.Args[1:]
|
//args := os.Args[1:]
|
||||||
lines := helper.ReadTextFile("day12/input")
|
lines := helper.ReadTextFile("day12/inputFichte")
|
||||||
start, end := getStartingPointAndEndpoint(lines)
|
start, end := getStartingPointAndEndpoint(lines)
|
||||||
fmt.Println(start)
|
fmt.Println(start)
|
||||||
fmt.Println(end)
|
fmt.Println(end)
|
||||||
field := getField(lines)
|
field := getField(lines)
|
||||||
activePaths := []ActivePath{{start, [][2]int{}, 0}}
|
part1(field, end)
|
||||||
fastestRoute := 999999999
|
print(field)
|
||||||
for len(activePaths) > 0 {
|
//fastestPath := part2(lines, field, end)
|
||||||
newPaths := []ActivePath{}
|
|
||||||
for _, path := range activePaths {
|
}
|
||||||
if path.activePosition == [2]int{2, 6} {
|
|
||||||
//fmt.Println("here")
|
func part2(lines []string, field [][]FieldPoint, end [2]int) {
|
||||||
}
|
lowestPoints := getLowestPoints(lines)
|
||||||
newPathStep := path.step(field)
|
fastestPath := 999999
|
||||||
if path.activePosition == end && fastestRoute > path.steps {
|
for _, point := range lowestPoints {
|
||||||
fastestRoute = path.steps
|
activePoints := make(map[[2]int]struct{})
|
||||||
path.print(field)
|
activePoints[[2]int{point[0], point[1]}] = struct{}{}
|
||||||
} else if path.steps < fastestRoute {
|
field = getField(lines)
|
||||||
newPaths = append(newPaths, newPathStep...)
|
steps := getBestRouteLength(activePoints, field, end)
|
||||||
}
|
if steps < fastestPath && steps != 0 {
|
||||||
|
fastestPath = steps
|
||||||
}
|
}
|
||||||
activePaths = newPaths
|
|
||||||
}
|
}
|
||||||
fmt.Println(fastestRoute)
|
fmt.Println(fastestPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(field [][]FieldPoint, end [2]int) {
|
||||||
|
activePoints := make(map[[2]int]struct{})
|
||||||
|
activePoints[[2]int{0, 0}] = struct{}{}
|
||||||
|
fmt.Println(getBestRouteLength(activePoints, field, end) + 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getField(lines []string) [][]FieldPoint {
|
func getField(lines []string) [][]FieldPoint {
|
||||||
@ -57,35 +58,50 @@ func getField(lines []string) [][]FieldPoint {
|
|||||||
if line[j] == 'E' {
|
if line[j] == 'E' {
|
||||||
height = int('z')
|
height = int('z')
|
||||||
}
|
}
|
||||||
fieldLine[j] = FieldPoint{0, height}
|
fieldLine[j] = FieldPoint{0, height, [2]int{-1, -1}}
|
||||||
}
|
}
|
||||||
|
field[i] = fieldLine
|
||||||
}
|
}
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
func (path *ActivePath) step(field []string) (newPaths []ActivePath) {
|
func getBestRouteLength(activePoints map[[2]int]struct{}, field [][]FieldPoint, endPoint [2]int) int {
|
||||||
if getHeight(path.activePosition, field) == 'E' {
|
for len(activePoints) > 0 {
|
||||||
return
|
step(&field, &activePoints)
|
||||||
}
|
}
|
||||||
nextSteps := path.getNextStep(field)
|
return field[endPoint[0]][endPoint[1]].cost
|
||||||
for _, step := range nextSteps {
|
|
||||||
newPath := ActivePath{step, append(path.visitedPositions, path.activePosition), path.steps + 1}
|
|
||||||
newPaths = append(newPaths, newPath)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (path *ActivePath) checkVisitable(direction [2]int, field []string) (visitable bool) {
|
func step(field *[][]FieldPoint, activePoints *map[[2]int]struct{}) {
|
||||||
toVisit := path.activePosition
|
point := get_some_key(*activePoints)
|
||||||
|
delete(*activePoints, point)
|
||||||
|
current0 := point[0]
|
||||||
|
current1 := point[1]
|
||||||
|
currentFieldSumCost := (*field)[current0][current1].cost
|
||||||
|
directions := [4][2]int{{0, -1}, {+1, 0}, {0, 1}, {-1, 0}}
|
||||||
|
for _, direction := range directions {
|
||||||
|
toVisit0 := current0 + direction[0]
|
||||||
|
toVisit1 := current1 + direction[1]
|
||||||
|
if checkVisitable(point, direction, *field) {
|
||||||
|
cost := 1 + currentFieldSumCost
|
||||||
|
if (*field)[toVisit0][toVisit1].cost > cost || (*field)[toVisit0][toVisit1].cost == 0 {
|
||||||
|
(*field)[toVisit0][toVisit1].cost = cost
|
||||||
|
(*field)[toVisit0][toVisit1].before = [2]int{current0, current1}
|
||||||
|
(*activePoints)[[2]int{toVisit0, toVisit1}] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkVisitable(activePosition [2]int, direction [2]int, field [][]FieldPoint) (visitable bool) {
|
||||||
|
toVisit := activePosition
|
||||||
toVisit[0] += direction[0]
|
toVisit[0] += direction[0]
|
||||||
toVisit[1] += direction[1]
|
toVisit[1] += direction[1]
|
||||||
if toVisit[0] > -1 && toVisit[1] > -1 &&
|
if toVisit[0] > -1 && toVisit[1] > -1 &&
|
||||||
toVisit[0] < len(field) && toVisit[1] < len((field)[0]) {
|
toVisit[0] < len(field) && toVisit[1] < len((field)[0]) &&
|
||||||
if helper.Contains2Int(path.visitedPositions, toVisit) {
|
field[activePosition[0]][activePosition[1]].before != toVisit {
|
||||||
return false
|
heightToVisit := field[toVisit[0]][toVisit[1]].height
|
||||||
}
|
heightCurrentPos := field[activePosition[0]][activePosition[1]].height + 1
|
||||||
heightToVisit := getHeight(toVisit, field)
|
|
||||||
heightCurrentPos := getHeight(path.activePosition, field) + 1
|
|
||||||
if heightToVisit > heightCurrentPos {
|
if heightToVisit > heightCurrentPos {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -94,27 +110,6 @@ func (path *ActivePath) checkVisitable(direction [2]int, field []string) (visita
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (path ActivePath) getNextStep(field []string) (nextSteps [][2]int) {
|
|
||||||
directions := [][2]int{{0, -1}, {0, +1}, {-1, 0}, {+1, 0}}
|
|
||||||
for _, direction := range directions {
|
|
||||||
if path.checkVisitable(direction, field) {
|
|
||||||
newStep := [2]int{path.activePosition[0] + direction[0], path.activePosition[1] + direction[1]}
|
|
||||||
nextSteps = append(nextSteps, newStep)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getHeight(location [2]int, field []string) int {
|
|
||||||
if field[location[0]][location[1]] == 'S' {
|
|
||||||
return 'a'
|
|
||||||
}
|
|
||||||
if field[location[0]][location[1]] == 'E' {
|
|
||||||
return 'z'
|
|
||||||
}
|
|
||||||
return int(field[location[0]][location[1]])
|
|
||||||
}
|
|
||||||
|
|
||||||
func getStartingPointAndEndpoint(field []string) (start, end [2]int) {
|
func getStartingPointAndEndpoint(field []string) (start, end [2]int) {
|
||||||
for i := 0; i < len(field); i++ {
|
for i := 0; i < len(field); i++ {
|
||||||
for j := 0; j < len(field[i]); j++ {
|
for j := 0; j < len(field[i]); j++ {
|
||||||
@ -129,16 +124,41 @@ func getStartingPointAndEndpoint(field []string) (start, end [2]int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (path ActivePath) print(field []string) {
|
func getLowestPoints(field []string) [][2]int {
|
||||||
|
lowestPoints := [][2]int{}
|
||||||
for i := 0; i < len(field); i++ {
|
for i := 0; i < len(field); i++ {
|
||||||
tempArr := ""
|
|
||||||
for j := 0; j < len(field[i]); j++ {
|
for j := 0; j < len(field[i]); j++ {
|
||||||
if helper.Contains2Int(path.visitedPositions, [2]int{i, j}) {
|
if field[i][j] == 'a' {
|
||||||
tempArr += "#"
|
lowestPoints = append(lowestPoints, [2]int{i, j})
|
||||||
} else {
|
|
||||||
tempArr += "."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Println(tempArr)
|
}
|
||||||
|
return lowestPoints
|
||||||
|
}
|
||||||
|
|
||||||
|
func get_some_key(m map[[2]int]struct{}) [2]int {
|
||||||
|
for k := range m {
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
return [2]int{-1, -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func print(field [][]FieldPoint) {
|
||||||
|
for i := 0; i < len(field); i++ {
|
||||||
|
fieldLine := field[i]
|
||||||
|
tempArray := []int{}
|
||||||
|
for j := 0; j < len(fieldLine); j++ {
|
||||||
|
tempArray = append(tempArray, fieldLine[j].height-96)
|
||||||
|
}
|
||||||
|
fmt.Println(tempArray)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
for i := 0; i < len(field); i++ {
|
||||||
|
fieldLine := field[i]
|
||||||
|
tempArray := []int{}
|
||||||
|
for j := 0; j < len(fieldLine); j++ {
|
||||||
|
tempArray = append(tempArray, fieldLine[j].cost)
|
||||||
|
}
|
||||||
|
fmt.Println(tempArray)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
day12/inputFichte
Normal file
41
day12/inputFichte
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
abcccccccccaaaaaaaaaaccccccccccccaaaaaaaaccaaccccccccccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abccccccccccaaaaaaaaaccccccccccccaaaaaaaaaaaacccccccccccaacccacccccccccccccccccccccccccccaaaaaa
|
||||||
|
abcccccccccccaaaaaaacccccccccccccaaaaaaaaaaaaaacccccccccaaacaacccccccccaaaccccccccccccccccaaaaa
|
||||||
|
abccccccccccaaaaaaccccccccccccccaaaaaaaaaaaaaaaccccccccccaaaaaccccccccccaaacccccccccccccccccaaa
|
||||||
|
abccccccccccaaaaaaaccccccccccccaaaaaaaaaaaaaacccccccccccaaaaaacccccccccaaaacccccccccccccccccaac
|
||||||
|
abaaccaaccccaaccaaaccccccccaaaaaaaaaaaaaaacaaccccccccccaaaaaaaacccccccccaaalcccccccccccccccaaac
|
||||||
|
abaaaaaacccccccccaaccccccccaaaaaacccaaaacccaaccccccccccaaaaaaaaccccccccalllllllcccccccccccccccc
|
||||||
|
abaaaaaacccccccaaacccccccccaaaaccccccaaaccccaaaaacccccccccaacccccccaaaakllllllllcccccccaacccccc
|
||||||
|
abaaaaaacccccccaaaacccccccccaacccccccaaaccccaaaaacccccccccaacccccccaakkklllpllllccccacaaacccccc
|
||||||
|
abaaaaaaaccccccaaaaccccaaccccccccccccccccccaaaaaaccccccccccccccccccckkkkpppppplllcccaaaaaaacccc
|
||||||
|
abaaaaaaacaaaccaaaaccaaaaaaccccccccccccccccaaaaaacccccccaaaccccckkkkkkkpppppppplllcddaaaaaacccc
|
||||||
|
abcaaaacccaacccccccccaaaaaacccccaaaccccccccaaaaaacccccccaaaaccjkkkkkkkpppppuppplmmdddddaaaccccc
|
||||||
|
abccaaaaaaaaaccccccccaaaaaaccccaaaaaacccccccaaacccccccccaaaajjjkkkkkrpppuuuuupppmmmdddddacccccc
|
||||||
|
abccccaaaaaaaacccccccaaaaacccccaaaaaacccccccccccccccccccaaacjjjjrrrrrrppuuuuupqqmmmmmddddaccccc
|
||||||
|
abccccaaaaaaaaacccccccaaaacccccaaaaaaccccccccccccccccccccccjjjrrrrrrrrpuuuxuvvqqqmmmmmddddccccc
|
||||||
|
abccccaaaaaaaaacccccccccccccccccaaaaaccccaacccaccccccccaaccjjjrrrruuuuuuuxxyvvqqqqqmmmmmdddcccc
|
||||||
|
abccccaaaaaaaacccccccccaaaccccccaacaaccccaaacaacccaaacaaaccjjjrrrtuuuuuuuxxyvvvqqqqqmmmmdddcccc
|
||||||
|
abccaaaaaaaacccccccccccaaaaaccccccccccccccaaaaacccaaaaaaaccjjjrrttttxxxxxxyyvvvvvqqqqmmmmdeeccc
|
||||||
|
abccaaaccaaaccccccccaacaaaaacccccccccccccaaaaaacccaaaaaacccjjjrrtttxxxxxxxyyvvvvvvvqqqmmmeeeccc
|
||||||
|
abaaaaaaaaaacccaaaccaaaaaaaaaaaccaaaccccaaaaaaaacccaaaaaaaajjjqqrttxxxxxxxyyyyyyvvvqqqnnneeeccc
|
||||||
|
SbaaaaaaaaccccaaaaccaaaaaaaaaaaaaaaaacccaaaaaaaaccaaaaaaaaacjjjqqtttxxxxEzzyyyyvvvvqqqnnneeeccc
|
||||||
|
abcaaaaaacccccaaaaccccaaaaaaaccaaaaaaccccccaaccccaaaaaaaaaaciiiqqqtttxxxyyyyyyvvvvrrrnnneeecccc
|
||||||
|
abcaaaaaacccccaaaacccaaaaaaaaccaaaaaaccccccaaccccaaacaaacccciiiqqqqttxxyyyyyywvvvrrrnnneeeecccc
|
||||||
|
abcaaaaaaccccccccccccaaaaaaaaacaaaaacccccccccccccccccaaaccccciiiqqtttxxyyyyyywwrrrrnnnneeeccccc
|
||||||
|
abcaaacaacccccaacccccaaaaaaaaacaaaaacccccccccccccccccaaaccccciiiqqttxxxywwyyywwrrrnnnneeecccccc
|
||||||
|
abccccccccaaacaaccccccccccacccccccccccccccccccccccccccccccccciiqqqttxxwwwwwwywwrrrnnneeeccccccc
|
||||||
|
abccaacccccaaaaaccccccccccccccccccccccccccccccccccccccccaacaaiiqqqttwwwwsswwwwwrrrnnfffeccccccc
|
||||||
|
abaaaaccccccaaaaaacccccccccccccccccccccccccccccaaaccccccaaaaaiiqqqttssssssswwwwrrronfffaccccccc
|
||||||
|
abaaaaaacccaaaaaaacccccccccccccccccccccccccccaaaaaacccccaaaaaiiqqqssssssssssswrrrooofffaaaacccc
|
||||||
|
abaaaaaaccaaaaaacccccccccccccccccccccccccccccaaaaaacccccaaaaaiiqqqppssspppssssrrrooofffaaaacccc
|
||||||
|
abaaaaaaccaacaaacccccccccccccccccccccccccccccaaaaaacccccaaaaaiihpppppppppppossrrooofffaaaaacccc
|
||||||
|
abaaaaccccccccaacccccccccccccccccccccccccccccaaaaaccccccccaaahhhhppppppppppoooooooofffaaaaccccc
|
||||||
|
abaaaaccccccccccaacccccccccccccccccaaacccccccaaaaacccccccccccchhhhhhhhhhggpoooooooffffaaaaccccc
|
||||||
|
abccaacccccccacaaaccccccccccccccccaaaaacccccccccccccccccccccccchhhhhhhhhggggoooooffffaacaaacccc
|
||||||
|
abccccccccccaaaaacaaccccccccccccccaaaaaccccccccccccccccccccccccchhhhhhhhggggggggggffcaacccccccc
|
||||||
|
abccccccccccaaaaaaaaccccccccccccccaaaacccaacccccccccccaccccccccccccccaaaaaggggggggfcccccccccccc
|
||||||
|
abccccccccccccaaaaaccccaacccccccccaaaacaaaaccccccccaaaaccccccccccccccaaaacaaagggggcccccccccaccc
|
||||||
|
abcccccccccccaaaaacccccaacccccccccaaaaaaaaaccccccccaaaaaaccccccccccccaaaccaaaacccccccccccccaaac
|
||||||
|
abcccccccccccaacaaccaaaaaaaacccaaaaaaaaaaaccccccccccaaaaccccccccccccccaccccaaacccccccccccccaaaa
|
||||||
|
abccccccccccccccaaccaaaaaaaaccaaaaaaaaaaaccccccccccaaaaacccccccccccccccccccccacccccccccccccaaaa
|
||||||
|
abccccccccccccccccccccaaaaacccaaaaaaaaaaaacccccccccaacaacccccccccccccccccccccccccccccccccaaaaaa
|
Loading…
Reference in New Issue
Block a user