From b10a6250b1c6f336df6c8ca77b729c48d81cf8e2 Mon Sep 17 00:00:00 2001 From: efim Date: Thu, 21 Dec 2023 12:36:07 +0000 Subject: [PATCH] day21: wrong answer AND slow. need to scrap --- day21/stepCounter.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/day21/stepCounter.go b/day21/stepCounter.go index 8d9764a..2cc4366 100644 --- a/day21/stepCounter.go +++ b/day21/stepCounter.go @@ -9,7 +9,7 @@ import ( func Run() (result int) { fmt.Print("hello day21") - filename := "day21/example" + filename := "day21/input" field := ReadField(filename) log.Print(field) @@ -25,14 +25,14 @@ func Run() (result int) { // field.PrintCoord(reachableBySteps, 1) // } - steps := 50 + steps := 26501365 reachableBySteps := field.ReachableBySteps( steps, map[FieldPoint]any{ FieldPoint{ InField: Coord{Row: field.RowStart, Col: field.ColStart}, }: struct{}{}}, - make(map[Coord]any), + make(map[Coord]int), steps) result = reachableBySteps log.Print("reachable after steps : ", steps, result) @@ -60,7 +60,7 @@ type FieldPoint struct { MetaField Coord } -func (f Field) ReachableBySteps(n int, startingAt map[FieldPoint]any, saturatedFields map[Coord]any, initialSteps int) (countReachable int) { +func (f Field) ReachableBySteps(n int, startingAt map[FieldPoint]any, saturatedFields map[Coord]int, initialSteps int) (countReachable int) { if n%100 == 0 { log.Println("going step: ", n) } @@ -78,7 +78,7 @@ func (f Field) ReachableBySteps(n int, startingAt map[FieldPoint]any, saturatedF } } - return sizeOfUnsaturated + return sizeOfUnsaturated + sizeOfSaturated } // else collect directly available @@ -97,21 +97,22 @@ func (f Field) ReachableBySteps(n int, startingAt map[FieldPoint]any, saturatedF for workedUponFieldCoord, amount := range metaFields { isEven := FieldIsInEven(initialSteps, n, workedUponFieldCoord) if workedUponFieldCoord.Col == 0 && workedUponFieldCoord.Row == 0 { - log.Printf("checking %+v : %d as worked fields for saturation. isEven %t", workedUponFieldCoord, amount, isEven) + // log.Printf("checking %+v : %d as worked fields for saturation. isEven %t", workedUponFieldCoord, amount, isEven) } if isEven && amount == f.SaturatedEvenCount { log.Printf(">>> adding %+v to saturated, with amount %d\n", workedUponFieldCoord, amount) - saturatedFields[workedUponFieldCoord] = struct{}{} + saturatedFields[workedUponFieldCoord] = n } if !isEven && amount == f.SaturatedOddCount { log.Printf(">>> adding %+v to saturated, with amount %d\n", workedUponFieldCoord, amount) - saturatedFields[workedUponFieldCoord] = struct{}{} + saturatedFields[workedUponFieldCoord] = n } } for point := range oneStepExpanded { - _, fromSaturated := saturatedFields[point.MetaField] - if fromSaturated { + saturatedAtStep, fromSaturated := saturatedFields[point.MetaField] + // hack. to not remove points from saturated fields too early + if fromSaturated && (saturatedAtStep - n > 200) { delete(oneStepExpanded, point) } } @@ -139,7 +140,7 @@ func FieldIsInEven(initialSteps, currentSteps int, metaCoord Coord) bool { } } -func (f Field) Neighbors(c FieldPoint, saturatedFields map[Coord]any) (resut []FieldPoint) { +func (f Field) Neighbors(c FieldPoint, saturatedFields map[Coord]int) (resut []FieldPoint) { closeCoords := []FieldPoint{ {InField: Coord{Row: c.InField.Row + 1, Col: c.InField.Col}, MetaField: c.MetaField}, {InField: Coord{Row: c.InField.Row - 1, Col: c.InField.Col}, MetaField: c.MetaField},