Random Latin squares: Difference between revisions
Content added Content deleted
m (→{{header|Factor}}: wording) |
SqrtNegInf (talk | contribs) (Added Perl example) |
||
Line 795: | Line 795: | ||
14 1 9 6 10 5 11 3 16 2 4 13 12 15 8 7 |
14 1 9 6 10 5 11 3 16 2 4 13 12 15 8 7 |
||
</pre > |
</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}}== |
=={{header|Perl 6}}== |