package year25 import ( "fmt" "git.bizdoc.ro/gabi-public/Advent-of-Code.git/aoc" "git.bizdoc.ro/gabi-public/Advent-of-Code.git/aocutils" "git.bizdoc.ro/gabi-public/Advent-of-Code.git/year25/day7_pg" "git.bizdoc.ro/private/devkit.git/collections/geometry/v2" ) func day7ParseInput(c aoc.Context) (g geometry.Grid[byte], start geometry.Point, _ error) { g, err := geometry.ReaderToByteGrid(c.Body) if err != nil { return g, start, fmt.Errorf("day7: failed to read input %w", err) } findStart := g.Find(func(b byte) bool { return b == byte('S') }) for start = range findStart { return g, start, nil } return g, start, fmt.Errorf("day7: failed to find starting point") } func Day7Part1(c aoc.Context) (int, error) { g, start, err := day7ParseInput(c) if err != nil { return 0, fmt.Errorf("day7: failed to parse input %w", err) } var fill func(g geometry.Grid[byte], start geometry.Point) int fill = func(g geometry.Grid[byte], start geometry.Point) int { if g.ContainsPoint(start) { switch g.At(start) { case 'S': return fill(g, start.MoveDown()) case '.': g.Set(start, '|') return fill(g, start.MoveDown()) case '^': return 1 + fill(g, start.MoveLeft()) + fill(g, start.MoveRight()) } } return 0 } return fill(g, start), nil } func Day7Part2(c aoc.Context) (int, error) { g, start, err := day7ParseInput(c) if err != nil { return 0, fmt.Errorf("day7: failed to parse input %w", err) } h := geometry.NewGrid[int](g.Rows(), g.Cols()) var fill func(g geometry.Grid[byte], h geometry.Grid[int], start geometry.Point) int fill = func(g geometry.Grid[byte], cache geometry.Grid[int], start geometry.Point) int { if g.ContainsPoint(start) { switch g.At(start) { case 'S': return 1 + fill(g, cache, start.MoveDown()) case '.': g.Set(start, '|') v := fill(g, cache, start.MoveDown()) cache.Set(start, v) return v case '|': return cache.At(start) // cached value case '^': return 1 + fill(g, cache, start.MoveLeft()) + fill(g, cache, start.MoveRight()) } } return 0 } return fill(g, h, start), nil } func Day7Part1Render(c aoc.Context) (int, error) { g, start, err := day7ParseInput(c) if err != nil { return 0, fmt.Errorf("day7: failed to parse input %w", err) } var ev day7_pg.Day7Part1RenderEvent for ev = range day7_pg.Day7ProgressFillPart1(g, start) { } return int(ev.TotalProcessed), nil }