]> fbox.kageds.com Git - adventofcode.git/blob - 2022/go/utils/grid2d/grid2d.go
20223 day1
[adventofcode.git] / 2022 / go / utils / grid2d / grid2d.go
1 package grid2d
2
3 import (
4 "strings"
5
6 "adventofcode2022/utils"
7 )
8
9 type Grid[T any] struct {
10 sizeX, sizeY int
11 matrix [][]T
12 empty T
13 }
14
15 func NewGrid[T any](sizeX, sizeY int, empty T) *Grid[T] {
16 matrix := make([][]T, sizeY)
17 rows := make([]T, sizeX*sizeY)
18 for i := 0; i < sizeX*sizeY; i++ {
19 rows[i] = empty
20 }
21
22 j := 0
23 for i := 0; i < sizeY; i++ {
24 matrix[i] = rows[j : j+sizeX : j+sizeX]
25 j += sizeX
26 }
27 return &Grid[T]{
28 sizeX: sizeX,
29 sizeY: sizeY,
30 matrix: matrix,
31 empty: empty,
32 }
33 }
34
35 func (g *Grid[T]) SizeX() int {
36 return g.sizeX
37 }
38
39 func (g *Grid[T]) SizeY() int {
40 return g.sizeY
41 }
42
43 func (g *Grid[T]) Get(x, y int) T {
44 if x < 0 || x >= g.sizeX {
45 return g.empty
46 }
47 if y < 0 || y >= g.sizeY {
48 return g.empty
49 }
50 return g.matrix[y][x]
51 }
52
53 func (g *Grid[T]) Set(x, y int, v T) {
54 if x < 0 || x >= g.sizeX {
55 panic("invalid x")
56 }
57 if y < 0 || y >= g.sizeY {
58 panic("invalid y")
59 }
60 g.matrix[y][x] = v
61 }
62
63 func (g *Grid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
64 var r strings.Builder
65 for j := 0; j < g.sizeY; j++ {
66 for i := 0; i < g.sizeX; i++ {
67 _, err := r.WriteString(formatter(g.matrix[j][i], i, j))
68 utils.PanicOnErr(err)
69 }
70 _, err := r.WriteRune('\n')
71 utils.PanicOnErr(err)
72 }
73 return r.String()
74 }