feat: solve part seven day two

This commit is contained in:
Stevan Freeborn
2025-12-14 07:21:58 -06:00
parent b7d78c09fe
commit 9eda236cf8
2 changed files with 97 additions and 0 deletions
+77
View File
@@ -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]
}