feat: solve part seven day two
This commit is contained in:
@@ -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]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user