1
 2
 3
 4
 5
 6
 7
 8
 9
10
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
import numpy as np


def apply_rule(grid):
    new_grid = np.copy(grid)
    size = grid.shape[0]
    
    for i in range(size - 1):
        for j in range(size - 1):
            square = grid[i:i+2, j:j+2]
            ones = np.argwhere(square == 1)
            
            if len(ones) == 2:
                if abs(ones[0][0] - ones[1][0]) == 1 and abs(ones[0][1] - ones[1][1]) == 1:
                    new_grid[i:i+2, j:j+2] = 1 - square  
    
    return new_grid


def get_img() -> np.ndarray:
    out = np.zeros((100, 100), dtype=np.int32)
    for i in range(0, 100):
        if i % 2:
            out[i, 0] = 1
        else:
            out[i,:99] = 1
    
    out[0, 0] = 0
    out[0, 99] = 1
    
    return out


def print_grid(grid: np.ndarray):
    for i in range(100):
        for j in range(100):
            print(grid[i, j], end="")
        print()


def get_num_of_steps(grid: np.ndarray):
    seen_states = set()
    grid_bytes = grid.tobytes()
    i = 0

    while grid_bytes not in seen_states and i < 10000:
        seen_states.add(grid_bytes)
        grid = apply_rule(grid)
        grid_bytes = grid.tobytes()
        i += 1
    
    return i


if __name__ == "__main__":
    out = get_img()
    # steps = get_num_of_steps(out)

    # print("Num of steps: ", steps)

    print_grid(out)