home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / PASCAL / ALLSWAGS.ZIP / SWAGG-M.ZIP / MISC.SWG / 0190_Word Puzzle program for TP.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-11-29  |  4.6 KB  |  219 lines

  1. {
  2. Here's a solution! I'm using Borland Pascal 7.0 and MS-DOS, so see the
  3. comments to adjust it to other compilers and platforms (especially the
  4. Assembly language part...)
  5.  
  6. The code may be cut/copied and pasted anywhere you like it. No royalty is
  7. needed. (I can't believe I said that, but it's true!)
  8.  
  9. Save the code as PUZZLE.PAS and create your own dictionary file as WORDS.DIC
  10. in the current directory. A sample WORDS.DIC (generated from my big
  11. WORDS.DIC using PUZZLE SHIFTED) is also given. Note that PUZZLE.PAS is
  12. case-insensitive, you can use upper/lowercase. Every word should be on its
  13. own line and must not have spaces in it. Sorting is optional, the output
  14. depends on the order found in the file.
  15.  
  16. After you save PUZZLE.PAS and the sample WORDS.DIC, try PUZZLE SHIFT to get
  17. 13 words.
  18.  
  19. I have a big WORDS.DIC containing approximately 91,529 words. It is 979,045
  20. bytes. PKZIP -ex produces a 251,926 bytes ZIP file. UUENCODE-ing the ZIP
  21. file gives 6 files totaling 353,616 bytes. Anyone interested in it may mail
  22. me. Note: The file was not created by me, although I was the one who sorted
  23. it. I'm sure I found it somewhere on the net, but I forgot where exactly it was.
  24.  
  25. START OF WORDS.DIC [420 bytes under MS-DOS, CRLF pair is used]
  26. deft
  27. dei
  28. deist
  29. des
  30. die
  31. dies
  32. diet
  33. diets
  34. dif
  35. dis
  36. dish
  37. dite
  38. edit
  39. edith
  40. edits
  41. edt
  42. eft
  43. efts
  44. est
  45. fed
  46. feds
  47. fetid
  48. fetish
  49. fid
  50. fie
  51. fish
  52. fished
  53. fist
  54. fisted
  55. fit
  56. fits
  57. heft
  58. hefts
  59. heist
  60. hid
  61. hide
  62. hides
  63. hie
  64. hied
  65. hies
  66. his
  67. hist
  68. hit
  69. hits
  70. ides
  71. set
  72. she
  73. shed
  74. shied
  75. shift
  76. shifted
  77. sid
  78. side
  79. sift
  80. sifted
  81. sit
  82. site
  83. sited
  84. std
  85. stied
  86. ted
  87. the
  88. thief
  89. this
  90. tide
  91. tides
  92. tie
  93. tied
  94. ties
  95. tis
  96. END OF WORDS.DIC
  97.  
  98. START OF PUZZLE.PAS [2,913 bytes under MS-DOS, CRLF pair is used]
  99. { If you aren't using Borland Pascal 7.0 and MS-DOS, try using just $I-. }
  100.  
  101. {$A+,B-,D-,E-,F-,G+,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V+,X+,Y-}
  102. {$M 1024,0,0}
  103.  
  104. Program Puzzle;
  105.  
  106. Var
  107.     F : Text;
  108.     S, W : String;
  109.     I : LongInt;
  110.  
  111. { If you aren't using Borland Pascal 7.0 and MS-DOS try this instead:
  112.  
  113. Function StrLwr(S : String) : String;
  114. Var
  115.     I : Byte;
  116. Begin
  117.     For I := 1 To Length(S) Do
  118.         If (S[I] >= 'A') And (S[I] <= 'Z') Then
  119.             Inc(S[I], $20);
  120.     StrLwr := S
  121. End;
  122.  
  123. StrLwr(S) returns S in all lowercase.
  124. }
  125.  
  126. Function StrLwr(Const S : String) : String; Assembler;
  127. Asm
  128.     PUSH DS
  129.     LDS SI, S
  130.     LES DI, @Result
  131.     CLD
  132.     LODSB
  133.     STOSB
  134.     XCHG CX, AX
  135.     MOV CH, 0
  136.     JCXZ @3
  137. @1: LODSB
  138.     CMP AL, 'A'
  139.     JB @2
  140.     CMP AL, 'Z'
  141.     JA @2
  142.     OR AL, 20H
  143. @2: STOSB
  144.     LOOP @1
  145. @3: POP DS
  146. End;
  147.  
  148. { If you aren't using Borland Pascal 7.0 change the function header to:
  149.  
  150.     Function IsSolution(S, W : String) : Boolean;
  151.  
  152. (Borland Pascal 7.0 tip:)
  153. Using Const on String arguments saves stack space and disables modifying the
  154. String. (To modify Const S : String you use String((@S)^) in place of S.)
  155.  
  156.   S is the list of legal characters.
  157.   W is a legal word from the dictionary file.
  158.  
  159. IsSolution(S, W) returns True if W can be formed from the letters in S.
  160.  
  161. This time S may have unused letters. If must use all letters from S change:
  162.     IsSolution := True
  163. (last line of function) to:
  164.     IsSolution := S[0] = #0
  165. or:
  166.     IsSolution := S = ''
  167. (The former is faster, the latter is simpler.)
  168. }
  169.  
  170. Function IsSolution(S : String; Const W : String) : Boolean;
  171. Var
  172.     I, J : Byte;
  173. Begin
  174.     IsSolution := False;
  175.     For I := 1 To Length(W) Do Begin
  176.         J := Pos(W[I], S);
  177.         If J = 0 Then Exit;
  178.         Delete(S, J, 1)
  179.     End;
  180.     IsSolution := True
  181. End;
  182.  
  183. { The main block. }
  184.  
  185. Begin
  186.     If ParamCount <> 1 Then Begin
  187.         WriteLn('PUZZLE - Idea from Campbell Basset <vr@aztec.co.za>');
  188.         WriteLn('Created by Andy Kurnia <akur@indo.net.id> in 1996');
  189.         WriteLn;
  190.         WriteLn('Syntax:   PUZZLE listofletters');
  191.         WriteLn('Argument: case-insensitive, example allows max. two E');
  192.         WriteLn('Example:  PUZZLE RSTLNEfghiev');
  193.         WriteLn('Requires: WORDS.DIC (text file containing words)');
  194.         Halt(1)
  195.     End;
  196.     Assign(F, 'WORDS.DIC');
  197.     Reset(F);
  198.     If IOResult <> 0 Then Begin
  199.         WriteLn('WORDS.DIC not found!');
  200.         Halt(2)
  201.     End;
  202.     S := StrLwr(ParamStr(1));
  203.     I := 0;
  204.     While Not EOF(F) Do Begin
  205.         ReadLn(F, W);
  206.         If IsSolution(S, StrLwr(W)) Then Begin
  207.             Inc(I);
  208.             WriteLn(I : 10, '. ', W)
  209.         End
  210.     End;
  211.     Close(F);
  212.     If I = 0 Then
  213.         WriteLn('No words found.')
  214.     Else If I = 1 Then
  215.         WriteLn('1 word found.')
  216.     Else
  217.         WriteLn(I, ' words found.')
  218. End.
  219.