home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / jumble9.zip / JUMB9.BAS next >
BASIC Source File  |  1980-01-01  |  10KB  |  398 lines

  1. '=========================================================================
  2. '       JUMBLE PROGRAM TO UNSCRAMBLE WORDS
  3. '       3-29-88
  4. '       REV 9.0 A
  5. '       WRITTEN BY: DARRIN KOHN
  6. '=========================================================================
  7.  
  8.  
  9.     DIM W(20)
  10.     DIM T(20)
  11.     DIM T1(20)
  12.     DIM Q$(20)
  13.     DIM E(20)
  14.     DIM L$(27, 27)
  15.     DIM P$(10)
  16.  
  17. '***********************************************************************
  18. '****** INSTRUCTIONS
  19. '***********************************************************************
  20.     CLS
  21.     COLOR 3
  22.     LOCATE 1, 1
  23.     PRINT "The purpose of JUMBLE is to unscramble a jumbled word."
  24.     PRINT "That is to say, if you Type in 'OLWDR', the computer will"
  25.     PRINT "print out all the permutations of that word.  One of which"
  26.     PRINT "spells the word 'WORLD'."
  27.     PRINT "If you have a program called 'TURBO LIGHTNING', then use"
  28.     PRINT "the 'SCREEN CHECK' function, and it will check all the permuatations"
  29.     PRINT "and leave the correct (unscrambled) word in DARK (RED)."
  30.     PRINT
  31.     PRINT "You can enter up to 12 letters, But you might get as many as "
  32.     PRINT "479,001,600 permutations. In this case, it is best to use the 'E'"
  33.     PRINT "option (when told to do so).  This will eliminate MANY letter"
  34.     PRINT "combinations that dont exist in the standard dictionary."
  35.     PRINT "The speed of this program depends on your machine."
  36.     PRINT "You can also select only permutations that begin with a certain"
  37.     PRINT "letter, this will bring the total number of permutations down to"
  38.     PRINT "size."
  39.     PRINT "Make sure you use CAPITAL LETTERS ALWAYS!"
  40.     PRINT "TYPE IN 'Q' TO QUIT, WHEN DONE."
  41.  
  42.  
  43. '***********************************************************************
  44. '****** STORE LETTER COMB DATA IN ARRAY
  45. '***********************************************************************
  46.     LOCATE 24, 20
  47.     COLOR 12
  48.     PRINT "LOADING DATA INTO ARRAY...PLEASE WAIT...";
  49.     RESTORE
  50.     FOR X = 1 TO 26
  51.     X1 = 0
  52. SL1:    READ P1$
  53.     IF P1$ <> "0" THEN
  54.         X1 = X1 + 1
  55.         L$(X, X1) = P1$
  56.         GOTO SL1
  57.         END IF
  58.     NEXT X
  59.     LOCATE 24, 20
  60.     COLOR 7
  61.     PRINT "HIT RETURN TO CONTINUE                   ";
  62. LOOP3:  IF INKEY$ = "" THEN GOTO LOOP3
  63.  
  64.  
  65. '***********************************************************************
  66. '****** GET WORD
  67. '***********************************************************************
  68. BEGIN:  CLOSE #1
  69.     COLOR 6
  70.     CLS
  71.     LOCATE 10, 5
  72.     PRINT "        SEND PERMUTATIONS TO PRINTER, HIT '1'"
  73.     LOCATE 11, 5
  74.     PRINT "SAVE PERMUTATIONS TO DISK (PERM.DTA), HIT '2'"
  75.     LOCATE 12, 5
  76.     PRINT "              HIT RETURN FOR NEITHER"
  77.     LOCATE 13, 5
  78.     A = 0
  79. START3: A$ = INKEY$
  80.     IF A$ = "" THEN GOTO START3
  81.     IF A$ = "Q" THEN END
  82.     A = VAL(A$)
  83.     IF A = 2 THEN OPEN "PERM.DTA" FOR OUTPUT AS #1
  84.  
  85.  
  86. BEGIN1: CLS
  87.     LOCATE 11, 17
  88.     COLOR 7
  89.     PRINT "ENTER IN SCRAMBLED  LETTERS AND HIT RETURN"
  90.     LOCATE 12, 17
  91.     PRINT "         UP TO 12 CHARACTERS LONG"
  92.     LOCATE 14, 30
  93.     INPUT Z$
  94.     IF Z$ = "" THEN GOTO BEGIN1
  95.     IF Z$ = "Q" THEN END
  96.  
  97. BEGIN2: CLS
  98.     LOCATE 11,17
  99.     PRINT "IF YOU HAVE AN IDEA OF WHAT THE WORD IS"
  100.     LOCATE 12,12
  101.     PRINT "ENTER IN THE FIRST LETTER (OF WHAT YOU THINK IT IS)"
  102.     LOCATE 13,14
  103.     PRINT "                    OR"
  104.     LOCATE 14,19
  105.     PRINT "JUST HIT RETURN TO CHECK EVERYTHING"
  106.     LOCATE 16,30
  107.     INPUT A$
  108.     IF LEN(A$) > 1 THEN GOTO BEGIN2
  109.     CLS
  110.  
  111. '***********************************************************************
  112. '****** STORE WORD IN ARRAY
  113. '***********************************************************************
  114.     L = LEN(Z$)
  115.     IF L > 12 THEN GOTO BEGIN1
  116.     FOR X = 1 TO L
  117.     Q$(X) = MID$(Z$, X, 1)
  118.     T1(X) = 1
  119.     T(X) = 0
  120.     NEXT X
  121.     J1 = INT(79 / (L + 1))
  122.  
  123. '***********************************************************************
  124. '****** BUBBLE-SORT WORD ASCENDING
  125. '***********************************************************************
  126.     FOR Y = L TO 1 STEP -1
  127.         FOR X = 1 TO Y - 1
  128.         IF Q$(X) > Q$(X + 1) THEN
  129.             SWAP Q$(X), Q$(X + 1)
  130.             FLAG = 1
  131.             END IF
  132.         NEXT X
  133.     IF FLAG = 0 THEN GOTO JUMP7
  134.     FLAG = 0
  135.     NEXT Y
  136.  
  137. JUMP7:  FOR X=1 TO L
  138.     IF A$=Q$(X) THEN
  139.         A1=X
  140.         GOTO FIND
  141.         END IF
  142.     NEXT X
  143.     A1=0
  144.  
  145.  
  146. '***********************************************************************
  147. '****** FIND REPEATED LETTERS AND MARK THEM WITH EXTRA BIT 2^7
  148. '***********************************************************************
  149. FIND:   E = 0
  150.     TEMP = 0
  151.     FOR Y = 1 TO L
  152.     T = Y
  153.     TEMP = TEMP + 1
  154.     E(Y) = TEMP
  155.         FOR X = L TO (T + 1) STEP -1
  156.         IF Q$(Y) = Q$(X) THEN
  157.             E = E + 1
  158.             E(X) = 128 + TEMP
  159.             Y = Y + 1
  160.             FLAG = 1
  161.             END IF
  162.         NEXT X
  163.  
  164.     IF FLAG = 0 THEN NL = NL + 1
  165.     FLAG = 0
  166.     NEXT Y
  167.  
  168. '***********************************************************************
  169. '*****  REDUCE COMBINATION REPEATS
  170. '***********************************************************************
  171.     F = L
  172.     GOSUB FACTORIAL
  173.     TP = F1
  174.     F = L - 1
  175.     GOSUB FACTORIAL
  176.     PERCOLUMN = F1
  177.     PERMUTATION = TP - (PERCOLUMN * E)
  178.        
  179.     IF E > 1 THEN
  180.         PERMUTATION = PERMUTATION - ((L - E) * PERCOLUMN / 2)
  181.         END IF
  182.     IF E = 1 THEN
  183.         PERMUTATION = PERMUTATION - ((L - 2) * PERCOLUMN / 2)
  184.         END IF
  185.  
  186. '***********************************************************************
  187. '****** PRINT OUT RESULTS
  188. '***********************************************************************
  189.     P$(1) = "   TOTAL NUMBER OF PERMUTATIONS (INCLUDING REPEATS) " + STR$(TP)
  190.     P$(2) = "   TOTAL NUMBER OF PERMUTATIONS (EXCLUDING REPEATS) " + STR$(PERMUTATION)
  191.     P$(3) = "TOTAL POSSIBLE TIMES EACH LETTER IS USED PER COLUMN " + STR$(PERCOLUMN)
  192.     P$(4) = "             MAXIMUM NUMBER OF COMBINATIONS PER SET " + STR$(PERCOLUMN)
  193.     P$(5) = "                  NUMBER OF DUPLICATE LETTERS PAIRS " + STR$(E)
  194.     P$(6) = "                    NUMBER OF NON-DUPLICATE LETTERS " + STR$(NL)
  195.     P$(7) = "                                        WORD LENGTH " + STR$(L)
  196.     P$(8) = ""
  197.  
  198.     COLOR 6
  199.     LOCATE 1, 1
  200.     IF A = 1 THEN PRINT "PUT PRINTER ONLINE": LPRINT
  201.     IF A = 2 THEN PRINT "OPEN FILE (PERM.DTA)"
  202.     LOCATE 1, 1
  203.     FOR X = 1 TO 8
  204.     IF A = 1 THEN LPRINT P$(X)
  205.     IF A = 2 THEN PRINT #1, P$(X)
  206.     PRINT P$(X)
  207.     NEXT X
  208.  
  209.     PRINT
  210.     COLOR 7
  211.     PRINT "HIT ANY KEY TO START RUNNING";
  212.     PRINT "HIT 'E' TO ELIMINATE LETTER COMBINATIONS THAT DONT EXIST"
  213.     
  214. LOOP1:  A$ = INKEY$
  215.     IF A$ = "" THEN GOTO LOOP1
  216.     ELIM = 0
  217.     IF A$ = "E" THEN ELIM = 1
  218.     CLS
  219.     COLOR 2
  220.     PRINT "FORMING PERMUTATIONS, PLEASE WAIT.."
  221.     COLOR 12
  222.     PRINT
  223.    
  224.  
  225. '***********************************************************************
  226. '***** BEGIN TO FORM COMBINATIONS
  227. '***********************************************************************
  228.     V1 = 0
  229.     CO = 0
  230.     PL = 0
  231.  
  232.     FOR SET = 1 TO (L - E)
  233.     CNT = 0
  234. JUMP3:  V1 = V1 + 1
  235.     IF (E(V1) AND 128) THEN GOTO JUMP3
  236.     V = V1
  237.     IF A1 > 0 AND A1<>V THEN GOTO JUMP6
  238.  
  239. JUMP:   FOR X = 1 TO L
  240.     F1 = 1
  241.         FOR FACT = 1 TO (L - X)
  242.         F1 = F1 * FACT
  243.         NEXT FACT
  244.     
  245.     IF CNT THEN V = T1(X)
  246.  
  247. JUMP1:          FOR Y = 1 TO (X - 1)
  248.         IF W(Y) = V THEN
  249.             V = V + 1
  250.             IF V > L THEN V = 1
  251.             GOTO JUMP1
  252.             END IF
  253.         IF (E(V) AND 128) AND Y > 1 THEN
  254.             IF (E(W(Y)) AND 127) = (E(V) AND 127) THEN
  255.                 IF W(Y) < V THEN FLAG = 1
  256.                 END IF
  257.             END IF
  258.         NEXT Y
  259.            
  260.         W(X) = V
  261.         T(X) = T(X) + 1
  262.         IF T(X) = F1 THEN
  263.             T(X) = 0
  264.             V = V + 1
  265.             IF V > L THEN V = 1
  266.             END IF
  267.         T1(X) = V
  268. JUMP4:  NEXT X
  269.     IF FLAG THEN
  270.         FLAG = 0
  271.         GOTO JUMP5
  272.         END IF
  273.  
  274.     GOSUB PCOMB
  275.  
  276. JUMP5:          FOR X = 1 TO L
  277.         IF T(X) THEN
  278.             CNT = 1
  279.             GOTO JUMP
  280.             END IF
  281.         NEXT X
  282.  
  283. JUMP6:  NEXT SET
  284.  
  285.     IF A = 1 THEN LPRINT CHR$(12)
  286.     PRINT
  287.     PRINT
  288.     COLOR 9
  289.     PRINT "IF YOU HAVE 'TURBO LIGHTNING' USE 'SCREEN CHECK'"
  290.     PRINT "HIT ANY OTHER KEY TO TRY ANOTHER WHEN READY ";
  291.  
  292. DONE:   IF INKEY$ = "" THEN GOTO DONE
  293.     GOTO BEGIN
  294.  
  295.  
  296. '***********************************************************************
  297. '****** PRINT OUT PERMUTATIONS
  298. '***********************************************************************
  299. PCOMB:          IF ELIM = 0 THEN GOTO PCOMB4
  300.         LN = ASC(Q$(W(1))) - 64
  301.         X1 = 0
  302.         P$ = Q$(W(2))
  303.  
  304. PCOMB5:         X1 = X1 + 1
  305.         IF L$(LN, X1) = "" THEN GOTO PCOMB4
  306.         IF L$(LN, X1) = P$ THEN RETURN
  307.         GOTO PCOMB5
  308.            
  309. PCOMB4:         PC$ = ""
  310.         FOR Y = 1 TO L
  311.         PC$ = PC$ + Q$(W(Y))
  312.         NEXT Y
  313.         CO = CO + 1
  314.         IF CO > J1 THEN
  315.             CO = 1
  316.             PL = PL + 1
  317.             IF A = 2 THEN PRINT #1,
  318.             IF A = 1 THEN LPRINT
  319.             IF A = 0 THEN PRINT
  320.             END IF
  321.  
  322.         IF A = 2 THEN
  323.             PRINT #1, PC$; " ";
  324.             RETURN
  325.             END IF
  326.  
  327.         IF A = 1 THEN
  328.             LPRINT PC$; " ";
  329.             RETURN
  330.             END IF
  331.  
  332.         PRINT PC$; " ";
  333.  
  334.         IF PL = 18 THEN
  335.             PRINT
  336.             COLOR 9
  337.             PRINT "IF YOU HAVE 'TURBO LIGHTNING' USE 'SCREEN CHECK'"
  338.             PRINT "HIT SPACE FOR NEXT PAGE";
  339.             COLOR 4
  340. PCOMB1:                 H$ = INKEY$
  341.             IF H$ = "" THEN GOTO PCOMB1
  342.             IF H$ = "Q" THEN
  343.                 CLOSE #1
  344.                 END
  345.                 END IF
  346.             CLS
  347.             COLOR 2
  348.             PRINT "FORMING PERMUTATIONS, PLEASE WAIT.."
  349.             COLOR 12
  350.             PRINT
  351.             PL = 0
  352.             END IF
  353.  
  354.     RETURN
  355.  
  356.        
  357. '***********************************************************************
  358. '*****  SUBROUTINES
  359. '***********************************************************************
  360. FACTORIAL: F1 = 1
  361.        FOR FACT = 1 TO F
  362.        F1 = F1 * FACT
  363.        NEXT FACT
  364.        RETURN
  365.  
  366.  
  367. '***********************************************************************
  368. '*****  LETTER COMBINATIONS THAT DONT EXIST A-Z
  369. '***********************************************************************
  370.     DATA A,0
  371.     DATA B,J,G,H,J,K,M,P,Q,S,T,V,W,X,Z,0
  372.     DATA C,B,D,F,G,J,K,M,P,Q,S,T,V,W,X,Z,0
  373.     DATA D,B,F,G,H,J,K,L,M,P,Q,S,T,V,X,Z,0
  374.     DATA H,O,Z,0
  375.     DATA F,B,C,H,K,M,N,P,Q,S,T,V,W,X,Y,Z,0
  376.     DATA G,B,C,D,F,K,M,P,Q,S,T,V,W,X,Z,0
  377.     DATA H,B,C,D,F,G,J,K,L,M,N,P,Q,R,S,T,V,W,X,Z,0
  378.     DATA I,H,J,K,P,Q,U,W,X,Y,0
  379.     DATA J,B,C,D,F,G,H,K,L,M,N,P,Q,R,S,T,V,W,X,Y,Z,0
  380.     DATA K,B,C,D,F,G,J,M,P,Q,S,T,V,W,X,Y,Z,0
  381.     DATA B,C,D,F,G,H,J,K,M,N,P,Q,R,T,V,W,X,Z,0
  382.     DATA M,B,C,D,F,G,H,J,K,L,P,Q,R,S,V,W,X,Z,0
  383.     DATA N,B,C,D,F,G,H,J,K,L,M,P,Q,R,S,T,V,W,X,Z,0
  384.     DATA O,E,J,Q,0
  385.     DATA P,B,C,D,,F,G,J,K,M,P,Q,V,W,X,Z,0
  386.     DATA Q,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,R,S,T,V,W,X,Y,Z,0
  387.     DATA R,B,C,D,F,G,J,K,L,M,N,P,Q,R,S,T,V,W,X,Z,0
  388.     DATA S,B,D,F,G,J,R,V,X,Z,0
  389.     DATA T,B,C,D,F,G,J,K,L,M,P,Q,S,V,X,Z,0
  390.     DATA U,A,C,E,F,H,I,J,O,Q,V,W,X,Y,Z,0
  391.     DATA V,B,C,D,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Z,0
  392.     DATA W,B,C,D,F,G,J,K,L,M,N,P,Q,S,T,U,V,X,Y,Z,0
  393.     DATA X,A,B,C,D,F,G,H,I,J,K,L,N,O,P,Q,S,T,U,V,W,Z,0
  394.     DATA Y,B,C,D,F,G,H,J,K,L,M,N,P,Q,R,S,T,V,W,X,Z,0
  395.     DATA Z,B,C,D,F,G,H,J,K,L,M,N,P,Q,R,S,T,V,X,0
  396.   
  397.  
  398.