From 9eda236cf817ee0c0c380ef8ff74937c834d1d79 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sun, 14 Dec 2025 07:21:58 -0600 Subject: [PATCH] feat: solve part seven day two --- cmd/07/main.go | 77 +++++++++++++++++++++++++++++++++++++++++++++ cmd/07/main_test.go | 20 ++++++++++++ 2 files changed, 97 insertions(+) diff --git a/cmd/07/main.go b/cmd/07/main.go index e60eb1f..a8e0997 100644 --- a/cmd/07/main.go +++ b/cmd/07/main.go @@ -6,6 +6,7 @@ import ( "github.com/StevanFreeborn/advent-of-code-2025/internal/move" "github.com/StevanFreeborn/advent-of-code-2025/internal/position" "github.com/StevanFreeborn/advent-of-code-2025/internal/queue" + "github.com/StevanFreeborn/advent-of-code-2025/internal/stack" ) const StartCharacter = "S" @@ -68,3 +69,79 @@ func SolvePartOne(filePath string) int { return total } + +func SolvePartTwo(filePath string) int { + input := file.ReadAllLines(filePath) + grid := grid.From(input) + + var startPosition position.Position + + for p, v := range grid.Positions() { + if v == StartCharacter { + startPosition = p + break + } + } + + if startPosition == nil { + panic("unable to find start location") + } + + beamStartPosition := startPosition.Move(move.Down) + beamsStack := stack.New[position.Position]() + beamsStack.Push(beamStartPosition) + + positionsToTimelinesMap := map[position.Position]int{} + + for beamsStack.IsEmpty() == false { + currentBeam, _ := beamsStack.Peek() + + _, hasBeenProcessed := positionsToTimelinesMap[currentBeam] + + if hasBeenProcessed { + beamsStack.Pop() + continue + } + + value := grid.GetValueAt(currentBeam) + nextTimelinePositions := []position.Position{} + + if value == SplitterCharacter { + rightBeam := currentBeam.Move(move.Right) + leftBeam := currentBeam.Move(move.Left) + nextTimelinePositions = append(nextTimelinePositions, rightBeam, leftBeam) + } else { + nextBeam := currentBeam.Move(move.Down) + nextTimelinePositions = append(nextTimelinePositions, nextBeam) + } + + numberOfTimelinesForPosition := 0 + finalizePosition := true + + for _, newTimelinePosition := range nextTimelinePositions { + if grid.InBounds(newTimelinePosition) == false { + numberOfTimelinesForPosition++ + continue + } + + v, existing := positionsToTimelinesMap[newTimelinePosition] + + if existing { + numberOfTimelinesForPosition += v + continue + } + + beamsStack.Push(newTimelinePosition) + finalizePosition = false + } + + if finalizePosition == false { + continue + } + + beamsStack.Pop() + positionsToTimelinesMap[currentBeam] = numberOfTimelinesForPosition + } + + return positionsToTimelinesMap[beamStartPosition] +} diff --git a/cmd/07/main_test.go b/cmd/07/main_test.go index b8b49bc..b6b4b55 100644 --- a/cmd/07/main_test.go +++ b/cmd/07/main_test.go @@ -25,3 +25,23 @@ func TestSolvePartOneWithInput(t *testing.T) { t.Errorf("SolvePartOne() = %d; want %d", result, expected) } } + +func TestSolvePartTwoWithExampleInput(t *testing.T) { + expected := 40 + + result := solution.SolvePartTwo("EXAMPLE.txt") + + if result != expected { + t.Errorf("SolveTwoOne() = %d; want %d", result, expected) + } +} + +func TestSolvePartTwoWithInput(t *testing.T) { + expected := 73_007_003_089_792 + + result := solution.SolvePartTwo("INPUT.txt") + + if result != expected { + t.Errorf("SolveTwoOne() = %d; want %d", result, expected) + } +}