import numpy as np

def display():
    x = 10
    print(f"go {x}")

def print_all_elem(lol):
    if isinstance(lol, list):
        for elem in lol:
            print(elem)
    else:
        print(lol)
def test_lamda(x, y):
    return (lambda x,y: x*2 + y)(x, y)

def test_zeiger_in_python():
    a = list(range(5))
    b = a
    c = a[:]
    print("a b und c vor Änderung von a:", a,"  ", b, "  ", c)
    a[3] = 10
    print("a b und c nach Änderung von a[3]=10:", a,"  ", b, "  ", c)
    a = list(range(5, 10))
    print("a b und c nach Änderung von a=list(range(5, 10))", a,"  ", b, "  ", c)

def test_array():
    print("\n")
    print(np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]))
    print("(3,2,4):\n",np.zeros((3,2,4)))

def eye(n, m):
    matrix = [[0] * m for i in range(n)]
    for i in range(min(n, m)):
        matrix[i][i] = 1
    return matrix

def test_np_index():
    arr = np.zeros((2, 2))
    arr[0, 0] = 1
    arr[0, 1] = 2
    arr[1, 0] = 3
    arr[1, 1] = 4
    print(arr)
    arr[-1, -1] = 6
    arr[-1, 0] = 7
    print(arr)
    print(-1 % 3)
    grid = np.array([[False, False, False, False],
       [False,  True, False, False],
       [False, False,  True, False],
       [ True,  True,  True, False]])
    print(grid)
    height, width = grid.shape
    next_grid = np.zeros_like(grid)
    for i in range(height):
        for j in range(width):
            # Count the number of alive neighbors
            num_alive = (
                grid[(i-1)%height, (j-1)%width] +
                grid[(i-1)%height, j] +
                grid[(i-1)%height, (j+1)%width] +
                grid[i, (j-1)%width] +
                grid[i, (j+1)%width] +
                grid[(i+1)%height, (j-1)%width] +
                grid[(i+1)%height, j] +
                grid[(i+1)%height, (j+1)%width]
            )
    print(int(num_alive))

def main():
    display()
    print_all_elem([1, 2, [3, 4]])
    print(test_lamda(2, 1))
    test_zeiger_in_python()
    test_array()
    arr = eye(3, 4)
    print(type(arr))
    print(arr)
    arr = np.array([[1., 0.], [0., 1.]])
    print(type(arr.shape))
    print(arr.shape)
    for i in range(1 - 1, -1, -1):
        print(i)
    for j in range(1):
        print(j)
    m = np.zeros((1, 1))
    print(m[0, 0])
    test_np_index()


if __name__ == "__main__":
    main()