BEGIN
BYTEINTEGERARRAY DEAL(1:52)
BYTEINTEGERARRAY HAND(0:3,2:14)
OWNBYTEINTEGERARRAY S(0:3)='S','H','D','C'
INTEGER POINTS,BALANCE,LIMIT,CUT
INTEGERARRAY DIST,PTS(0:3)
OWNINTEGER HANDCOUNT=0
ROUTINE INITIALISE; ! INITIALISES PACK
INTEGER I,J,K
K=-1
CYCLE I=0,16,48; ! SUIT
CYCLE J=2,1,14; ! VALUE
DEAL(K+J)=I+J
REPEAT; K=K+13; REPEAT
END; ! OF INITIALISE
ROUTINE SHUFFLE; ! SHUFFLES AND CUTS PACK
BYTEINTEGERARRAY A(1:52)
INTEGER I,J
CYCLE I=1,1,26
A(2*I-1)=DEAL(I); A(2*I)=DEAL(53-I)
REPEAT
CUT=CUT+11
IF CUT>=52 THEN CUT=CUT-52
IF CUT=0 THEN CUT=1
CYCLE I=1,1,CUT
DEAL(52-CUT+I)=A(I); REPEAT
CYCLE I=CUT+1,1,52
DEAL(I-CUT)=A(I); REPEAT
END; ! OF SHUFFLE
ROUTINE DEALPACK
OWNBYTEINTEGERARRAY T(11:14)='J','Q','K','A'
INTEGER I,J,K,M
POINTS=0;BALANCE=0
IF HANDCOUNT&7=0 THENSTART
NEWPAGE; print string("BRIDGEHANDS")
NEWLINES(3); FINISH
CYCLE I=0,1,3
CYCLE J=2,1,14
HAND(I,J)=0; REPEAT; REPEAT
CYCLE I=1,4,49
HAND(DEAL(I)>>4,DEAL(I)&15)=1
REPEAT
CYCLE I=0,1,3
K=0; PRINTSYMBOL(S(I)); SPACES(3)
M=0; ! COUNTS POINTS
CYCLE J=14,-1,11
->L1 IF HAND(I,J)=0
SPACE;PRINTSYMBOL(T(J));K=K+1;M=M+J-10
L1: REPEAT
IF HAND(I,10)#0 THENSTART
WRITE(10,2); K=K+1; FINISH
CYCLE J=9,-1,2
->L2 IF HAND(I,J)=0
K=K+1; WRITE(J,1)
L2: REPEAT
IF K=0 THEN print string(" --")
IF 1<=M<=3 AND K=1 THEN M=M-1
PTS(I)=M; POINTS=POINTS+M; DIST(I)=K
IF K>5 THEN BALANCE=BALANCE+K-5
IF K<2 THEN BALANCE=BALANCE+2{-???}
NEWLINE; REPEAT
HANDCOUNT=HANDCOUNT+1
END; ! OF DEAL
INITIALISE; READ(CUT); READ(LIMIT)
->L2 IF 0<=CUT<=52
print string( "INVALID CUT"); STOP
L2: SHUFFLE; SHUFFLE; SHUFFLE; SHUFFLE
L1: SHUFFLE; DEALPACK
BEGIN; ! BIDDING BLOCK
INTEGER LS,NO,SUITPTS
SWITCH B(0:20)
INTEGER I,N
ROUTINE BIDSUIT(INTEGER I)
WRITE(I,1); SPACE; PRINTSYMBOL(S(LS))
END
ROUTINE NT(INTEGER I)
WRITE(I,1); print string(" NT")
END
NO=3
CYCLE I=0,1,3
IF DIST(I)>NO THENSTART
LS=I; NO=DIST(I)
FINISH; REPEAT
IF LS=0 AND DIST(3)=NO THEN LS=3
SUITPTS=PTS(LS)+5*(NO-4); SPACES(18)
N=BALANCE; IF N>3 THEN BALANCE=3
->B(BALANCE)
B(0): ->L2 IF POINTS>=12
NB: print string(" NO BID"); ->L1
L2: IF POINTS<=15 THENSTART
->L3 IF SUITPTS>10
NT(1); ->L1; FINISH
IF POINTS<20 THENSTART
L3: BIDSUIT(1); ->L1; FINISH
IF POINTS>=23 THEN ->TC
IF SUITPTS>=15 THEN BIDSUIT(2) ELSE NT(2)
->L1
B(1): IF POINTS=11 AND SUITPTS>10 THEN ->L3
->NB IF POINTS<=11
->L3 IF POINTS<=18
->L7 IF POINTS<22
TC: print string(" 2 C(ACOL)"); ->L1
B(2): ->PR IF POINTS<10
->L6 IF POINTS>=12
->L3 IF SUITPTS>10; ->NB
B(3): ->PR IF POINTS<8
L6: ->L3 IF POINTS<=18-N
->TC IF POINTS>=22-N
L7: IF SUITPTS>15 THEN I=2 ELSE I=1
->L8
PR: SUITPTS=5*(NO-4)+POINTS
->NB IF SUITPTS <=20; ->L9 IF LS<2
L9: IF SUITPTS<=27 THEN I=3 ELSE I=4
->NB IF SUITPTS <=22
IF SUITPTS >30 THENSTART
I=5; ->L8; FINISH
L8: BIDSUIT(I)
L1: END; ! OF BIDDING BLOCK
NEWLINES(3)
->L1 IF HANDCOUNT<LIMIT
ENDOFPROGRAM