Skip to content

Grid

Grid

Bases: BaseModel

Store a grid of numbers.

Parameters:

Name Type Description Default
id str | None

optional grid ID

None
size int

grid size

required
grid list[list]

grid values

<dynamic>
Source code in src/snailz/grid.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Grid(BaseModel):
    """Store a grid of numbers."""

    id: str | None = Field(default=None, description="optional grid ID")
    size: int = Field(gt=0, description="grid size")
    grid: list[list] = Field(default_factory=list, description="grid values")

    def model_post_init(self, context):
        self.grid = [[0 for _ in range(self.size)] for _ in range(self.size)]

    def __getitem__(self, key):
        """Get grid element."""
        x, y = key
        return self.grid[x][y]

    def __setitem__(self, key, value):
        """Set grid element."""
        x, y = key
        self.grid[x][y] = value

    def __str__(self):
        """Convert to string."""
        output = io.StringIO()
        csv.writer(output).writerows(self.grid)
        return output.getvalue()

    _id_generator: ClassVar = generic_id_generator(lambda i: f"G{i:02d}")

    @staticmethod
    def generate(size):
        """Make and fill in a grid."""
        grid = Grid(id=next(Grid._id_generator), size=size)

        moves = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        center = grid.size // 2
        size_1 = grid.size - 1
        x, y = center, center
        num = 0

        while (x != 0) and (y != 0) and (x != size_1) and (y != size_1):
            grid[x, y] += 1
            num += 1
            m = random.choice(moves)
            x += m[0]
            y += m[1]

        return grid

    @staticmethod
    def to_csv(writer, grid):
        """Convert to CSV."""
        for y in range(grid.size - 1, -1, -1):
            row = [grid[x, y] for x in range(grid.size)]
            writer.writerow(row)

__getitem__(key)

Get grid element.

Source code in src/snailz/grid.py
21
22
23
24
def __getitem__(self, key):
    """Get grid element."""
    x, y = key
    return self.grid[x][y]

__setitem__(key, value)

Set grid element.

Source code in src/snailz/grid.py
26
27
28
29
def __setitem__(self, key, value):
    """Set grid element."""
    x, y = key
    self.grid[x][y] = value

__str__()

Convert to string.

Source code in src/snailz/grid.py
31
32
33
34
35
def __str__(self):
    """Convert to string."""
    output = io.StringIO()
    csv.writer(output).writerows(self.grid)
    return output.getvalue()

generate(size) staticmethod

Make and fill in a grid.

Source code in src/snailz/grid.py
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@staticmethod
def generate(size):
    """Make and fill in a grid."""
    grid = Grid(id=next(Grid._id_generator), size=size)

    moves = [[-1, 0], [1, 0], [0, -1], [0, 1]]
    center = grid.size // 2
    size_1 = grid.size - 1
    x, y = center, center
    num = 0

    while (x != 0) and (y != 0) and (x != size_1) and (y != size_1):
        grid[x, y] += 1
        num += 1
        m = random.choice(moves)
        x += m[0]
        y += m[1]

    return grid

to_csv(writer, grid) staticmethod

Convert to CSV.

Source code in src/snailz/grid.py
59
60
61
62
63
64
@staticmethod
def to_csv(writer, grid):
    """Convert to CSV."""
    for y in range(grid.size - 1, -1, -1):
        row = [grid[x, y] for x in range(grid.size)]
        writer.writerow(row)