Untitled

mail@pastecode.io avatar
unknown
python
2 years ago
743 B
1
Indexable
Never
def simulate_sand(rocks:set, lowest:int, floor:int|None):
    # simulate sand
    origin = 500
    # counter for rest unit of sand
    rest, sand = 0, origin
    while True:
        # check if steps are possible (in order)
        for step in [0 + 1j, -1 +1j, 1 + 1j]:
            tmp_sand = sand + step
            if tmp_sand in rocks or (floor and tmp_sand.imag == floor):
                continue
            sand = tmp_sand
            break
        # otherwise rest and create new sand
        else:
            rest += 1
            rocks.add(sand)
            sand = origin

        # check if over
        if origin in rocks or (floor is None and sand.imag > lowest[sand.real]):
            break
    return rest