I'm working on modernizing Rosetta Code's infrastructure. Starting with communications. Please accept this time-limited open invite to RC's Slack.. --Michael Mol (talk) 20:59, 30 May 2020 (UTC)

Talk:Abelian sandpile model

From Rosetta Code

optimizations ?[edit]

the figures are 8xtimes symmetric like drawing a circle. But how to calculate the generating triangle. See 16->

00100
02120
11011
02120
00100

the origin is the starting point of the sandpile.
is rotated and mirrored of
X20
011
mirrored at main diagonal
100
120
011
rotated 3 times by 90┬░ around the origin.

A more readable Python solution.[edit]

This solution is more interactive, as it can also be used in imports on a Python console; plus, it is more readable.

 
from os import system, name
from time import sleep
 
def clear():
if name == 'nt':
_ = system('cls')
else: _ = system('clear')
 
def exit():
import sys
clear()
sys.exit()
 
def make_area(x, y):
area = [[0]*x for _ in range(y)]
return area
 
def make_sandpile(area, loc, height):
loc=list(n-1 for n in loc)
x, y = loc
 
try: area[y][x]+=height
except IndexError: pass
 
def run(area, by_frame=False):
def run_frame():
for y_index, group in enumerate(area):
y = y_index+1
 
for x_index, height in enumerate(group):
x = x_index+1
 
if height < 4: continue
 
else:
make_sandpile(area, (x+1, y), 1)
make_sandpile(area, (x, y+1), 1)
 
if x_index-1 >= 0:
make_sandpile(area, (x-1, y), 1)
if y_index-1 >= 0:
make_sandpile(area, (x, y-1), 1)
 
make_sandpile(area, (x, y), -4)
 
while any([any([pile>=4 for pile in group]) for group in area]):
if by_frame:
clear()
run_frame()
if by_frame:
show_area(area); sleep(.05)
 
def show_area(area):
display = [' '.join([str(item) if item else ' ' for item in group])
for group in area]
[print(i) for i in display]
 
clear()
if __name__ == '__main__':
area = make_area(10, 10)
print('\nBefore:')
show_area(area)
make_sandpile(area, (5, 5), 64); run(area)
print('\nAfter:')
show_area(area)
 

Output:

 
Before:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
 
After:
0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 1 0 0 0 0
0 0 2 2 2 2 2 0 0 0
0 1 2 2 2 2 2 1 0 0
0 2 2 2 0 2 2 2 0 0
0 1 2 2 2 2 2 1 0 0
0 0 2 2 2 2 2 0 0 0
0 0 0 1 2 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
 

> You can just add your Python draft as an additional variant. As the Rosetta Code landing page puts it: 'to aid a person with a grounding in one approach to a problem in learning another'. The goal is to provide comparative insight rather than to construct any claim to exclusive canonicity Hout (talk) 21:53, 15 January 2020 (UTC)

Thanks for the information, I have added my code underneath the original.