Abelian sandpile model: Difference between revisions
Content added Content deleted
(Added Fōrmulæ) |
Thundergnat (talk | contribs) (→{{header|Perl 6}}: Add a Perl 6 example) |
||
Line 689: | Line 689: | ||
select undef, undef, undef, 0.1; # comment out for full speed |
select undef, undef, undef, 0.1; # comment out for full speed |
||
}</lang> |
}</lang> |
||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2019.07.1}} |
|||
Defaults to a stack of 1000 and showing progress. Pass in a custom stack size if desired and -hide-progress to run without displaying progress (much faster.) |
|||
<lang perl6>sub cleanup { print "\e[0m\e[?25h\n"; exit(0) } |
|||
signal(SIGINT).tap: { cleanup(); exit(0) } |
|||
unit sub MAIN ($stack = 1000, :$hide-progress = False ); |
|||
my @color = "\e[38;2;0;0;0m█", |
|||
"\e[38;2;255;0;0m█", |
|||
"\e[38;2;255;255;0m█", |
|||
"\e[38;2;0;0;255m█", |
|||
"\e[38;2;255;255;255m█" |
|||
; |
|||
my ($h, $w) = qx/stty size/.words».Int; |
|||
my $buf = $w * $h; |
|||
my @buffer = 0 xx $buf; |
|||
my $done; |
|||
@buffer[$w * ($h div 2) + ($w div 2) - 1] = $stack; |
|||
print "\e[?25l\e[48;5;232m"; |
|||
repeat { |
|||
$done = True; |
|||
loop (my int $row; $row < $h; $row = $row + 1) { |
|||
my int $rs = $row * $w; # row start |
|||
my int $re = $rs + $w; # row end |
|||
loop (my int $idx = $rs; $idx < $re; $idx = $idx + 1) { |
|||
if @buffer[$idx] >= 4 { |
|||
++@buffer[ $idx - $w ] if $row > 0; |
|||
++@buffer[ $idx - 1 ] if $idx - 1 > $rs; |
|||
++@buffer[ $idx + $w ] if $row < $h - 1; |
|||
++@buffer[ $idx + 1 ] if $idx + 1 < $buf; |
|||
@buffer[ $idx ] -= 4; |
|||
$done = False; |
|||
} |
|||
} |
|||
} |
|||
unless $hide-progress { |
|||
print join '', @buffer.map( { @color[$_ min 4] }) |
|||
} |
|||
} until $done; |
|||
print join '', @buffer.map( { @color[$_ min 4] }); |
|||
cleanup;</lang> |
|||
Passing in 2048 as a stack size results in: [https://github.com/thundergnat/rc/blob/master/img/Abelian-sandpile-model-perl6.png Abelian-sandpile-model-perl6.png] (offsite .png image) |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |