use strict; sub spiral { my$S=pop;my($z,$s,$t,$d,$x,$y,@b)=($S**2,1);@_=([1, 0],[0,1],[-1,0],[0,-1]);$b[$S][$_]=$b[$_][$S]=$/for 0..$S;map{$b[$y][$x]=sprintf"%0*d",length$z,$_;($s, $t)=@{$_[++$d%4]}if$s&&$b[$y][$x+$s]||$t&&$b[$y+$t] [$x];$x+=$s;$y+=$t}1..$z;pop@b;print"@$_"for@b; } for (1..10) { spiral($_); print "\n---\n"; }