40 lines
997 B
Python
40 lines
997 B
Python
from array import array
|
|
import sys
|
|
|
|
# Can handle 10k sand grains in 2s.
|
|
|
|
|
|
def show_terrain(terrain, width):
|
|
for x in range(width):
|
|
for y in range(width):
|
|
print(" ·●⬤"[terrain[x * width + y]], end="")
|
|
print()
|
|
|
|
|
|
def apply_gravity(terrain, width):
|
|
while True:
|
|
did_someting = False
|
|
for x in range(width ** 2):
|
|
if terrain[x] >= 4:
|
|
div, terrain[x] = divmod(terrain[x], 4)
|
|
terrain[x - 1] += div
|
|
terrain[x + 1] += div
|
|
terrain[x - width] += div
|
|
terrain[x + width] += div
|
|
did_someting = True
|
|
if not did_someting:
|
|
return
|
|
|
|
|
|
def main(height, show=True):
|
|
width = int(height ** .5) + 1
|
|
terrain = array("Q", [0] * width ** 2)
|
|
terrain[width // 2 * width + width // 2] = height
|
|
apply_gravity(terrain, width)
|
|
if show:
|
|
show_terrain(terrain, width)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main(int(sys.argv[1]))
|