day23, still bad

This commit is contained in:
efim 2023-12-23 12:54:55 +00:00
parent 28cf35e0e4
commit 0c31596018
4 changed files with 49 additions and 6 deletions

View File

@ -8,14 +8,15 @@ import (
// length of longest scenic route
func Run() int {
fmt.Println("day 23")
filename := "day23/example"
filename := "day23/input"
field := ReadField(filename)
finalPaths := RunDFSTingy(field)
log.Println(finalPaths)
// log.Println(finalPaths)
max := 0
for _, path := range finalPaths {
if path.Visited.Cardinality() > max {
log.Println("one path len is ", path.Visited.Cardinality())
max = path.Visited.Cardinality()
}
}

10
day23/example2 Normal file
View File

@ -0,0 +1,10 @@
#.#####################
#.#####################
#.##............#######
#.##.##########.#######
#....##########.#######
####..#########.#######
#####...........#######
###############.#######
###############.#######
###############.#######

View File

@ -70,3 +70,9 @@ so if i'm in visited, it doesn't mean that stored is shorter and current is a de
but dfs should mean that all paths from this prefix have finished.
so, sure. there have to be all done?
** my example2 has fork on row 3 col 10
so 4,10 and 3,11 should be visited separately.
6,17 is where they join and the point which should have second entry
** allright, ugh. my new solution is memory hogging.
maybe i can draw the stuff and it will be several neat thingies

View File

@ -1,6 +1,7 @@
package day23
import (
"fmt"
"log"
mapset "github.com/deckarep/golang-set/v2"
@ -10,6 +11,9 @@ type PathEnd struct {
end Coord
visited mapset.Set[Coord]
}
func (p PathEnd)Sring() string {
return fmt.Sprintf("PathEnd[at %+v, visited: %+v]", p.end, p.visited)
}
func ExtendPath(p PathEnd, f Field) (nextPaths []PathEnd) {
endPointNeighbors := f.NeighborsPart2(p.end)
@ -41,13 +45,27 @@ func RunDFSTingy(f Field) []PathInfo {
return DFSScenicPaths(f, initialPath, initialShared)
}
var knownMax int = 0
func CheckAndPrintMax(maybeNewMax int) {
if maybeNewMax > knownMax {
log.Printf("\n\n>>>>found new max: %d\n", maybeNewMax)
knownMax = maybeNewMax
}
}
func DFSScenicPaths(f Field, curPath PathEnd,
sharedMem map[Coord][]PathInfo) (pathsFromTheStartToEnd []PathInfo) {
curCoord := curPath.end
if curCoord == (Coord{ Row: 6, Col: 15 }) {
log.Println(">>>>>>>>")
}
// log.Printf("entering %+v with mem %+v\n", curPath, sharedMem[curCoord])
if curCoord == f.EndCoord() {
pathsFromTheStartToEnd = append(pathsFromTheStartToEnd, PathInfo{curPath.visited.Clone()})
log.Printf("got to end. visited %+v . will return %+v\n", curPath.visited, pathsFromTheStartToEnd)
log.Printf("got to end. cur len is %d\n", curPath.visited.Cardinality())
CheckAndPrintMax(curPath.visited.Cardinality())
// i guess return only from current to end?
// and on non terminal first time, return copy with self added?
return
@ -70,13 +88,18 @@ func DFSScenicPaths(f Field, curPath PathEnd,
suffix := PathInfo{
Visited: path.Visited.Difference(curPath.visited).Clone(),
}
// log.Printf(">> from path \n%+v make suffix \n%+v\n\n", path, suffix)
suffixesFromCurToEnd = append(suffixesFromCurToEnd, suffix)
}
pathsFromTheStartToEnd = append(pathsFromTheStartToEnd, pathsToEndThrough...)
if len(pathsToEndThrough) != 0 {
// log.Printf("setting mem for %+v to %+v", curCoord, suffixesFromCurToEnd)
sharedMem[curCoord] = suffixesFromCurToEnd
}
}
sharedMem[curCoord] = suffixesFromCurToEnd
return
} else {
// have visited this point before, due to dfs all possible paths to end should already be known
@ -95,8 +118,11 @@ func DFSScenicPaths(f Field, curPath PathEnd,
fromCurPrefixToEnd := thisPrefix.Clone()
fromCurPrefixToEnd.Union(fromCurToEnd)
pathsFromTheStartToEnd = append(pathsFromTheStartToEnd, PathInfo{fromCurPrefixToEnd})
log.Printf("additional path to end of len %d\n", fromCurPrefixToEnd.Cardinality())
CheckAndPrintMax(fromCurPrefixToEnd.Cardinality())
}
}
log.Printf("having second visit into %+v.\n", curPath)
return
}
@ -116,7 +142,7 @@ func RunAllScenicPaths(f Field) (result []PathEnd) {
if curCheckedPath.end == f.EndCoord() {
result = append(result, curCheckedPath)
log.Printf("found end path of len %d . %+v", curCheckedPath.visited.Cardinality(), curCheckedPath)
// log.Printf("found end path of len %d . %+v", curCheckedPath.visited.Cardinality(), curCheckedPath)
continue
}