Find Chess960 starting position identifier: Difference between revisions

Content added Content deleted
(→‎{{header|Raku}}: streamline, style)
(→‎{{header|QBasic}}: Take advantage of mixed case, and add explicit output, since the code no longer matches the Commodore solution.)
Line 178: Line 178:
{{works with|QBasic|1.1}}
{{works with|QBasic|1.1}}
{{trans|Commodore BASIC}}
{{trans|Commodore BASIC}}
<lang qbasic>CLS
<lang qbasic>Cls
PRINT "ENTER START ARRAY AS SEEN BY WHITE."
Print "Enter start array as seen by white."
120 PRINT
120 Print
PRINT "STARTING ARRAY:";
Print "Starting array";
INPUT AR$
Input Ar$
Print
PRINT
IF LEN(AR$) = 0 THEN END
If Len(Ar$) = 0 Then End
IF LEN(AR$) = 8 THEN 170
If Len(Ar$) = 8 Then 170
PRINT "ARRAY MUST BE 8 PIECES.": GOTO 120
Print "Array must be 8 pieces.": GoTo 120


170 FOR I = 1 TO 8
170 For I = 1 To 8
P$ = MID$(AR$, I, 1)
P$ = Mid$(Ar$, I, 1)
IF P$ = "Q" THEN Q(Q) = I: Q = Q + 1: GOTO 250
If P$ = "Q" Or P$ = "q" Then Q(Q) = I: Q = Q + 1: GoTo 250
IF P$ = "K" THEN K(K) = I: K = K + 1: GOTO 250
If P$ = "K" Or P$ = "k" Then K(K) = I: K = K + 1: GoTo 250
IF P$ = "B" THEN B(B) = I: B = B + 1: GOTO 250
If P$ = "B" Or P$ = "b" Then B(B) = I: B = B + 1: GoTo 250
IF P$ = "N" THEN N(N) = I: N = N + 1: GOTO 250
If P$ = "N" Or P$ = "n" Then N(N) = I: N = N + 1: GoTo 250
IF P$ = "R" THEN R(R) = I: R = R + 1: GOTO 250
If P$ = "R" Or P$ = "r" Then R(R) = I: R = R + 1: GoTo 250
PRINT "ILLEGAL PIECE '"; P$; "'.": GOTO 120
Print "Illegal piece '"; P$; "'.": GoTo 120
250 NEXT I
250 Next I


IF K <> 1 THEN PRINT "THERE MUST BE EXACTLY ONE KING.": GOTO 120
If K <> 1 Then Print "There must be exactly one King.": GoTo 120
IF Q <> 1 THEN PRINT "THERE MUST BE EXACTLY ONE QUEEN.": GOTO 120
If Q <> 1 Then Print "There must be exactly one Queen.": GoTo 120
IF B <> 2 THEN PRINT "THERE MUST BE EXACTLY TWO BISHOPS.": GOTO 120
If B <> 2 Then Print "There must be exactly two Bishops.": GoTo 120
IF N <> 2 THEN PRINT "THERE MUST BE EXACTLY TWO KNIGHTS.": GOTO 120
If N <> 2 Then Print "There must be exactly two Knights.": GoTo 120
IF R <> 2 THEN PRINT "THERE MUST BE EXACTLY TWO ROOKS.": GOTO 120
If R <> 2 Then Print "There must be exactly two Rooks.": GoTo 120
IF (K(0) > R(0)) AND (K(0) < R(1)) THEN 330
If (K(0) > R(0)) And (K(0) < R(1)) Then 330
PRINT "KING MUST BE BETWEEN THE ROOKS.": GOTO 120
Print "King must be between the Rooks.": GoTo 120


330 IF (B(0) AND 1) <> (B(1) AND 1) THEN 350
330 If (B(0) And 1) <> (B(1) And 1) Then 350
PRINT "BISHOPS MUST BE ON OPPOSITE COLORS.": GOTO 120
Print "Bishops must be on opposite colors.": GoTo 120


350 FOR I = 0 TO 1
350 For I = 0 To 1
N = N(I)
N = N(I)
IF N(I) > Q(I) THEN N = N - 1
If N(I) > Q(I) Then N = N - 1
FOR J = 0 TO 1
For J = 0 To 1
IF N(I) > B(J) THEN N = N - 1
If N(I) > B(J) Then N = N - 1
Next J
NEXT J
N(I) = N
N(I) = N
NEXT I
Next I
N0 = 1: N1 = 2
N0 = 1: N1 = 2


FOR N = 0 TO 9
For N = 0 To 9
IF N0 = N(0) AND N1 = N(1) THEN 490
If N0 = N(0) And N1 = N(1) Then 490
N1 = N1 + 1
N1 = N1 + 1
IF N1 > 5 THEN N0 = N0 + 1: N1 = N0 + 1
If N1 > 5 Then N0 = N0 + 1: N1 = N0 + 1
NEXT N
Next N
490 Q = Q(0) - 1
490 Q = Q(0) - 1


FOR I = 0 TO 1
For I = 0 To 1
IF Q(0) > B(I) THEN Q = Q - 1
If Q(0) > B(I) Then Q = Q - 1
NEXT I
Next I


FOR I = 0 TO 1
For I = 0 To 1
B = B(I) - 1
B = B(I) - 1
IF B AND 1 THEN L = INT(B / 2)
If B And 1 Then L = Int(B / 2)
IF (B AND 1) = 0 THEN D = B / 2
If (B And 1) = 0 Then D = B / 2
NEXT I
Next I
PRINT "SPID ="; 96 * N + 16 * Q + 4 * D + L
Print "SP-ID ="; 96 * N + 16 * Q + 4 * D + L
End
END</lang>

</lang>
{{out}}
{{out}}
<pre>Enter start array as seen by White.
<pre>

Igual que la entrada de Commodore BASIC.
Starting array? qnrbbnkr

SP-ID = 105

Starting array? RNBQKBNR

SP-ID = 518

Starting array? RQNBBKRN

SP-ID = 601

Starting array? RNQBBKRN

SP-ID = 617
</pre>
</pre>