Qui je n’ai pas encore tanné avec mes tas de sables ?
Pour ceux qui suivent, et pour les autres, j’explore en ce moment les tas de sables abéliens, du moins une petite partie, celle qui consiste à construire une « colonne » de grains de sable, puis de la regarder s’effondrer.
La seule règle pour l’effondrement est : « Si une pile fait plus de 4 grains de haut, elle s’écroule en envoyant un grain au nord, un au sud, un à l’ouest, et un à l’est ».
Donc en Python on peut construire un tas assez simplement :
width = 150
terrain = np.zeros((width, width), dtype=np.int64)
terrain[width // 2, width // 2] = 20_000
et le faire s’écrouler tout aussi simplement :
for x in range(width):
for y in range(width):
if terrain[x][y] >= 4:
terrain[x][y] -= 4
terrain[x - 1][y] += 1
terrain[x + 1][y] += 1
terrain[x][y + 1] += 1
terrain[x][y - 1] += 1
Un seul écroulement n’est peut-être pas suffisant, on peut donc recommencer à écrouler jusqu’à ce que le tas soit bien étalé, qu’il soit « stable », que toutes les piles fassent moins de 4 grains.
Alors déjà en augmentant le nombre de grains placés au centre on constate deux choses :
- C’est lent (très lent).
- C’est beau (très beau).
Côté lenteur, je vous laisse tester.
Côté beauté voilà ce que ça donne avec 2**26
grains de sable (après 22h de calcul) :
Oui il n’y a que 4 couleurs, et oui mon choix de couleur n’est probablement pas le meilleur :
- blanc pour 0 grain,
- bleu clair pour 1 grain,
- bleu pour 2 grains,
- bleu foncé pour 3 grains.
Pour ceux que ça titille, j’ai posté plusieurs implémentations par ici : https://git.afpy.org/mdk/fast-abelian-sandpile/, y’a du Python et du C.