RosettaCodeData/Task/Find-Chess960-starting-position-identifier/Commodore-BASIC/find-chess960-starting-position-identifier.basic
2023-07-01 13:44:08 -04:00

56 lines
1.7 KiB
Text

100 REM DERIVE SP-ID FROM CHESS960 POS
110 READ A$: IF A$="" THEN END
120 PRINT A$":";
130 GOSUB 170
140 PRINT SP
150 GOTO 110
160 DATA QNRBBNKR, RNBQKBNR, RQNBBKRN, RNQBBKRN,
170 IF LEN(A$)=8 THEN 190
180 PRINT "ARRAY MUST BE 8 PIECES.": SP=-1: RETURN
190 K=0:Q=0:B=0:N=0:R=0
200 FOR I=0 TO 7
210 : K(I)=0:Q(I)=0:B(I)=0:N(I)=0:R(I)=0
220 NEXT I
230 FOR I=1 TO 8
240 : P$=MID$(A$,I,1)
250 : IF P$="Q" THEN Q(Q)=I: Q=Q+1: GOTO 310
260 : IF P$="K" THEN K(K)=I: K=K+1: GOTO 310
270 : IF P$="B" THEN B(B)=I: B=B+1: GOTO 310
280 : IF P$="N" THEN N(N)=I: N=N+1: GOTO 310
290 : IF P$="R" THEN R(R)=I: R=R+1: GOTO 310
300 : PRINT "ILLEGAL PIECE '"P$"'.": SP=-1: RETURN
310 NEXT I
320 IF K<>1 THEN PRINT "THERE MUST BE EXACTLY ONE KING.": SP=-1: RETURN
330 IF Q<>1 THEN PRINT "THERE MUST BE EXACTLY ONE QUEEN.": SP=-1: RETURN
340 IF B<>2 THEN PRINT "THERE MUST BE EXACTLY TWO BISHOPS.": SP=-1: RETURN
350 IF N<>2 THEN PRINT "THERE MUST BE EXACTLY TWO KNIGHTS.": SP=-1: RETURN
360 IF R<>2 THEN PRINT "THERE MUST BE EXACTLY TWO ROOKS.": SP=-1: RETURN
370 IF (K(0) > R(0)) AND (K(0) < R(1)) THEN 390
380 PRINT "KING MUST BE BETWEEN THE ROOKS.": SP=-1: RETURN
390 IF (B(0) AND 1) <> (B(1) AND 1) THEN 410
400 PRINT "BISHOPS MUST BE ON OPPOSITE COLORS.": SP=-1: RETURN
410 FOR I=0 TO 1
420 : N=N(I)
430 : IF N(I)>Q(I) THEN N=N-1
440 : FOR J=0 TO 1
450 : IF N(I)>B(J) THEN N=N-1
460 : NEXT J
470 : N(I)=N
480 NEXT I
490 N0=1: N1=2
500 FOR N=0 TO 9
510 : IF N0=N(0) AND N1=N(1) THEN 550
520 : N1=N1+1
530 : IF N1>5 THEN N0=N0+1: N1=N0+1
540 NEXT N
550 Q=Q(0)-1
560 FOR I=0 TO 1
570 : IF Q(0)>B(I) THEN Q=Q-1
580 NEXT I
590 FOR I=0 TO 1
600 : B=B(I)-1
610 : IF B AND 1 THEN L=INT(B/2)
620 : IF (B AND 1)=0 THEN D=B/2
630 NEXT I
640 SP = 96*N+16*Q+4*D+L
650 RETURN