Magic squares/Raku: Difference between revisions

m
→‎{{header|Perl 6}}: Meh. tried to be cute and ended up wrong.
m (→‎{{header|Perl 6}}: Clean up and refactor a bit. Randomize the magic square generation.)
m (→‎{{header|Perl 6}}: Meh. tried to be cute and ended up wrong.)
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. Note that it generates a randomized, though correct magic square.
 
Invoke at the command line and pass in the desired size as a parameter.
 
Line 14 ⟶ 15:
my @sq;
my $i = 1;
my $h = $n div 2;
my $q = $n div 4;
gen-sq($n);
 
say $_[@r].fmt("%{$i.chars}d", ' ') for @sq.pick(*);
my @r = ^$n .pick(*);
 
say $_[@r].fmt("%{$i.chars}d", ' ') for @sq.pick(*);
 
say "\nThe magic number is ", [+] @sq[0].list;
Line 37 ⟶ 39:
my $y = 0;
@sq[$i % $n ?? $y !! $y++][($i-1) % $n] = $i++ for ^$n²;
my $q = $n div 4;
for ^$q -> $r {
for $q ..^ $n - $q -> $c {
Line 49 ⟶ 50:
 
multi sub gen-sq ($n where {$n %% 2 and $n % 4}) { # singly even
my $h = $n div 2;
my $q = $n div 4;
gen-sq($h);
$i *= 4;
Line 63 ⟶ 62:
(@sq[$r;$c], @sq[$r + $h;$c]) = (@sq[$r + $h;$c], @sq[$r;$c]);
}
} if $h > 4 {
(@sq[$q;$q], @sq[$q+$h;$q]) = (@sq[$q+$h;$q], @sq[$q;$q]);
if $h > 4 {
for ^$h -> $r {
for ($n - $q + 1) ..^ $n -> $c {
(@sq[$r;$c], @sq[$r + $h;$c]) = (@sq[$r + $h;$c], @sq[$r;$c]);
}
}
}
(@sq[$q;$q], @sq[$q+$h;$q]) = (@sq[$q+$h;$q], @sq[$q;$q]);
}
}</lang>
10,327

edits