7 "adventofcode2023/utils"
10 type SparseGrid[T comparable] struct {
11 minX, maxX, minY, maxY int
16 func NewGrid[T comparable](empty T) *SparseGrid[T] {
17 return &SparseGrid[T]{
27 func (g *SparseGrid[T]) SizeX() (int, int) {
31 func (g *SparseGrid[T]) SizeY() (int, int) {
35 func (g *SparseGrid[T]) Visited() int {
39 func (g *SparseGrid[T]) Get(x, y int) T {
48 func (g *SparseGrid[T]) Set(x, y int, v T) {
50 current, ok := g.data[k]
51 if ok && v == current {
53 } else if !ok && v == g.empty {
55 } else if v == g.empty {
59 g.minX = utils.Min(g.minX, x)
60 g.maxX = utils.Max(g.maxX, x)
61 g.minY = utils.Min(g.minY, y)
62 g.maxY = utils.Max(g.maxY, y)
66 func (g *SparseGrid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
68 for j := g.minY; j <= g.maxY; j++ {
69 for i := g.minX; i <= g.maxX; i++ {
70 _, err := r.WriteString(formatter(g.Get(i, j), i, j))
73 _, err := r.WriteRune('\n')
79 func key(x, y int) string {
80 return fmt.Sprintf("%d:%d", x, y)