fork(1) download
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. char letter[256];
  7.  
  8. struct T {
  9. struct T *next[26];
  10. int end;
  11. };
  12.  
  13. struct V {
  14. char pbuf[80];
  15. char kbuf[80];
  16. char cbuf[80];
  17. int n;
  18. };
  19.  
  20. void tadd(struct T **t, const char *str)
  21. {
  22. int s = *str++;
  23. int c = letter[(unsigned char) s];
  24.  
  25. if (s && c < 0) return;
  26.  
  27. if (*t == NULL) {
  28. *t = calloc(1, sizeof(**t));
  29. }
  30.  
  31. if (s == 0) {
  32. (*t)->end = 1;
  33. } else {
  34. tadd(&(*t)->next[c], str);
  35. }
  36. }
  37.  
  38. void tdestroy(struct T *t)
  39. {
  40. if (t) {
  41. for (int i = 0; i < 26; i++) {
  42. tdestroy(t->next[i]);
  43. }
  44.  
  45. free(t);
  46. }
  47. }
  48.  
  49. void tprint(struct T *t, char *buf, int n)
  50. {
  51. if (t) {
  52. if (t->end) printf("%.*s\n", n, buf);
  53.  
  54. for (int i = 0; i < 26; i++) {
  55. if (t->next[i]) {
  56. buf[n] = 'a' + i;
  57. tprint(t->next[i], buf, n + 1);
  58. }
  59. }
  60. }
  61. }
  62.  
  63. void fill(char grid[3][5], struct T *a[], struct T *d[], int n);
  64.  
  65. void filld(char grid[3][5], struct T *a[], struct T *d[], int n, int k)
  66. {
  67. if (k == 5) {
  68. fill(grid, a, d, n + 1);
  69. } else {
  70. int c;
  71.  
  72. for (c = 0; c < 26; c++) {
  73. if (d[n]->next[c] && a[k]->next[c]) {
  74. struct T *dd = d[n];
  75. struct T *aa = a[k];
  76.  
  77. d[n] = d[n]->next[c];
  78. a[k] = a[k]->next[c];
  79. grid[n][k] = 'A' + c;
  80.  
  81. filld(grid, a, d, n, k + 1);
  82.  
  83. d[n] = dd;
  84. a[k] = aa;
  85. }
  86. }
  87. }
  88. }
  89.  
  90. void print5(const char *s)
  91. {
  92. int n = 5;
  93.  
  94. while (n--) {
  95. putchar(' ');
  96. putchar(*s++);
  97. }
  98.  
  99. putchar('\n');
  100. }
  101.  
  102. void fill(char grid[3][5], struct T *a[], struct T *d[], int n)
  103. {
  104. if (n == 3) {
  105. print5(grid[0]);
  106. print5(grid[1]);
  107. print5(grid[2]);
  108. putchar('\n');
  109. } else {
  110. filld(grid, a, d, n, 0);
  111. }
  112. }
  113.  
  114. // Source: 5-letter words from Scowl's 10-percentile English words
  115.  
  116. const char *d5[] = {
  117. "about", "above", "abuse", "acted", "added", "admit", "adopt", "after",
  118. "again", "agree", "ahead", "aimed", "alarm", "album", "alias", "alive",
  119. "allow", "alone", "along", "alter", "amuse", "angle", "angry", "annoy",
  120. "apart", "apple", "apply", "areas", "argue", "arise", "aside", "asked",
  121. "avoid", "awake", "award", "aware", "awful", "backs", "badly", "based",
  122. "bases", "basic", "basis", "bears", "began", "begin", "begun", "being",
  123. "below", "binds", "bites", "black", "blame", "blank", "block", "board",
  124. "books", "borne", "bound", "boxes", "brand", "break", "brief", "bring",
  125. "broke", "brown", "build", "built", "bytes", "calls", "cards", "cares",
  126. "carry", "cases", "catch", "cause", "cease", "chain", "chair", "chaos",
  127. "chars", "cheap", "check", "child", "chips", "chose", "claim", "class",
  128. "clean", "clear", "clock", "close", "coded", "codes", "comes", "costs",
  129. "could", "count", "court", "cover", "crash", "crazy", "crisp", "cross",
  130. "cycle", "daily", "dated", "dates", "datum", "deals", "dealt", "death",
  131. "deems", "delay", "depth", "digit", "dirty", "discs", "ditto", "doing",
  132. "doors", "doubt", "dozen", "drawn", "draws", "dream", "drink", "drive",
  133. "drops", "drove", "dying", "early", "earth", "eaten", "edits", "eight",
  134. "elect", "empty", "ended", "enemy", "enjoy", "enter", "entry", "equal",
  135. "error", "evens", "event", "every", "exact", "exist", "extra", "facts",
  136. "fails", "faith", "falls", "false", "fancy", "fatal", "fault", "feeds",
  137. "feels", "fewer", "field", "fight", "filed", "files", "fills", "final",
  138. "finds", "first", "fixed", "fixes", "flash", "flied", "flies", "float",
  139. "floor", "flown", "folks", "force", "forms", "forth", "found", "frame",
  140. "fresh", "fries", "front", "fully", "funds", "funny", "gains", "games",
  141. "given", "gives", "glass", "going", "goods", "grand", "grant", "graph",
  142. "grave", "great", "green", "grind", "gross", "group", "grown", "grows",
  143. "guard", "guess", "guide", "habit", "hands", "handy", "hangs", "happy",
  144. "heads", "heard", "hears", "heart", "heavy", "hello", "helps", "hence",
  145. "hides", "hints", "holds", "holes", "hoped", "hopes", "horse", "hotel",
  146. "hours", "house", "human", "hurry", "ideal", "ideas", "image", "imply",
  147. "index", "inner", "input", "issue", "items", "joins", "joint", "judge",
  148. "jumps", "keeps", "kills", "kinds", "knock", "known", "knows", "label",
  149. "lacks", "lands", "large", "lasts", "later", "leach", "leads", "learn",
  150. "least", "leave", "legal", "level", "light", "liked", "likes", "limit",
  151. "lines", "links", "lists", "lived", "lives", "loads", "local", "locks",
  152. "logic", "looks", "loose", "lorry", "loses", "lower", "lucky", "lunch",
  153. "lying", "magic", "major", "makes", "march", "marks", "marry", "match",
  154. "maybe", "means", "meant", "media", "meets", "merit", "messy", "metal",
  155. "might", "miles", "minds", "minor", "mixed", "mixes", "model", "money",
  156. "month", "moral", "mouth", "moved", "moves", "movie", "music", "naive",
  157. "named", "names", "nasty", "needs", "never", "nicer", "night", "noise",
  158. "noisy", "north", "noted", "notes", "novel", "occur", "offer", "often",
  159. "older", "omits", "opens", "order", "other", "ought", "outer", "owing",
  160. "owner", "pages", "pairs", "paper", "parts", "party", "patch", "pause",
  161. "payed", "peace", "phase", "phone", "picks", "piece", "place", "plain",
  162. "plane", "plans", "plant", "plays", "plots", "point", "posts", "pound",
  163. "power", "press", "price", "prime", "print", "prior", "prone", "proof",
  164. "prove", "pulls", "putts", "queue", "quick", "quiet", "quite", "quits",
  165. "quote", "radio", "raise", "range", "rapid", "rates", "reach", "react",
  166. "reads", "ready", "refer", "reply", "right", "river", "rooms", "rough",
  167. "round", "route", "rules", "sadly", "safer", "saint", "sales", "saved",
  168. "saves", "scale", "scene", "score", "scrap", "seeks", "seems", "sells",
  169. "sends", "sense", "serve", "seven", "shall", "shame", "shape", "share",
  170. "sharp", "sheet", "shelf", "shell", "shift", "shoot", "shops", "short",
  171. "shown", "shows", "shuts", "sides", "sight", "signs", "silly", "since",
  172. "sites", "sizes", "skill", "sleep", "small", "smile", "solid", "solve",
  173. "sorry", "sorts", "sound", "south", "space", "spare", "speak", "speed",
  174. "spell", "spend", "spent", "spite", "split", "spoke", "spots", "staff",
  175. "stage", "stand", "start", "state", "stays", "steal", "stick", "still",
  176. "stock", "stone", "stood", "stops", "store", "story", "stuck", "study",
  177. "stuff", "style", "sugar", "suits", "table", "taken", "takes", "talks",
  178. "tanks", "tapes", "tasks", "taste", "teach", "teeth", "tells", "tends",
  179. "terms", "tests", "thank", "their", "there", "these", "thing", "think",
  180. "third", "those", "three", "threw", "throw", "tight", "timed", "times",
  181. "title", "today", "token", "tooth", "topic", "total", "touch", "trace",
  182. "track", "train", "traps", "trash", "treat", "trees", "trial", "trick",
  183. "tried", "tries", "truck", "truly", "trunk", "trust", "truth", "turns",
  184. "twice", "tying", "typed", "types", "under", "unite", "units", "until",
  185. "upper", "upset", "usage", "users", "using", "usual", "vague", "valid",
  186. "value", "video", "views", "visit", "vital", "voice", "votes", "waits",
  187. "walks", "walls", "wants", "warns", "waste", "watch", "water", "wears",
  188. "weeks", "weird", "wheel", "where", "which", "while", "white", "whole",
  189. "whose", "wider", "wills", "woman", "words", "works", "world", "worry",
  190. "worse", "worst", "worth", "would", "write", "wrong", "wrote", "years",
  191. "young", "yours", NULL
  192. };
  193.  
  194. // Source: 3-letter words from Scowl's 20-percentile English words
  195.  
  196. const char *d3[] = {
  197. "ace", "act", "add", "age", "ago", "aid", "aim", "air", "all", "and", "any",
  198. "apt", "arc", "are", "arm", "art", "ash", "ask", "ate", "bad", "bag", "ban",
  199. "bar", "bat", "bay", "bed", "beg", "bet", "bid", "big", "bin", "bit", "bob",
  200. "bog", "bow", "box", "boy", "bug", "bus", "but", "buy", "bye", "cam", "can",
  201. "cap", "car", "cat", "con", "cow", "cry", "cue", "cup", "cut", "day", "did",
  202. "die", "dig", "dim", "dip", "doe", "dog", "don", "dot", "dry", "due", "dug",
  203. "ear", "eat", "egg", "ego", "end", "era", "err", "eye", "fan", "far", "fat",
  204. "fed", "fee", "few", "fit", "fix", "fly", "fog", "for", "fry", "fun", "fur",
  205. "gap", "gas", "gay", "get", "gig", "gin", "god", "got", "gum", "gun", "gut",
  206. "guy", "had", "ham", "has", "hat", "hay", "her", "hid", "him", "hip", "his",
  207. "hit", "hog", "hot", "how", "huh", "hum", "hut", "ice", "ill", "ink", "ion",
  208. "its", "jam", "jet", "job", "joy", "ken", "key", "kid", "kit", "lab", "lad",
  209. "lag", "law", "lay", "led", "leg", "let", "lid", "lie", "lip", "lit", "log",
  210. "lot", "low", "mad", "man", "map", "may", "men", "met", "mix", "mob", "mod",
  211. "mud", "mug", "mum", "nay", "net", "new", "nil", "nor", "not", "now", "nun",
  212. "nut", "oar", "odd", "off", "oil", "old", "one", "opt", "our", "out", "owe",
  213. "own", "pad", "pan", "par", "pat", "pay", "pen", "per", "pet", "pie", "pig",
  214. "pin", "pit", "pop", "pot", "pro", "pub", "pun", "put", "rag", "ram", "ran",
  215. "rat", "raw", "ray", "red", "rid", "rip", "rod", "rot", "row", "rub", "run",
  216. "sad", "sat", "saw", "say", "sea", "see", "set", "sex", "she", "shy", "sic",
  217. "sin", "sir", "sit", "six", "sky", "sod", "son", "spy", "sue", "sum", "sun",
  218. "tab", "tag", "tap", "tax", "tea", "ten", "the", "tie", "tin", "tip", "toe",
  219. "ton", "too", "top", "toy", "try", "two", "use", "van", "vat", "vet", "via",
  220. "war", "was", "way", "wed", "wee", "wet", "who", "why", "win", "wit", "won",
  221. "yes", "yet", "you", NULL
  222. };
  223.  
  224. int main()
  225. {
  226. struct T *w3 = NULL;
  227. struct T *w5 = NULL;
  228. const char **p;
  229. int i;
  230.  
  231. memset(letter, -1, sizeof(letter));
  232.  
  233. for (i = 0; i < 26; i++) {
  234. letter['a' + i] = i;
  235. letter['A' + i] = i;
  236. }
  237.  
  238. p = d3;
  239. while (*p) tadd(&w3, *p++);
  240.  
  241. p = d5;
  242. while (*p) tadd(&w5, *p++);
  243.  
  244. if (1) {
  245. char grid[3][5];
  246. struct T *a[5] = {w3, w3, w3, w3, w3};
  247. struct T *d[3] = {w5, w5, w5};
  248.  
  249. fill(grid, a, d, 0);
  250. }
  251.  
  252. tdestroy(w3);
  253. tdestroy(w5);
  254.  
  255. return 0;
  256. }
  257.  
Success #stdin #stdout 0.01s 4336KB
stdin
Standard input is empty
stdout
 H A P P Y
 A G R E E
 D O O R S

 L E A S T
 A G R E E
 W O M A N

 L E A S T
 A R G U E
 G R E E N

 M E A N S
 A R G U E
 P R O N E

 R E A C T
 A R G U E
 G R E E N

 R E A D Y
 A R G U E
 T R E E S

 R E P L Y
 A G R E E
 G O O D S

 S T E A L
 H E N C E
 E N D E D

 T R E A T
 E A R T H
 A G R E E