Files
advent-of-code-2025/internal/grid/grid.go
T

98 lines
2.2 KiB
Go
Raw Normal View History

2025-12-07 07:59:27 -06:00
package grid
import (
"fmt"
"github.com/StevanFreeborn/advent-of-code-2025/internal/move"
"github.com/StevanFreeborn/advent-of-code-2025/internal/position"
)
2025-12-07 07:59:27 -06:00
type Grid interface {
NumberOfRows() int
NumberOfColumns() int
InBounds(position.Position) bool
GetValueAt(position.Position) string
GetSameNeighborsOf(position.Position, []move.Move) []position.Position
2025-12-07 07:59:27 -06:00
}
type grid struct {
numberOfRows int
numberOfColumns int
positions map[position.Position]string
2025-12-07 07:59:27 -06:00
}
func From(input []string) Grid {
2025-12-07 07:59:27 -06:00
numberOfRows := len(input)
numberOfColumns := len(input[0])
positions := map[position.Position]string{}
2025-12-07 07:59:27 -06:00
for row := range numberOfRows {
for column := range numberOfColumns {
value := string(input[row][column])
pos := position.From(row, column)
2025-12-07 07:59:27 -06:00
positions[pos] = value
}
}
return grid{
numberOfRows: numberOfRows,
numberOfColumns: numberOfColumns,
positions: positions,
2025-12-07 07:59:27 -06:00
}
}
func (g grid) NumberOfRows() int {
return g.numberOfRows
}
2025-12-07 07:59:27 -06:00
func (g grid) NumberOfColumns() int {
return g.numberOfColumns
}
func (g grid) InBounds(pos position.Position) bool {
if pos.Row() < 0 || pos.Row() >= g.numberOfRows {
return false
2025-12-07 07:59:27 -06:00
}
if pos.Column() < 0 || pos.Column() >= g.numberOfColumns {
return false
2025-12-07 07:59:27 -06:00
}
return true
2025-12-07 07:59:27 -06:00
}
func (g grid) GetValueAt(pos position.Position) string {
return g.positions[pos]
2025-12-07 07:59:27 -06:00
}
func (g grid) GetSameNeighborsOf(pos position.Position, moves []move.Move) []position.Position {
similarNeighbors := []position.Position{}
originalValue := g.GetValueAt(pos)
2025-12-07 07:59:27 -06:00
fmt.Println("Moves to check:", moves)
for _, m := range moves {
postionRow := pos.Row()
positionColumn := pos.Column()
2025-12-07 07:59:27 -06:00
fmt.Println("Checking move:", m, "from position:", pos)
fmt.Println("Move rows:", m.NumberOfRows(), "columns:", m.NumberOfColumns())
neighborRow := postionRow + m.NumberOfRows()
neighborColumn := positionColumn + m.NumberOfColumns()
neighborPos := position.From(neighborRow, neighborColumn)
2025-12-07 07:59:27 -06:00
if g.InBounds(neighborPos) == false {
continue
}
2025-12-07 07:59:27 -06:00
neighborValue := g.GetValueAt(neighborPos)
2025-12-07 07:59:27 -06:00
if neighborValue != originalValue {
continue
}
2025-12-07 07:59:27 -06:00
similarNeighbors = append(similarNeighbors, neighborPos)
}
return similarNeighbors
2025-12-07 07:59:27 -06:00
}