#!/bin/env perl
use strict;
use warnings;
use Time:: HiRes qw/usleep/ ;
my $W = 100 ;
my $H = 40 ;
my $canvas = make_canvas( ) ;
my $i = 2 ;
while ( $i != 1000 )
{
draw( $i ) ;
print_canvas( ) ;
usleep( 1000000 ) ;
$i += 10 ;
}
sub print_canvas {
for ( my $x = 0 ; $x < $H ; ++ $x ) {
for ( my $y = 0 ; $y < $W ; ++ $y ) {
print $canvas -> [ $x ] -> [ $y ] ; }
}
}
sub make_canvas {
my $result = [ ] ;
for ( my $x = 0 ; $x < $H ; ++ $x ) {
$result -> [ $x ] = [ ] ;
for ( my $y = 0 ; $y < $W ; ++ $y ) {
$result -> [ $x ] -> [ $y ] = " " ;
}
}
}
sub draw {
my ( $K ) = @_ ;
my $N = 0 ;
my @groups = (
) ;
$canvas -> [ $x ] -> [ $y ] = "#" ;
$K = $K - 1 ;
while ( 1 )
{
my $px = $x - $N ;
my $py = $y ;
foreach my $el ( @groups )
{
my $counter = $N ;
while ( $counter != 0 )
{
$px += $el -> { x} ;
$canvas -> [ $px ] -> [ $py ] = "#" ;
$counter = $counter - 1 ;
$K = $K - 1 ;
if ( $K == 0 ) {
}
}
}
$N ++;
}
}
IyEvYmluL2VudiBwZXJsCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBUaW1lOjpIaVJlcyBxdy91c2xlZXAvOwoKbXkgJFcgPSAxMDA7Cm15ICRIID0gNDA7CgpteSAkY2FudmFzID0gbWFrZV9jYW52YXMoKTsKCm15ICRpID0gMjsKCndoaWxlICgkaSAhPSAxMDAwKQp7CiAgICBkcmF3KCRpKTsKICAgIHByaW50X2NhbnZhcygpOwogICAgdXNsZWVwKDEwMDAwMDApOwogICAgJGkgKz0gMTA7Cn0KCnN1YiBwcmludF9jYW52YXMgewogICAgc3lzdGVtKCJjbGVhciIpOwogICAgZm9yIChteSAkeCA9IDA7ICR4IDwgJEg7ICsrJHgpIHsKCWZvciAobXkgJHkgPSAwOyAkeSA8ICRXOyArKyR5KSB7CgkgICAgcHJpbnQgJGNhbnZhcy0+WyR4XS0+WyR5XTsKCX0KCXByaW50ICJcbiI7CiAgICB9Cn0KCnN1YiBtYWtlX2NhbnZhcyB7CiAgICBteSAkcmVzdWx0ID0gW107CiAgICBmb3IgKG15ICR4ID0gMDsgJHggPCAkSDsgKyskeCkgewoJJHJlc3VsdC0+WyR4XSA9IFtdOwoJZm9yIChteSAkeSA9IDA7ICR5IDwgJFc7ICsrJHkpIHsKCSAgICAkcmVzdWx0LT5bJHhdLT5bJHldID0gIiAiOwoJfQogICAgfQoKICAgIHJldHVybiAkcmVzdWx0Owp9CgpzdWIgZHJhdyB7CiAgICBteSAoJEspID0gQF87CgogICAgbXkgJE4gPSAwOwoKICAgIG15ICR4ID0gaW50KCRIIC8gMik7CiAgICBteSAkeSA9IGludCgkVyAvIDIpOwoKICAgIG15IEBncm91cHMgPSAoCgl7IHggPT4gIDEsICB5ID0+ICAxIH0sCgl7IHggPT4gIDEsICB5ID0+IC0xIH0sCgl7IHggPT4gLTEsICB5ID0+IC0xIH0sCgl7IHggPT4gLTEsICB5ID0+ICAxIH0sCiAgICApOwoKICAgICRjYW52YXMtPlskeF0tPlskeV0gPSAiIyI7CiAgICAkSyA9ICRLIC0gMTsKCiAgICB3aGlsZSAoMSkKICAgIHsKCW15ICRweCA9ICR4IC0gJE47CglteSAkcHkgPSAkeTsKCWZvcmVhY2ggbXkgJGVsIChAZ3JvdXBzKQoJewoJICAgIG15ICRjb3VudGVyID0gJE47CgkgICAgd2hpbGUgKCRjb3VudGVyICE9IDApCgkgICAgewoJCSRweCArPSAkZWwtPnt4fTsKCQkkcHkgKz0gJGVsLT57eX07CgoJCSRjYW52YXMtPlskcHhdLT5bJHB5XSA9ICIjIjsKCgkJJGNvdW50ZXIgPSAkY291bnRlciAtIDE7CgkJJEsgPSAkSyAtIDE7CgkJaWYgKCRLID09IDApIHsKCQkgICAgcmV0dXJuOwoJCX0KCSAgICB9Cgl9CgkkTisrOwogICAgfQp9Cg==