Generate random chess position: Difference between revisions
Rename Perl 6 -> Raku, alphabetize, minor clean-up
(Add Factor) |
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
||
Line 11:
No requirement is made regarding the probability distribution of your method, but your program should be able to span a reasonably representative sample of all possible positions. For instance, programs that would always generate positions with say five pieces on the board, or with kings on a corner, would not be considered truly random.
=={{header|C}}==
Line 927 ⟶ 926:
{{out}}
<pre>p5Nq/1nn5/3N2bp/PRBkQr2/1QB1Pn2/Q5pK/1NRb2rN/p1R2r1N w - - 0 1</pre>
=={{header|Perl 6}}==▼
<lang perl6>sub pick-FEN {▼
# First we chose how many pieces to place▼
my $n = (2..32).pick;▼
# Then we pick $n squares▼
my @n = (^64).pick($n);▼
# We try to find suitable king positions on non-adjacent squares.▼
# If we could not find any, we return recursively▼
return pick-FEN() unless▼
my @kings[2] = first -> [$a, $b] {▼
$a !== $b && abs($a div 8 - $b div 8) | abs($a mod 8 - $b mod 8) > 1▼
}, (@n X @n);▼
# We make a list of pieces we can pick (apart from the kings)▼
my @pieces = <p P n N b B r R q Q>;▼
# We make a list of two king symbols to pick randomly a black or white king▼
my @k = <K k>.pick(*);▼
return (gather for ^64 -> $sq {▼
if $sq == @kings.any { take @k.shift }▼
elsif $sq == @n.any {▼
my $row = 7 - $sq div 8;▼
take▼
$row == 7 ?? @pieces.grep(none('P')).pick !!▼
$row == 0 ?? @pieces.grep(none('p')).pick !!▼
@pieces.pick;▼
}▼
else { take 'ø' }▼
}).rotor(8)».join».subst(/ø+/,{ .chars }, :g).join('/') ~ ' w - - 0 1';▼
}▼
say pick-FEN();</lang>▼
{{out}}▼
<pre>q2n1n2/1Qpk3Q/1r3bP1/1b1b4/2pRBR2/4P1bN/2R3K1/N1r2rPB w - - 0 1</pre>▼
=={{header|Phix}}==
Line 1,258 ⟶ 1,219:
[' ', 'P', ' ', ' ', ' ', ' ', ' ', 'P']
</pre>
(formerly Perl 6)
▲<lang perl6>sub pick-FEN {
▲ # First we chose how many pieces to place
▲ my $n = (2..32).pick;
▲ # Then we pick $n squares
▲ my @n = (^64).pick($n);
▲ # We try to find suitable king positions on non-adjacent squares.
▲ # If we could not find any, we return recursively
▲ return pick-FEN() unless
▲ my @kings[2] = first -> [$a, $b] {
▲ $a !== $b && abs($a div 8 - $b div 8) | abs($a mod 8 - $b mod 8) > 1
▲ }, (@n X @n);
▲ # We make a list of pieces we can pick (apart from the kings)
▲ my @pieces = <p P n N b B r R q Q>;
▲ # We make a list of two king symbols to pick randomly a black or white king
▲ my @k = <K k>.pick(*);
▲ return (gather for ^64 -> $sq {
▲ if $sq == @kings.any { take @k.shift }
▲ elsif $sq == @n.any {
▲ my $row = 7 - $sq div 8;
▲ take
▲ $row == 7 ?? @pieces.grep(none('P')).pick !!
▲ $row == 0 ?? @pieces.grep(none('p')).pick !!
▲ @pieces.pick;
▲ }
▲ else { take 'ø' }
▲ }).rotor(8)».join».subst(/ø+/,{ .chars }, :g).join('/') ~ ' w - - 0 1';
▲}
▲say pick-FEN();</lang>
▲{{out}}
▲<pre>q2n1n2/1Qpk3Q/1r3bP1/1b1b4/2pRBR2/4P1bN/2R3K1/N1r2rPB w - - 0 1</pre>
=={{header|REXX}}==
|