Magic squares/Raku: Difference between revisions

m
syntax highlighting
m (→‎{{header|Perl 6}}: Add links to the various tasks)
m (syntax highlighting)
 
(6 intermediate revisions by the same user not shown)
Line 1:
Rather than having multiple examples for different orders of magic square, this will generate a magic square for ''any'' valid n x n grid.
 
Invoke at the command line and pass in the desired size as a parameter.
 
Line 5 ⟶ 6:
 
See:<ul>
<li>[[Magic_squares_of_odd_order#Perl_6Raku|Magic squares of odd order#Perl 6Raku]]</li>
<li>[[Magic_squares_of_singly_even_order#Perl_6Raku|Magic squares of singly even order#Perl 6Raku]]</li>
<li>[[Magic_squares_of_doubly_even_order#Perl_6Raku|Magic squares of doubly even order#Perl 6Raku]]</li>
</ul>
 
<syntaxhighlight lang="raku" perl6line>sub MAIN (Int $n where {$n > 0}) {
 
my @sq;
my $i = 1;
my $h = $n div 2;
my $q if= $hn >div 4 {;
gen-sq($n);
 
Line 21 ⟶ 25:
 
 
multi sub gen-sq (2) { # invalid
note "Sorry, can not generate a 2 x 2 magic square." and exit;
}
 
multi sub gen-sq ($n where {$n % 2}) { # odd
my $x = $n/2;
my $y = 0;
@sq[($i % $n ?? $y-- !! $y++) % $n][($i % $n ?? $x++ !! $x) % $n] = $i++ for ^($n * $n)²;
}
 
multi sub gen-sq ($n where {$n %% 4}) { # doubly even
my $x = 0;
my $y = 0;
@sq[$i % $n ?? $y !! $y++][($i-1) % $n] = $i++ for ^($n * $n)²;
myfor ^$t;q -> $r {
for 0$q ..^ $n div- 4$q -> $rc {
for $n div 4 ..^my $nŕ -= $n div- 41 -> $c {r;
(@sq[my $r;$c],ć = @sq[$n - 1 - $rc;$n-1-$c]) =
(@sq[$n-1-$r;$n-1-$c], @sq[$ŕ;$ć]) = (@sq[$ŕ;$ć], @sq[$r;$c]);
(@sq[$c;$r], @sq[$n-1-ć;$cŕ]) = (@sq[$ć;$n-1-ŕ], @sq[$c;$r]) =;
(@sq[$n-1-$c;$n-1-$r], @sq[$c;$r]);
}
}
}
 
multi sub gen-sq ($n where {$n %% 2 and $n % 4}) { # singly even
my $h = $n div 2;
gen-sq($h);
$i *= 4;
for ^$h -> $r {
for ^$h -> $c {
@sq[$r + $h; $c] = @sq[$r;$c] + $h² * 3;
@sq[$r; $c + $h] = @sq[$r;$c] + $h² * 2;
@sq[$r + $h; $c + $h] = @sq[$r;$c] + $h²;
}
for ^(($h-1)/2)q -> $c {
next if $c == 0 and $r == ($h-1) div 2;
(@sq[$r][;$c], @sq[$r + $h][;$c]) = (@sq[$r + $h][;$c], @sq[$r][;$c]);
}
} if $h > 4 {
(@sq[ for ($hn -1)/2][( $h-q + 1)/2], @sq[(..^ $hn -1)/2+> $h][($h-1)/2])c ={
(@sq[($h-1)/2+r;$hc], @sq[($r + $h-1)/2;$c],) = (@sq[($r + $h-1)/2;$c], @sq[($h-1)/2r;$c]);
if $h > 4 {
for ^$h -> $r {
for ($n - ($h-3) / 2) ..^ $n -> $c {
(@sq[$r][$c], @sq[$r + $h][$c]) =
(@sq[$r + $h][$c], @sq[$r][$c]);
}
}
}
(@sq[$q;$q], @sq[$q+$h;$q]) = (@sq[$n-1-q+$ch;$n-1-$rq], @sq[$cq;$rq]);
}
}</langsyntaxhighlight>
10,327

edits