Find Chess960 starting position identifier: Difference between revisions
Find Chess960 starting position identifier (view source)
Revision as of 19:43, 24 July 2022
, 1 year ago→{{header|Perl}}: tweaks
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: tweaks) |
|||
Line 621:
=={{header|Perl}}==
{{trans|Raku}}
<lang perl>use
use List::AllUtils 'indexes';
sub sp_id ($setup) {
8 == length $setup
1 == @{[ $setup =~ /$_/g ]} or return "Illegal position: should have exactly one $_" for <K Q>;
index($setup,'B')%2
▲ $setup =~ m/R .* K .* R/x or die 'Illegal position: King not between rooks.';
index($setup,'B')%2 != rindex($setup,'B')%2 or die 'Illegal position: Bishops not on opposite colors.';▼
my @knights = indexes { 'N' eq $_ } split '', $setup =~ s/[QB]//gr;
my $knight = indexes { join('', @knights) eq $_ } <01 02 03 04 12 13 14 23 24 34>; # combinations(5,2)
my @bishops = indexes { 'B' eq $_ } split '', $setup;
my $dark = int ((grep { $_ % 2 == 0 } @bishops)[0]) / 2;
my $light = int ((grep { $_ % 2 == 1 } @bishops)[0]) / 2;
my $queen = index(($setup =~ s/B//gr), 'Q');
int 4*(4*(6*$knight + $queen)+$dark)+$light;
}
say "$_ " . sp_id($_) for <QNRBBNKR RNBQKBNR RQNBBKRN RNQBBKRN QNBRBNKR>;</lang>
{{out}}
<pre>QNRBBNKR 105
RNBQKBNR 518
RQNBBKRN 601
RNQBBKRN 617
▲QNBRBNKR
=={{header|Phix}}==
|