PROGRAM JUMBLE
?
? Program plays the 'jumble' game by displaying all possible combinations
? of the input string, without displaying repeated combinations (that makes
? it interesting to program). Recursion & Subprograms are demonstrated
?
GLOBAL
   TEXT L(20)*1,LINE*76,WORD(20)*1
   INTEGER USED(20),CHKDUP,NLET,I2,ra
LOCAL 
   INTEGER I,ILOOP 
   INTEGER  UNIQUE,FACT
SUBPROGRAM
   SUBROUTINE DOLOOP 
   INTEGER DUP 
   INTEGER REDUCE
   INTEGER FACTO 
CHKDUP=0
INPUT "Input Character String To Jumble (Max 10 Characters)" LINE
NLET=LENGTH(LINE)
IF NLET>10 THEN
   LINE(11:76)=SPACE(66)
   NLET=10
ENDIF
USED=377
UNIQUE=FACTO(NLET)
FACT=1
FOR I=1 TO NLET 
   USED(I)=ASCII(LINE(I:I))
NEXT I
I2=INTSORT(USED,1,20) 
FOR I=1 TO NLET 
   L(I)=CHAR(USED(I))
   ra= I<>1 AND (L(I)=L(I-1))
   IF ra THEN
      FACT=FACT+1
      CHKDUP=1
   ELSE
      IF FACT <> 1 THEN 
         UNIQUE = REDUCE(UNIQUE,FACT)
         FACT=1
      END IF
   END IF
NEXT I
IF FACT <> 1 THEN UNIQUE=REDUCE(UNIQUE,FACT)
PRINT "Number Of Solutions Found:",UNIQUE
USED=0
ILOOP=1 
I2=1
LINE(1:1)= " "
CALL DOLOOP(ILOOP)
IF I2 > 1 THEN PRINT LINE(1:I2)
END
 
SUBROUTINE DOLOOP 
PARAMETER 
   INTEGER ILET
LOCAL 
   INTEGER I,J 
FOR I=1 TO NLET 
IF USED(I) THEN GOTO 20
IF CHKDUP AND DUP(I) THEN GOTO 20
USED(I)=1 
WORD(ILET)=L(I) 
IF ILET < NLET THEN 
   CALL DOLOOP(ILET+1) 
ELSE
   FOR J=1 TO NLET 
      LINE(I2+J:I2+J)=WORD(J) 
   NEXT J
   I2=I2+NLET
   IF I2 > (76-NLET) THEN
      PRINT LINE
      I2=0
   END IF
   I2=I2+1 
   LINE(I2:I2)=" " 
END IF
USED(I)=0 
20 NEXT I 
GRETURN 
END 

FUNCTION DUP
PARAMETER
   INTEGER INDEX 
LOCAL 
   INTEGER LL,II 
DUP=0 
LL=INDEX-1
II=LL<1 OR L(INDEX)<>L(LL)
IF II THEN GRETURN
IF USED(LL) <> 1 THEN DUP=1
GRETURN 
END

FUNCTION REDUCE 
PARAMETER 
   INTEGER NUMER,DENOM 
REDUCE = NUMER/FACTO(DENOM) 
GRETURN 
END 

FUNCTION FACTO
PARAMETER 
   INTEGER IPARM 
LOCAL 
   INTEGER I 
FACTO=1 
FOR I=IPARM TO 2 STEP -1
   FACTO=FACTO*I
NEXT I
GRETURN 
END 
