#!/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 {
    system("clear");
    for (my $x = 0; $x < $H; ++$x) {
	for (my $y = 0; $y < $W; ++$y) {
	    print $canvas->[$x]->[$y];
	}
	print "\n";
    }
}

sub make_canvas {
    my $result = [];
    for (my $x = 0; $x < $H; ++$x) {
	$result->[$x] = [];
	for (my $y = 0; $y < $W; ++$y) {
	    $result->[$x]->[$y] = " ";
	}
    }

    return $result;
}

sub draw {
    my ($K) = @_;

    my $N = 0;

    my $x = int($H / 2);
    my $y = int($W / 2);

    my @groups = (
	{ x =>  1,  y =>  1 },
	{ x =>  1,  y => -1 },
	{ x => -1,  y => -1 },
	{ x => -1,  y =>  1 },
    );

    $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};
		$py += $el->{y};

		$canvas->[$px]->[$py] = "#";

		$counter = $counter - 1;
		$K = $K - 1;
		if ($K == 0) {
		    return;
		}
	    }
	}
	$N++;
    }
}
