Random Latin squares: Difference between revisions

Added Perl example
(Added Perl example)
Line 795:
14 1 9 6 10 5 11 3 16 2 4 13 12 15 8 7
</pre >
 
=={{header|Perl}}==
{{trans|Perl 6}}
<lang perl>use strict;
use warnings;
use feature 'say';
use List::Util 'shuffle';
 
sub random_ls {
my($n) = @_;
my(@cols,@symbols,@ls_sym);
 
# build n-sized latin square
my @ls = [0,];
for my $i (1..$n-1) {
@{$ls[$i]} = @{$ls[0]};
splice(@{$ls[$_]}, $_, 0, $i) for 0..$i;
}
 
# shuffle rows and columns
@cols = shuffle 0..$n-1;
@ls = map [ @{$_}[@cols] ], @ls[shuffle 0..$n-1];
 
# replace numbers with symbols
@symbols = shuffle( ('A'..'Z')[0..$n-1] );
push @ls_sym, [@symbols[@$_]] for @ls;
@ls_sym
}
 
sub display {
my $str;
$str .= join(' ', @$_) . "\n" for @_;
$str
}
 
say display random_ls($_) for 2..5, 5;</lang>
{{out}}
<pre>B A
A B
 
A B C
B C A
C A B
 
A B D C
B D C A
C A B D
D C A B
 
C E A B D
E A D C B
B C E D A
D B C A E
A D B E C
 
E D C B A
C E B A D
A B D E C
B C A D E
D A E C B</pre>
 
=={{header|Perl 6}}==
2,392

edits