Jump to content

Find Chess960 starting position identifier: Difference between revisions

→‎{{header|Commodore BASIC}}: read demo data instead of prompting user
(→‎{{header|Julia}}: Correct algorithm.)
(→‎{{header|Commodore BASIC}}: read demo data instead of prompting user)
Line 30:
 
<lang basic>100 REM DERIVE SP-ID FROM CHESS960 POS
140110 READ A$: IF LEN(ARA$)=0"" THEN END
110 PRINT "ENTER START ARRAY AS SEEN BY WHITE."
120 PRINT: PRINT A$"STARTING ARRAY:";
130 GOSUB 170
130 OPEN 1,0: INPUT#1, AR$: CLOSE 1: PRINT
140 PRINT SP
140 IF LEN(AR$)=0 THEN END
150 GOTO 110
150 IF LEN(AR$)=8 THEN 170
160 DATA QNRBBNKR, RNBQKBNR, RQNBBKRN, RNQBBKRN,
160 PRINT "ARRAY MUST BE 8 PIECES.": GOTO 120
170 FORIF ILEN(A$)=18 TOTHEN 8190
160180 PRINT "ARRAY MUST BE 8 PIECES.": GOTOSP=-1: 120RETURN
180 : P$=MID$(AR$,I,1)
190 K=0: IF P$="Q" THEN Q(Q)=I0: QB=Q+10: GOTO 250N=0:R=0
350200 FOR I=0 TO 17
200 : IF P$="K" THEN K(K)=I: K=K+1: GOTO 250
210 : IF P$="B" THEN BK(BI)=0:Q(I)=0: B(I)=B+10: GOTO 250N(I)=0:R(I)=0
250220 NEXT I
220 : IF P$="N" THEN N(N)=I: N=N+1: GOTO 250
230 :FOR IF P$="R" THEN R(R)=I: R=R+1: GOTOTO 2508
180240 : P$=MID$(ARA$,I,1)
240 : PRINT "ILLEGAL PIECE '"P$"'.": GOTO 120
200250 : IF P$="KQ" THEN KQ(KQ)=I: KQ=KQ+1: GOTO 250310
250 NEXT I
260 : IF P$="K<>1" THEN PRINT "THERE MUST BE EXACTLY ONE KING."K(K)=I: K=K+1: GOTO 120310
270 : IF Q<>1P$="B" THEN PRINTB(B)=I: "THERE MUST BE EXACTLY ONE QUEEN."B=B+1: GOTO 120310
280 : IF B<>2P$="N" THEN PRINTN(N)=I: "THEREN=N+1: MUST BE EXACTLY TWO BISHOPS.": GOTO 120310
290 : IF N<>2P$="R" THEN PRINTR(R)=I: "THERER=R+1: MUST BE EXACTLY TWO KNIGHTS.": GOTO 120310
300 IF R<>2 THEN: PRINT "THEREILLEGAL MUSTPIECE BE EXACTLY TWO ROOKS'"P$"'.": SP=-1: GOTO 120RETURN
570310 NEXT I
310 IF (K(0) > R(0)) AND (K(0) < R(1)) THEN 330
320 IF K<>1 THEN PRINT "KINGTHERE MUST BE BETWEENEXACTLY THEONE ROOKSKING.": GOTO 120 SP=-1: RETURN
330 IF Q<>1 THEN PRINT "THERE MUST BE EXACTLY ONE QUEEN.": SP=-1: RETURN
330 IF (B(0) AND 1) <> (B(1) AND 1) THEN 350
340 IF B<>2 THEN PRINT "BISHOPSTHERE MUST BE ONEXACTLY OPPOSITETWO COLORSBISHOPS.": GOTOSP=-1: 120RETURN
350 IF N<>2 THEN PRINT "THERE MUST BE EXACTLY TWO KNIGHTS.": SP=-1: RETURN
350 FOR I=0 TO 1
360 IF R<>2 THEN PRINT "THERE MUST BE EXACTLY TWO ROOKS.": SP=-1: RETURN
360 : N=N(I)
370 : IF N(IK(0) >Q R(I0)) THENAND N=N-(K(0) < R(1)) THEN 390
380 PRINT "KING MUST BE BETWEEN THE ROOKS.": SP=-1: RETURN
380 : FOR J=0 TO 1
390 : IF N(IB(0) AND 1) <> (B(J1) THENAND N=N-1) THEN 410
400 PRINT "BISHOPS MUST BE ON OPPOSITE COLORS.": SP=-1: RETURN
400 : NEXT J
410 :FOR N(I)=N0 TO 1
420 NEXT: N=N(I)
430 N0=1: N1IF N(I)>Q(I) THEN N=2N-1
440 : FOR NJ=0 TO 91
450 : IF N0=N(0I)>B(J) ANDTHEN N1N=N(-1) THEN 490
460 : N1=N1+1NEXT J
360470 : N=N(I)=N
470 : IF N1>5 THEN N0=N0+1: N1=N0+1
480 NEXT NI
490 QN0=Q(0)-1: N1=2
500 FOR IN=0 TO 19
510 : IF QN0=N(0)>B AND N1=N(I1) THEN Q=Q-1550
520 NEXT: IN1=N1+1
530 FOR: I=0IF TON1>5 THEN N0=N0+1: N1=N0+1
540 :NEXT B=B(I)-1N
550 : IF B AND 1 THEN LQ=INTQ(B/20)-1
560 :FOR IF (B AND 1)I=0 THENTO D=B/21
570 : IF Q(0)>B(I) THEN Q=Q-1
570 NEXT I
400 :580 NEXT JI
580 PRINT "SPID ="; 96*N+16*Q+4*D+L</lang>
380 :590 FOR JI=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
580640 PRINT "SPIDSP ="; 96*N+16*Q+4*D+L</lang>
650 RETURN</lang>
 
{{Out}}
<pre>READY.
RUN
QNRBBNKR: 105
ENTER START ARRAY AS SEEN BY WHITE.
RNBQKBNR: 518
 
RQNBBKRN: 601
STARTING ARRAY:RNBQKBNR
RNQBBKRN: 617
SPID = 518
 
READY.
RUN
ENTER START ARRAY AS SEEN BY WHITE.
 
STARTING ARRAY:QNRBBNKR
SPID = 105
 
READY.</pre>
1,480

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.