A recursive solution:
use strict;
use warnings;
my $n = shift;
my $count = 1;
my @matrix;
push @matrix, [(0)] for (1..$n);
buildRing (0, $n - 1);
my $width = length sprintf ("%s", '' . $count);
my $format = "%${width}d";
print "" . (join " ", map {sprintf $format, $_} @{$matrix[$_]}) . "\n"
+ for (0..($n-1));
sub buildRing
{
my ($first, $last) = @_;
$matrix[$first][$_] = $count++ for ($first..$last);
$matrix[$_][$last] = $count++ for (($first+1)..$last);
$matrix[$last][$last-$_+$first-1] = $count++ for ($first..$last-1);
for ($_ = --$last; $_ > $first; --$_)
{$matrix[$_][$first] = $count++}
$matrix[$first][$last] = $count if (++$first == $last);
buildRing ($first, $last) if ($first<$last);
}
use strict;
use warnings;
my $n = shift || 5;
my ($count, $first, $last) = (1, 0, $n - 1);
my @matrix;
push @matrix, [(0)] for (1..$n);
{
$matrix[$first][$_] = $count++ for ($first..$last);
$matrix[$_][$last] = $count++ for (($first+1)..$last);
$matrix[$last][$last-$_+$first-1] = $count++ for ($first..$last-1);
for ($_ = --$last; $_ > $first; --$_)
{$matrix[$_][$first] = $count++}
$matrix[$first][$last] = $count if (++$first == $last);
redo unless $first >= $last;
}
my $width = (int log $count) - 1;
print "" . (join " ", map {sprintf "%${width}d", $_} @{$matrix[$_]}) .
+ "\n" for (0..($n-1));
$n=shift;($c,$f,$l,@m)=(1,0,--$n);
{$m[$f][$_]=$c++for($f..$l);$m[$_][$l]=$c++for($f+1..$l);
$m[$l][$l-$_+$f-1]=$c++for($f..$l-1);for($_=--$l;$_>$f;--$_){$m[$_][$f
+]=$c++}
$m[$f][$l]=$c if(++$f==$l);redo unless$f>$l}my$w=(int log$c);
print"".(join"",map{sprintf"%${w}d",$_}@{$m[$_]})."\n"for(0..$n)
Update: added (smaller) non-recursive version and golf version
Perl is Huffman encoded by design.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.