Magic squares/Perl: Difference between revisions

m
Fix link: Perl 6 --> Raku
(Added Perl example)
 
m (Fix link: Perl 6 --> Raku)
 
(3 intermediate revisions by 2 users not shown)
Line 7:
</ul>
 
 
=={{header|Perl}}==
<span style='font-family: "Linux Libertine",Georgia,Times,serif;font-size:150%;'>[[Perl]]</span><hr>
{{trans|Perl 6Raku}}
<lang perl>use strict;
use warnings;
Line 19 ⟶ 20:
$h = int($n / 2);
$q = int($n / 4);
generate_squaregenerate_magic($n);
validate_magic();
printf("N = $n, magic number = %d\n", sum @{$sq[0]});
printf(("%@{[1+length($n**2)]}d"x$n)."\n",@$_) for @sq;
Line 25 ⟶ 27:
}
 
sub generate_squaregenerate_magic {
my($n) = @_;
 
Line 48 ⟶ 50:
for my $r (0..$q-1) {
for my $c ($q .. $n-$q-1) {
myswap( ($rp =r,$c), ($n - 1 - $r,$n-1-$c) );
myswap( ($cp =c,$r), ($n - 1 - $c,$n-1-$r) );
($sq[$r][$c], $sq[$rp][$cp]) = ($sq[$rp][$cp], $sq[$r][$c]);
($sq[$c][$r], $sq[$cp][$rp]) = ($sq[$cp][$rp], $sq[$c][$r]);
}
}
 
} elsif (0 == int($n%2) && $n%4) { # singly even
generate_squaregenerate_magic($h);
$i *= 4;
for my $r (0..$h-1) {
Line 66:
for my $c (0..$q-1) {
next if $c == 0 and $r == int(($h-1)/2);
swap( ($sq[$r][$c], $sq[$r+$h][$c]) =, ($sq[$r+$h][,$c],) $sq[$r][$c]);
}
if ($h > 4) {
for myswap( ($cr,$_), (($nr+$h,$_) -) for $n-$q + 1) .. $n-1) {;
($sq[$r][$c], $sq[$r+$h][$c]) = ($sq[$r+$h][$c], $sq[$r][$c]);
}
}
}
swap( ($sq[$q][$q], $sq[$q+$h][$q]) =, ($sq[$q+$h][,$q],) $sq[$q][$q]);
}
}
 
sub swap {
my($a,$b,$c,$d) = @_;
($sq[$ra][$cb], $sq[$rpc][$cpd]) = ($sq[$rpc][$cpd], $sq[$ra][$cb]);
}
 
sub validate_magic {
my $magic = sum @{$sq[0]};
my @transpose;
foreach my $j (0..$#{$sq[0]}) {
push(@transpose, [map $_->[$j], @sq]);
}
for (0..$#sq) {
die unless $magic == sum @{ $sq[$_]} and $magic == sum @{$transpose[$_]}
}
}</lang>
2,392

edits