ad49340bec7ec3b535175ea2a3b178f1d48cea87
[ou-summer-of-code-2017.git] / 08-word-chains / explore-word-chain7.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {
7 "collapsed": true
8 },
9 "outputs": [],
10 "source": [
11 "import string\n",
12 "import heapq\n",
13 "import collections\n",
14 "import random"
15 ]
16 },
17 {
18 "cell_type": "code",
19 "execution_count": 2,
20 "metadata": {},
21 "outputs": [
22 {
23 "data": {
24 "text/plain": [
25 "9815"
26 ]
27 },
28 "execution_count": 2,
29 "metadata": {},
30 "output_type": "execute_result"
31 }
32 ],
33 "source": [
34 "words = [w.strip() for w in open('words7.txt').readlines()]\n",
35 "len(words)"
36 ]
37 },
38 {
39 "cell_type": "code",
40 "execution_count": 3,
41 "metadata": {},
42 "outputs": [
43 {
44 "data": {
45 "text/plain": [
46 "['abalone',\n",
47 " 'abandon',\n",
48 " 'abashed',\n",
49 " 'abashes',\n",
50 " 'abasing',\n",
51 " 'abating',\n",
52 " 'abdomen',\n",
53 " 'abducts',\n",
54 " 'abetted',\n",
55 " 'abetter']"
56 ]
57 },
58 "execution_count": 3,
59 "metadata": {},
60 "output_type": "execute_result"
61 }
62 ],
63 "source": [
64 "words[:10]"
65 ]
66 },
67 {
68 "cell_type": "code",
69 "execution_count": 4,
70 "metadata": {
71 "collapsed": true
72 },
73 "outputs": [],
74 "source": [
75 "def adjacents_explicit(word):\n",
76 " neighbours = []\n",
77 " for i in range(len(word)):\n",
78 " for l in string.ascii_lowercase:\n",
79 " if l != word[i]:\n",
80 " neighbours.append(word[0:i] + l + word[i+1:])\n",
81 " return neighbours"
82 ]
83 },
84 {
85 "cell_type": "code",
86 "execution_count": 5,
87 "metadata": {
88 "collapsed": true
89 },
90 "outputs": [],
91 "source": [
92 "def adjacents(word):\n",
93 " return [word[0:i] + l + word[i+1:]\n",
94 " for i in range(len(word))\n",
95 " for l in string.ascii_lowercase\n",
96 " if l != word[i]]"
97 ]
98 },
99 {
100 "cell_type": "code",
101 "execution_count": 10,
102 "metadata": {},
103 "outputs": [],
104 "source": [
105 "# neighbours = {w: [n for n in adjacents(w) if n in words]\n",
106 "# for w in words}"
107 ]
108 },
109 {
110 "cell_type": "code",
111 "execution_count": 17,
112 "metadata": {},
113 "outputs": [],
114 "source": [
115 "worddict = {w: True for w in words}\n",
116 "neighbours = {w: [n for n in adjacents(w) if n in worddict]\n",
117 " for w in words}"
118 ]
119 },
120 {
121 "cell_type": "code",
122 "execution_count": 12,
123 "metadata": {},
124 "outputs": [
125 {
126 "data": {
127 "text/plain": [
128 "[]"
129 ]
130 },
131 "execution_count": 12,
132 "metadata": {},
133 "output_type": "execute_result"
134 }
135 ],
136 "source": [
137 "# [w for w in words if sorted(neighbours[w]) != sorted(neighbours2[w])]"
138 ]
139 },
140 {
141 "cell_type": "code",
142 "execution_count": 7,
143 "metadata": {},
144 "outputs": [
145 {
146 "name": "stdout",
147 "output_type": "stream",
148 "text": [
149 "1 loop, best of 3: 4min 2s per loop\n"
150 ]
151 }
152 ],
153 "source": [
154 "# %%timeit\n",
155 "# neighbours = {w: [n for n in adjacents(w) if n in words]\n",
156 "# for w in words}"
157 ]
158 },
159 {
160 "cell_type": "code",
161 "execution_count": 8,
162 "metadata": {},
163 "outputs": [
164 {
165 "name": "stdout",
166 "output_type": "stream",
167 "text": [
168 "1 loop, best of 3: 655 ms per loop\n"
169 ]
170 }
171 ],
172 "source": [
173 "%%timeit\n",
174 "worddict = {w: True for w in words}\n",
175 "neighbours2 = {w: [n for n in adjacents(w) if n in worddict]\n",
176 " for w in words}"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 13,
182 "metadata": {},
183 "outputs": [
184 {
185 "name": "stdout",
186 "output_type": "stream",
187 "text": [
188 "1 loop, best of 3: 629 ms per loop\n"
189 ]
190 }
191 ],
192 "source": [
193 "%%timeit\n",
194 "wordset = set(words)\n",
195 "neighbours3 = {w: [n for n in adjacents(w) if n in wordset]\n",
196 " for w in words}"
197 ]
198 },
199 {
200 "cell_type": "code",
201 "execution_count": 18,
202 "metadata": {},
203 "outputs": [
204 {
205 "data": {
206 "text/plain": [
207 "[]"
208 ]
209 },
210 "execution_count": 18,
211 "metadata": {},
212 "output_type": "execute_result"
213 }
214 ],
215 "source": [
216 "neighbours['abalone']"
217 ]
218 },
219 {
220 "cell_type": "code",
221 "execution_count": 20,
222 "metadata": {},
223 "outputs": [
224 {
225 "data": {
226 "text/plain": [
227 "['abashes']"
228 ]
229 },
230 "execution_count": 20,
231 "metadata": {},
232 "output_type": "execute_result"
233 }
234 ],
235 "source": [
236 "neighbours['abashed']"
237 ]
238 },
239 {
240 "cell_type": "code",
241 "execution_count": 21,
242 "metadata": {},
243 "outputs": [
244 {
245 "data": {
246 "text/plain": [
247 "['abusing', 'abating']"
248 ]
249 },
250 "execution_count": 21,
251 "metadata": {},
252 "output_type": "execute_result"
253 }
254 ],
255 "source": [
256 "neighbours['abasing']"
257 ]
258 },
259 {
260 "cell_type": "code",
261 "execution_count": 22,
262 "metadata": {},
263 "outputs": [
264 {
265 "data": {
266 "text/plain": [
267 "[('abalone', []),\n",
268 " ('abandon', []),\n",
269 " ('abashed', ['abashes']),\n",
270 " ('abashes', ['abashed']),\n",
271 " ('abasing', ['abusing', 'abating']),\n",
272 " ('abating', ['abasing']),\n",
273 " ('abdomen', []),\n",
274 " ('abducts', []),\n",
275 " ('abetted', ['abutted', 'abetter']),\n",
276 " ('abetter', ['abettor', 'abetted'])]"
277 ]
278 },
279 "execution_count": 22,
280 "metadata": {},
281 "output_type": "execute_result"
282 }
283 ],
284 "source": [
285 "[(w, neighbours[w]) for w in words[:10]]"
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 37,
291 "metadata": {},
292 "outputs": [
293 {
294 "data": {
295 "text/plain": [
296 "[('brewery', ['brewers']),\n",
297 " ('brewing', ['crewing']),\n",
298 " ('bribery', []),\n",
299 " ('bribing', []),\n",
300 " ('bricked', ['cricked', 'pricked', 'tricked', 'brisked']),\n",
301 " ('bridals', []),\n",
302 " ('bridged', ['bridled', 'bridges']),\n",
303 " ('bridges', ['fridges', 'bridles', 'bridged']),\n",
304 " ('bridled', ['bridged', 'bridles']),\n",
305 " ('bridles', ['bridges', 'bridled'])]"
306 ]
307 },
308 "execution_count": 37,
309 "metadata": {},
310 "output_type": "execute_result"
311 }
312 ],
313 "source": [
314 "[(w, neighbours[w]) for w in words[1000:1010]]"
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": 23,
320 "metadata": {
321 "collapsed": true
322 },
323 "outputs": [],
324 "source": [
325 "def distance(w1, w2):\n",
326 " return sum(1 for i in range(len(w1))\n",
327 " if w1[i] != w2[i])"
328 ]
329 },
330 {
331 "cell_type": "code",
332 "execution_count": 24,
333 "metadata": {},
334 "outputs": [
335 {
336 "data": {
337 "text/plain": [
338 "0"
339 ]
340 },
341 "execution_count": 24,
342 "metadata": {},
343 "output_type": "execute_result"
344 }
345 ],
346 "source": [
347 "distance('abating', 'abating')"
348 ]
349 },
350 {
351 "cell_type": "code",
352 "execution_count": 25,
353 "metadata": {},
354 "outputs": [
355 {
356 "data": {
357 "text/plain": [
358 "4"
359 ]
360 },
361 "execution_count": 25,
362 "metadata": {},
363 "output_type": "execute_result"
364 }
365 ],
366 "source": [
367 "distance('abating', 'abetter')"
368 ]
369 },
370 {
371 "cell_type": "code",
372 "execution_count": 26,
373 "metadata": {
374 "collapsed": true
375 },
376 "outputs": [],
377 "source": [
378 "def extend(chain, closed=None):\n",
379 " if closed:\n",
380 " nbrs = set(neighbours[chain[-1]]) - closed\n",
381 " else:\n",
382 " nbrs = neighbours[chain[-1]]\n",
383 " return [chain + [s] for s in nbrs\n",
384 " if s not in chain]"
385 ]
386 },
387 {
388 "cell_type": "code",
389 "execution_count": 38,
390 "metadata": {},
391 "outputs": [
392 {
393 "data": {
394 "text/plain": [
395 "[['bridges', 'fridges'], ['bridges', 'bridles'], ['bridges', 'bridged']]"
396 ]
397 },
398 "execution_count": 38,
399 "metadata": {},
400 "output_type": "execute_result"
401 }
402 ],
403 "source": [
404 "extend(['bridges'])"
405 ]
406 },
407 {
408 "cell_type": "code",
409 "execution_count": 39,
410 "metadata": {},
411 "outputs": [
412 {
413 "data": {
414 "text/plain": [
415 "[['bridges', 'bridles', 'bridled']]"
416 ]
417 },
418 "execution_count": 39,
419 "metadata": {},
420 "output_type": "execute_result"
421 }
422 ],
423 "source": [
424 "extend(['bridges', 'bridles'])"
425 ]
426 },
427 {
428 "cell_type": "code",
429 "execution_count": 40,
430 "metadata": {},
431 "outputs": [
432 {
433 "data": {
434 "text/plain": [
435 "[['bridges', 'bridles', 'bridled', 'bridged']]"
436 ]
437 },
438 "execution_count": 40,
439 "metadata": {},
440 "output_type": "execute_result"
441 }
442 ],
443 "source": [
444 "extend(['bridges', 'bridles', 'bridled'])"
445 ]
446 },
447 {
448 "cell_type": "code",
449 "execution_count": 69,
450 "metadata": {
451 "collapsed": true
452 },
453 "outputs": [],
454 "source": [
455 "def bfs_search(start, goal, debug=False):\n",
456 " agenda = [[start]]\n",
457 " finished = False\n",
458 " while not finished and agenda:\n",
459 " current = agenda[0]\n",
460 " if debug:\n",
461 " print(current)\n",
462 " if current[-1] == goal:\n",
463 " finished = True\n",
464 " else:\n",
465 " successors = extend(current)\n",
466 " agenda = agenda[1:] + successors\n",
467 " if finished:\n",
468 " return current\n",
469 " else:\n",
470 " return None "
471 ]
472 },
473 {
474 "cell_type": "code",
475 "execution_count": 70,
476 "metadata": {
477 "collapsed": true
478 },
479 "outputs": [],
480 "source": [
481 "def bfs_search_closed(start, goal, debug=False):\n",
482 " agenda = [[start]]\n",
483 " closed = set()\n",
484 " finished = False\n",
485 " while not finished and agenda:\n",
486 " current = agenda[0]\n",
487 " if debug:\n",
488 " print(current)\n",
489 " if current[-1] == goal:\n",
490 " finished = True\n",
491 " else:\n",
492 " closed.add(current[-1])\n",
493 " successors = extend(current, closed)\n",
494 " agenda = agenda[1:] + successors\n",
495 " if finished:\n",
496 " return current\n",
497 " else:\n",
498 " return None "
499 ]
500 },
501 {
502 "cell_type": "code",
503 "execution_count": 71,
504 "metadata": {
505 "collapsed": true
506 },
507 "outputs": [],
508 "source": [
509 "def dfs_search(start, goal, debug=False):\n",
510 " agenda = [[start]]\n",
511 " finished = False\n",
512 " while not finished and agenda:\n",
513 " current = agenda[0]\n",
514 " if debug:\n",
515 " print(current)\n",
516 " if current[-1] == goal:\n",
517 " finished = True\n",
518 " else:\n",
519 " successors = extend(current)\n",
520 " agenda = successors + agenda[1:]\n",
521 " if finished:\n",
522 " return current\n",
523 " else:\n",
524 " return None "
525 ]
526 },
527 {
528 "cell_type": "code",
529 "execution_count": 72,
530 "metadata": {
531 "collapsed": true
532 },
533 "outputs": [],
534 "source": [
535 "def astar_search(start, goal, debug=False):\n",
536 " agenda = [(distance(start, goal), [start])]\n",
537 " heapq.heapify(agenda)\n",
538 " finished = False\n",
539 " while not finished and agenda:\n",
540 " _, current = heapq.heappop(agenda)\n",
541 " if debug:\n",
542 " print(current)\n",
543 " if current[-1] == goal:\n",
544 " finished = True\n",
545 " else:\n",
546 " successors = extend(current)\n",
547 " for s in successors:\n",
548 " heapq.heappush(agenda, (len(current) + distance(s[-1], goal) - 1, s))\n",
549 " if finished:\n",
550 " return current\n",
551 " else:\n",
552 " return None "
553 ]
554 },
555 {
556 "cell_type": "code",
557 "execution_count": 73,
558 "metadata": {
559 "collapsed": true
560 },
561 "outputs": [],
562 "source": [
563 "def astar_search_closed(start, goal, debug=False):\n",
564 " agenda = [(distance(start, goal), [start])]\n",
565 " heapq.heapify(agenda)\n",
566 " closed = set()\n",
567 " finished = False\n",
568 " while not finished and agenda:\n",
569 " _, current = heapq.heappop(agenda)\n",
570 " if debug:\n",
571 " print(current)\n",
572 " if current[-1] == goal:\n",
573 " finished = True\n",
574 " else:\n",
575 " closed.add(current[-1])\n",
576 " successors = extend(current, closed)\n",
577 " for s in successors:\n",
578 " heapq.heappush(agenda, (len(current) + distance(s[-1], goal) - 1, s))\n",
579 " if finished:\n",
580 " return current\n",
581 " else:\n",
582 " return None "
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "# Mutually-reachable sets\n",
590 "\n",
591 "Find the transitive closure of the `neighbours` relation, so we can see which words can be transformed into which other words."
592 ]
593 },
594 {
595 "cell_type": "code",
596 "execution_count": 41,
597 "metadata": {},
598 "outputs": [
599 {
600 "data": {
601 "text/plain": [
602 "5109"
603 ]
604 },
605 "execution_count": 41,
606 "metadata": {},
607 "output_type": "execute_result"
608 }
609 ],
610 "source": [
611 "candidates = [set([k] + neighbours[k]) for k in neighbours]\n",
612 "reachables = []\n",
613 "while candidates:\n",
614 " current = set(candidates.pop())\n",
615 " altered = False\n",
616 " for other in candidates:\n",
617 " if current.intersection(other):\n",
618 " altered = True\n",
619 " current.update(other)\n",
620 " candidates.remove(other)\n",
621 " if altered:\n",
622 " candidates.append(current)\n",
623 " else:\n",
624 " reachables.append(current)\n",
625 "\n",
626 "len(reachables)"
627 ]
628 },
629 {
630 "cell_type": "code",
631 "execution_count": 42,
632 "metadata": {},
633 "outputs": [
634 {
635 "data": {
636 "text/plain": [
637 "1400"
638 ]
639 },
640 "execution_count": 42,
641 "metadata": {},
642 "output_type": "execute_result"
643 }
644 ],
645 "source": [
646 "len(max(reachables, key=len))"
647 ]
648 },
649 {
650 "cell_type": "code",
651 "execution_count": 43,
652 "metadata": {},
653 "outputs": [
654 {
655 "data": {
656 "text/plain": [
657 "1"
658 ]
659 },
660 "execution_count": 43,
661 "metadata": {},
662 "output_type": "execute_result"
663 }
664 ],
665 "source": [
666 "len(min(reachables, key=len))"
667 ]
668 },
669 {
670 "cell_type": "code",
671 "execution_count": 44,
672 "metadata": {
673 "scrolled": true
674 },
675 "outputs": [
676 {
677 "data": {
678 "text/plain": [
679 "Counter({1: 4102,\n",
680 " 2: 632,\n",
681 " 3: 183,\n",
682 " 4: 70,\n",
683 " 5: 35,\n",
684 " 6: 24,\n",
685 " 7: 19,\n",
686 " 8: 7,\n",
687 " 9: 11,\n",
688 " 10: 3,\n",
689 " 11: 5,\n",
690 " 12: 1,\n",
691 " 13: 4,\n",
692 " 14: 1,\n",
693 " 15: 1,\n",
694 " 17: 1,\n",
695 " 18: 1,\n",
696 " 19: 2,\n",
697 " 22: 1,\n",
698 " 25: 1,\n",
699 " 48: 1,\n",
700 " 133: 1,\n",
701 " 361: 1,\n",
702 " 773: 1,\n",
703 " 1400: 1})"
704 ]
705 },
706 "execution_count": 44,
707 "metadata": {},
708 "output_type": "execute_result"
709 }
710 ],
711 "source": [
712 "collections.Counter(len(r) for r in reachables)"
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 45,
718 "metadata": {
719 "scrolled": true
720 },
721 "outputs": [
722 {
723 "data": {
724 "text/plain": [
725 "[{'nullify', 'nullity'},\n",
726 " {'believe', 'relieve'},\n",
727 " {'wriggle', 'wriggly'},\n",
728 " {'appeals', 'appears'},\n",
729 " {'liaised', 'liaises'},\n",
730 " {'gibbons', 'ribbons'},\n",
731 " {'colonel', 'colones'},\n",
732 " {'vehicle', 'vesicle'},\n",
733 " {'unclean', 'unclear'},\n",
734 " {'yodeled', 'yodeler'},\n",
735 " {'minions', 'pinions'},\n",
736 " {'achiest', 'ashiest'},\n",
737 " {'regimen', 'regimes'},\n",
738 " {'produce', 'product'},\n",
739 " {'choicer', 'choices'},\n",
740 " {'immured', 'immures'},\n",
741 " {'retried', 'retries'},\n",
742 " {'blessed', 'blesses'},\n",
743 " {'herniae', 'hernias'},\n",
744 " {'mealier', 'meatier'},\n",
745 " {'scrubby', 'shrubby'},\n",
746 " {'treacle', 'treadle'},\n",
747 " {'redrawn', 'redraws'},\n",
748 " {'modular', 'nodular'},\n",
749 " {'lacunae', 'lacunas'},\n",
750 " {'martial', 'partial'},\n",
751 " {'jackals', 'jackass'},\n",
752 " {'ploughs', 'sloughs'},\n",
753 " {'salmons', 'saloons'},\n",
754 " {'armored', 'armorer'},\n",
755 " {'ability', 'agility'},\n",
756 " {'draping', 'drawing'},\n",
757 " {'tousled', 'tousles'},\n",
758 " {'coerced', 'coerces'},\n",
759 " {'fiestas', 'siestas'},\n",
760 " {'rankled', 'rankles'},\n",
761 " {'evolved', 'evolves'},\n",
762 " {'maestri', 'maestro'},\n",
763 " {'kennels', 'kernels'},\n",
764 " {'donkeys', 'monkeys'},\n",
765 " {'caftans', 'kaftans'},\n",
766 " {'outfits', 'outwits'},\n",
767 " {'renamed', 'renames'},\n",
768 " {'shadows', 'shadowy'},\n",
769 " {'scorers', 'snorers'},\n",
770 " {'jostled', 'jostles'},\n",
771 " {'overran', 'overrun'},\n",
772 " {'falsify', 'falsity'},\n",
773 " {'gyrated', 'gyrates'},\n",
774 " {'caverns', 'taverns'},\n",
775 " {'shushed', 'shushes'},\n",
776 " {'seventh', 'seventy'},\n",
777 " {'cabbies', 'tabbies'},\n",
778 " {'factors', 'factory'},\n",
779 " {'gnashed', 'gnashes'},\n",
780 " {'launder', 'maunder'},\n",
781 " {'focused', 'focuses'},\n",
782 " {'widened', 'wizened'},\n",
783 " {'hostels', 'hostess'},\n",
784 " {'wigwags', 'wigwams'},\n",
785 " {'postman', 'postmen'},\n",
786 " {'fortify', 'mortify'},\n",
787 " {'disport', 'distort'},\n",
788 " {'aliened', 'aligned'},\n",
789 " {'lechers', 'lechery'},\n",
790 " {'scruffs', 'scruffy'},\n",
791 " {'castled', 'castles'},\n",
792 " {'milkman', 'milkmen'},\n",
793 " {'hoodoos', 'voodoos'},\n",
794 " {'cronies', 'ironies'},\n",
795 " {'aliased', 'aliases'},\n",
796 " {'figured', 'figures'},\n",
797 " {'unnamed', 'untamed'},\n",
798 " {'perused', 'peruses'},\n",
799 " {'beckons', 'reckons'},\n",
800 " {'flakier', 'flukier'},\n",
801 " {'profane', 'propane'},\n",
802 " {'purpler', 'purples'},\n",
803 " {'detours', 'devours'},\n",
804 " {'bonnets', 'sonnets'},\n",
805 " {'clement', 'element'},\n",
806 " {'swerved', 'swerves'},\n",
807 " {'inhabit', 'inhibit'},\n",
808 " {'service', 'servile'},\n",
809 " {'fixture', 'mixture'},\n",
810 " {'fronted', 'frosted'},\n",
811 " {'heppest', 'hippest'},\n",
812 " {'masques', 'mosques'},\n",
813 " {'joyride', 'joyrode'},\n",
814 " {'boatman', 'boatmen'},\n",
815 " {'edified', 'edifies'},\n",
816 " {'copecks', 'kopecks'},\n",
817 " {'cassock', 'hassock'},\n",
818 " {'hansoms', 'ransoms'},\n",
819 " {'lucidly', 'luridly'},\n",
820 " {'tenured', 'tenures'},\n",
821 " {'kinsman', 'kinsmen'},\n",
822 " {'endorse', 'indorse'},\n",
823 " {'lizards', 'wizards'},\n",
824 " {'siphons', 'syphons'},\n",
825 " {'whooped', 'whoopee'},\n",
826 " {'topmast', 'topmost'},\n",
827 " {'equated', 'equates'},\n",
828 " {'cranium', 'uranium'},\n",
829 " {'affects', 'effects'},\n",
830 " {'seminal', 'seminar'},\n",
831 " {'defiant', 'deviant'},\n",
832 " {'roguish', 'voguish'},\n",
833 " {'archers', 'archery'},\n",
834 " {'bummest', 'rummest'},\n",
835 " {'bronchi', 'broncho'},\n",
836 " {'plowman', 'plowmen'},\n",
837 " {'brothel', 'brother'},\n",
838 " {'decline', 'recline'},\n",
839 " {'licence', 'license'},\n",
840 " {'tampons', 'tarpons'},\n",
841 " {'queried', 'queries'},\n",
842 " {'paisley', 'parsley'},\n",
843 " {'conceal', 'congeal'},\n",
844 " {'tumbrel', 'tumbril'},\n",
845 " {'exposed', 'exposes'},\n",
846 " {'gaudier', 'gauzier'},\n",
847 " {'slackly', 'slickly'},\n",
848 " {'caraway', 'faraway'},\n",
849 " {'girdled', 'girdles'},\n",
850 " {'baulked', 'caulked'},\n",
851 " {'declaim', 'reclaim'},\n",
852 " {'probate', 'prorate'},\n",
853 " {'tartans', 'tartars'},\n",
854 " {'voicing', 'voiding'},\n",
855 " {'rewrite', 'rewrote'},\n",
856 " {'pension', 'tension'},\n",
857 " {'enabled', 'enables'},\n",
858 " {'halfway', 'hallway'},\n",
859 " {'clamors', 'glamors'},\n",
860 " {'scuttle', 'shuttle'},\n",
861 " {'deleted', 'deletes'},\n",
862 " {'caveman', 'cavemen'},\n",
863 " {'retread', 'retreat'},\n",
864 " {'parkway', 'partway'},\n",
865 " {'lounged', 'lounges'},\n",
866 " {'centred', 'centres'},\n",
867 " {'sidebar', 'sidecar'},\n",
868 " {'lengths', 'lengthy'},\n",
869 " {'mislead', 'misread'},\n",
870 " {'predate', 'prelate'},\n",
871 " {'submits', 'summits'},\n",
872 " {'granges', 'oranges'},\n",
873 " {'exhaled', 'exhales'},\n",
874 " {'cumquat', 'kumquat'},\n",
875 " {'someday', 'someway'},\n",
876 " {'outgrew', 'outgrow'},\n",
877 " {'snivels', 'swivels'},\n",
878 " {'currant', 'current'},\n",
879 " {'taproom', 'taproot'},\n",
880 " {'incense', 'intense'},\n",
881 " {'showers', 'showery'},\n",
882 " {'lovable', 'movable'},\n",
883 " {'metered', 'petered'},\n",
884 " {'outcast', 'outlast'},\n",
885 " {'gaunter', 'saunter'},\n",
886 " {'spumone', 'spumoni'},\n",
887 " {'photons', 'protons'},\n",
888 " {'revenge', 'revenue'},\n",
889 " {'critter', 'fritter'},\n",
890 " {'culture', 'vulture'},\n",
891 " {'outlaws', 'outlays'},\n",
892 " {'reasons', 'seasons'},\n",
893 " {'mortice', 'mortise'},\n",
894 " {'atheism', 'atheist'},\n",
895 " {'immense', 'immerse'},\n",
896 " {'helices', 'helixes'},\n",
897 " {'gushers', 'pushers'},\n",
898 " {'clobber', 'slobber'},\n",
899 " {'deceive', 'receive'},\n",
900 " {'taxiing', 'taxying'},\n",
901 " {'newsman', 'newsmen'},\n",
902 " {'gloried', 'glories'},\n",
903 " {'deadens', 'deafens'},\n",
904 " {'jigsawn', 'jigsaws'},\n",
905 " {'custard', 'mustard'},\n",
906 " {'carrots', 'parrots'},\n",
907 " {'warship', 'worship'},\n",
908 " {'figment', 'pigment'},\n",
909 " {'amended', 'emended'},\n",
910 " {'sophism', 'sophist'},\n",
911 " {'poisons', 'prisons'},\n",
912 " {'bodices', 'codices'},\n",
913 " {'abraded', 'abrades'},\n",
914 " {'primate', 'private'},\n",
915 " {'stymied', 'stymies'},\n",
916 " {'vantage', 'vintage'},\n",
917 " {'jobless', 'joyless'},\n",
918 " {'sandman', 'sandmen'},\n",
919 " {'adduced', 'adduces'},\n",
920 " {'optical', 'optimal'},\n",
921 " {'whelked', 'whelped'},\n",
922 " {'roundly', 'soundly'},\n",
923 " {'testify', 'testily'},\n",
924 " {'sourced', 'sources'},\n",
925 " {'fearful', 'tearful'},\n",
926 " {'neighed', 'weighed'},\n",
927 " {'outside', 'outsize'},\n",
928 " {'dappled', 'dapples'},\n",
929 " {'scrolls', 'strolls'},\n",
930 " {'secrete', 'secrets'},\n",
931 " {'conveys', 'convoys'},\n",
932 " {'implied', 'implies'},\n",
933 " {'sluiced', 'sluices'},\n",
934 " {'piloted', 'pivoted'},\n",
935 " {'sandals', 'vandals'},\n",
936 " {'thereby', 'whereby'},\n",
937 " {'refrain', 'retrain'},\n",
938 " {'grandma', 'grandpa'},\n",
939 " {'deforms', 'reforms'},\n",
940 " {'foments', 'moments'},\n",
941 " {'beliefs', 'reliefs'},\n",
942 " {'closure', 'cloture'},\n",
943 " {'comings', 'copings'},\n",
944 " {'topsail', 'topsoil'},\n",
945 " {'oration', 'ovation'},\n",
946 " {'abashed', 'abashes'},\n",
947 " {'enrolls', 'unrolls'},\n",
948 " {'hurrahs', 'hurrays'},\n",
949 " {'waltzed', 'waltzes'},\n",
950 " {'dunnest', 'funnest'},\n",
951 " {'scrimps', 'shrimps'},\n",
952 " {'fission', 'mission'},\n",
953 " {'whizzed', 'whizzes'},\n",
954 " {'telexed', 'telexes'},\n",
955 " {'tempted', 'tempter'},\n",
956 " {'damaged', 'damages'},\n",
957 " {'quarter', 'quartet'},\n",
958 " {'phrased', 'phrases'},\n",
959 " {'freeman', 'freemen'},\n",
960 " {'artiste', 'artists'},\n",
961 " {'trebled', 'trebles'},\n",
962 " {'formals', 'formats'},\n",
963 " {'quizzed', 'quizzes'},\n",
964 " {'festive', 'restive'},\n",
965 " {'eclipse', 'ellipse'},\n",
966 " {'tribune', 'tribute'},\n",
967 " {'combats', 'wombats'},\n",
968 " {'freebee', 'freebie'},\n",
969 " {'copulae', 'copulas'},\n",
970 " {'reverie', 'reverse'},\n",
971 " {'employe', 'employs'},\n",
972 " {'alleged', 'alleges'},\n",
973 " {'jazzing', 'razzing'},\n",
974 " {'deplete', 'replete'},\n",
975 " {'pigeons', 'wigeons'},\n",
976 " {'obliged', 'obliges'},\n",
977 " {'magneto', 'magnets'},\n",
978 " {'maydays', 'paydays'},\n",
979 " {'dumbest', 'numbest'},\n",
980 " {'retyped', 'retypes'},\n",
981 " {'angular', 'annular'},\n",
982 " {'display', 'misplay'},\n",
983 " {'bewared', 'bewares'},\n",
984 " {'interne', 'interns'},\n",
985 " {'linings', 'livings'},\n",
986 " {'baseman', 'basemen'},\n",
987 " {'diverge', 'diverse'},\n",
988 " {'assayed', 'essayed'},\n",
989 " {'acceded', 'accedes'},\n",
990 " {'animism', 'animist'},\n",
991 " {'cutback', 'outback'},\n",
992 " {'burgeon', 'surgeon'},\n",
993 " {'accrued', 'accrues'},\n",
994 " {'imputed', 'imputes'},\n",
995 " {'aphasia', 'aphasic'},\n",
996 " {'kittens', 'mittens'},\n",
997 " {'glanced', 'glances'},\n",
998 " {'jimmied', 'jimmies'},\n",
999 " {'gummier', 'yummier'},\n",
1000 " {'miscued', 'miscues'},\n",
1001 " {'saluted', 'salutes'},\n",
1002 " {'smokers', 'stokers'},\n",
1003 " {'drummed', 'drummer'},\n",
1004 " {'explode', 'explore'},\n",
1005 " {'detoxed', 'detoxes'},\n",
1006 " {'cruelly', 'cruelty'},\n",
1007 " {'calcine', 'calcite'},\n",
1008 " {'hardest', 'harvest'},\n",
1009 " {'hawkish', 'mawkish'},\n",
1010 " {'patinae', 'patinas'},\n",
1011 " {'skulked', 'skunked'},\n",
1012 " {'lawyers', 'sawyers'},\n",
1013 " {'glacier', 'glazier'},\n",
1014 " {'spriest', 'spryest'},\n",
1015 " {'healthy', 'wealthy'},\n",
1016 " {'jurists', 'purists'},\n",
1017 " {'insider', 'insides'},\n",
1018 " {'chooses', 'choosey'},\n",
1019 " {'kneeled', 'knelled'},\n",
1020 " {'anneals', 'annuals'},\n",
1021 " {'aspired', 'aspires'},\n",
1022 " {'parlays', 'parleys'},\n",
1023 " {'cession', 'session'},\n",
1024 " {'egotism', 'egotist'},\n",
1025 " {'spectra', 'spectre'},\n",
1026 " {'privets', 'trivets'},\n",
1027 " {'bleaker', 'breaker'},\n",
1028 " {'fateful', 'hateful'},\n",
1029 " {'reactor', 'realtor'},\n",
1030 " {'liquefy', 'liquify'},\n",
1031 " {'thrifts', 'thrifty'},\n",
1032 " {'huffier', 'puffier'},\n",
1033 " {'adhered', 'adheres'},\n",
1034 " {'roseate', 'rosette'},\n",
1035 " {'audible', 'audibly'},\n",
1036 " {'bronzed', 'bronzes'},\n",
1037 " {'evinced', 'evinces'},\n",
1038 " {'woodman', 'woodmen'},\n",
1039 " {'defence', 'defense'},\n",
1040 " {'defends', 'depends'},\n",
1041 " {'earthed', 'earthen'},\n",
1042 " {'moussed', 'mousses'},\n",
1043 " {'ghastly', 'ghostly'},\n",
1044 " {'thieved', 'thieves'},\n",
1045 " {'sheathe', 'sheaths'},\n",
1046 " {'analyse', 'analyst'},\n",
1047 " {'caddish', 'faddish'},\n",
1048 " {'septets', 'sextets'},\n",
1049 " {'fixated', 'fixates'},\n",
1050 " {'caloric', 'calorie'},\n",
1051 " {'denials', 'menials'},\n",
1052 " {'restful', 'zestful'},\n",
1053 " {'lasagna', 'lasagne'},\n",
1054 " {'dryness', 'wryness'},\n",
1055 " {'leagued', 'leagues'},\n",
1056 " {'journey', 'tourney'},\n",
1057 " {'showier', 'snowier'},\n",
1058 " {'hideous', 'hideout'},\n",
1059 " {'intoned', 'intones'},\n",
1060 " {'imagine', 'imaging'},\n",
1061 " {'perjure', 'perjury'},\n",
1062 " {'albumen', 'albumin'},\n",
1063 " {'legally', 'regally'},\n",
1064 " {'applied', 'applies'},\n",
1065 " {'villain', 'villein'},\n",
1066 " {'arching', 'arcking'},\n",
1067 " {'imbibed', 'imbibes'},\n",
1068 " {'wastage', 'wattage'},\n",
1069 " {'inshore', 'onshore'},\n",
1070 " {'loathed', 'loathes'},\n",
1071 " {'dearths', 'hearths'},\n",
1072 " {'dulness', 'fulness'},\n",
1073 " {'foamier', 'loamier'},\n",
1074 " {'cannier', 'pannier'},\n",
1075 " {'bequest', 'request'},\n",
1076 " {'gossips', 'gossipy'},\n",
1077 " {'droning', 'ironing'},\n",
1078 " {'lineman', 'linemen'},\n",
1079 " {'casings', 'casinos'},\n",
1080 " {'sniping', 'swiping'},\n",
1081 " {'brewers', 'brewery'},\n",
1082 " {'muscled', 'muscles'},\n",
1083 " {'leafier', 'leakier'},\n",
1084 " {'mourned', 'mourner'},\n",
1085 " {'enclave', 'enslave'},\n",
1086 " {'cockier', 'rockier'},\n",
1087 " {'orators', 'oratory'},\n",
1088 " {'cajoled', 'cajoles'},\n",
1089 " {'policed', 'polices'},\n",
1090 " {'annexed', 'annexes'},\n",
1091 " {'racists', 'rapists'},\n",
1092 " {'fiancee', 'fiances'},\n",
1093 " {'aerials', 'serials'},\n",
1094 " {'vacated', 'vacates'},\n",
1095 " {'setback', 'wetback'},\n",
1096 " {'deprave', 'deprive'},\n",
1097 " {'crueler', 'cruller'},\n",
1098 " {'bulimia', 'bulimic'},\n",
1099 " {'unloved', 'unmoved'},\n",
1100 " {'desired', 'desires'},\n",
1101 " {'baloney', 'boloney'},\n",
1102 " {'exhumed', 'exhumes'},\n",
1103 " {'subside', 'subsidy'},\n",
1104 " {'faintly', 'saintly'},\n",
1105 " {'officer', 'offices'},\n",
1106 " {'scrawls', 'sprawls'},\n",
1107 " {'excreta', 'excrete'},\n",
1108 " {'confide', 'confine'},\n",
1109 " {'resells', 'retells'},\n",
1110 " {'inflame', 'inflate'},\n",
1111 " {'dourest', 'sourest'},\n",
1112 " {'probing', 'proving'},\n",
1113 " {'writhed', 'writhes'},\n",
1114 " {'tamable', 'taxable'},\n",
1115 " {'bemused', 'bemuses'},\n",
1116 " {'garoted', 'garotes'},\n",
1117 " {'geegaws', 'gewgaws'},\n",
1118 " {'hearken', 'hearten'},\n",
1119 " {'cowards', 'towards'},\n",
1120 " {'enticed', 'entices'},\n",
1121 " {'scallop', 'scollop'},\n",
1122 " {'donated', 'donates'},\n",
1123 " {'bethink', 'rethink'},\n",
1124 " {'coltish', 'doltish'},\n",
1125 " {'thrones', 'throngs'},\n",
1126 " {'likened', 'livened'},\n",
1127 " {'collide', 'collude'},\n",
1128 " {'entrees', 'entries'},\n",
1129 " {'bromide', 'bromine'},\n",
1130 " {'haggard', 'laggard'},\n",
1131 " {'quicken', 'quicker'},\n",
1132 " {'ignoble', 'ignobly'},\n",
1133 " {'leopard', 'leotard'},\n",
1134 " {'phished', 'phisher'},\n",
1135 " {'gipsies', 'gypsies'},\n",
1136 " {'attuned', 'attunes'},\n",
1137 " {'lividly', 'vividly'},\n",
1138 " {'palaces', 'palates'},\n",
1139 " {'arrived', 'arrives'},\n",
1140 " {'mutated', 'mutates'},\n",
1141 " {'dazzled', 'dazzles'},\n",
1142 " {'tourism', 'tourist'},\n",
1143 " {'cleanly', 'clearly'},\n",
1144 " {'bushman', 'bushmen'},\n",
1145 " {'amiable', 'amiably'},\n",
1146 " {'dissect', 'dissent'},\n",
1147 " {'rotated', 'rotates'},\n",
1148 " {'implode', 'implore'},\n",
1149 " {'footman', 'footmen'},\n",
1150 " {'pirated', 'pirates'},\n",
1151 " {'nuanced', 'nuances'},\n",
1152 " {'solaced', 'solaces'},\n",
1153 " {'parable', 'payable'},\n",
1154 " {'seances', 'stances'},\n",
1155 " {'resumed', 'resumes'},\n",
1156 " {'hammock', 'hummock'},\n",
1157 " {'beacons', 'deacons'},\n",
1158 " {'ickiest', 'inkiest'},\n",
1159 " {'repaint', 'reprint'},\n",
1160 " {'smuggle', 'snuggle'},\n",
1161 " {'analogs', 'analogy'},\n",
1162 " {'peopled', 'peoples'},\n",
1163 " {'limiest', 'limpest'},\n",
1164 " {'subdued', 'subdues'},\n",
1165 " {'eeriest', 'veriest'},\n",
1166 " {'enuring', 'inuring'},\n",
1167 " {'frogman', 'frogmen'},\n",
1168 " {'largess', 'largest'},\n",
1169 " {'affixed', 'affixes'},\n",
1170 " {'whereas', 'whereat'},\n",
1171 " {'elastic', 'plastic'},\n",
1172 " {'babysat', 'babysit'},\n",
1173 " {'amassed', 'amasses'},\n",
1174 " {'carfare', 'warfare'},\n",
1175 " {'oarsman', 'oarsmen'},\n",
1176 " {'parents', 'patents'},\n",
1177 " {'addenda', 'addends'},\n",
1178 " {'victual', 'virtual'},\n",
1179 " {'torment', 'torrent'},\n",
1180 " {'enclose', 'inclose'},\n",
1181 " {'builder', 'guilder'},\n",
1182 " {'thirsts', 'thirsty'},\n",
1183 " {'lineups', 'linkups'},\n",
1184 " {'vibrate', 'vibrato'},\n",
1185 " {'spinals', 'spirals'},\n",
1186 " {'pasture', 'posture'},\n",
1187 " {'enfolds', 'unfolds'},\n",
1188 " {'faggots', 'maggots'},\n",
1189 " {'gooiest', 'goriest'},\n",
1190 " {'baleful', 'baneful'},\n",
1191 " {'chemise', 'chemist'},\n",
1192 " {'indexed', 'indexes'},\n",
1193 " {'layoffs', 'payoffs'},\n",
1194 " {'tannest', 'wannest'},\n",
1195 " {'makings', 'takings'},\n",
1196 " {'gussets', 'russets'},\n",
1197 " {'steeple', 'steeply'},\n",
1198 " {'expanse', 'expense'},\n",
1199 " {'portend', 'portent'},\n",
1200 " {'cursors', 'cursory'},\n",
1201 " {'fibulae', 'fibulas'},\n",
1202 " {'garaged', 'garages'},\n",
1203 " {'fleshly', 'freshly'},\n",
1204 " {'fiercer', 'fierier'},\n",
1205 " {'nostrum', 'rostrum'},\n",
1206 " {'affable', 'affably'},\n",
1207 " {'bandage', 'bondage'},\n",
1208 " {'shyness', 'slyness'},\n",
1209 " {'upstage', 'upstate'},\n",
1210 " {'crewman', 'crewmen'},\n",
1211 " {'leanest', 'meanest'},\n",
1212 " {'unseals', 'unseats'},\n",
1213 " {'inflect', 'inflict'},\n",
1214 " {'tractor', 'traitor'},\n",
1215 " {'blitzed', 'blitzes'},\n",
1216 " {'clamour', 'glamour'},\n",
1217 " {'ineptly', 'inertly'},\n",
1218 " {'trotted', 'trotter'},\n",
1219 " {'utopian', 'utopias'},\n",
1220 " {'fascism', 'fascist'},\n",
1221 " {'firearm', 'forearm'},\n",
1222 " {'cubicle', 'cuticle'},\n",
1223 " {'ukelele', 'ukulele'},\n",
1224 " {'needled', 'needles'},\n",
1225 " {'broiled', 'broiler'},\n",
1226 " {'pommels', 'pummels'},\n",
1227 " {'pomaded', 'pomades'},\n",
1228 " {'humored', 'rumored'},\n",
1229 " {'squashy', 'squishy'},\n",
1230 " {'milieus', 'milieux'},\n",
1231 " {'clubbed', 'flubbed'},\n",
1232 " {'queenly', 'queerly'},\n",
1233 " {'attired', 'attires'},\n",
1234 " {'heedful', 'needful'},\n",
1235 " {'scythed', 'scythes'},\n",
1236 " {'tabular', 'tubular'},\n",
1237 " {'nerving', 'serving'},\n",
1238 " {'rebuild', 'rebuilt'},\n",
1239 " {'tartest', 'tautest'},\n",
1240 " {'protean', 'protein'},\n",
1241 " {'hotshot', 'potshot'},\n",
1242 " {'curious', 'furious'},\n",
1243 " {'tipsier', 'tipster'},\n",
1244 " {'beetled', 'beetles'},\n",
1245 " {'imposed', 'imposes'},\n",
1246 " {'aimless', 'airless'},\n",
1247 " {'sibling', 'sidling'},\n",
1248 " {'topical', 'typical'},\n",
1249 " {'batsman', 'batsmen'},\n",
1250 " {'jujitsu', 'jujutsu'},\n",
1251 " {'coroner', 'coronet'},\n",
1252 " {'capital', 'capitol'},\n",
1253 " {'offence', 'offense'},\n",
1254 " {'briefed', 'briefer'},\n",
1255 " {'central', 'ventral'},\n",
1256 " {'chiding', 'chiming'},\n",
1257 " {'bloused', 'blouses'},\n",
1258 " {'unlaced', 'unlaces'},\n",
1259 " {'replied', 'replies'},\n",
1260 " {'citrons', 'citrous'},\n",
1261 " {'salient', 'sapient'},\n",
1262 " {'hassled', 'hassles'},\n",
1263 " {'schlepp', 'schleps'},\n",
1264 " {'coronae', 'coronas'},\n",
1265 " {'paraded', 'parades'},\n",
1266 " {'outdoes', 'outgoes'},\n",
1267 " {'invoked', 'invokes'},\n",
1268 " {'emerged', 'emerges'},\n",
1269 " {'digress', 'tigress'},\n",
1270 " {'caption', 'caution'},\n",
1271 " {'torqued', 'torques'},\n",
1272 " {'grieved', 'grieves'},\n",
1273 " {'lineage', 'linkage'},\n",
1274 " {'opposed', 'opposes'},\n",
1275 " {'goodbye', 'goodbys'},\n",
1276 " {'goddess', 'godless'},\n",
1277 " {'snifter', 'swifter'},\n",
1278 " {'empanel', 'impanel'},\n",
1279 " {'handout', 'hangout'},\n",
1280 " {'elitism', 'elitist'},\n",
1281 " {'valiant', 'variant'},\n",
1282 " {'workman', 'workmen'},\n",
1283 " {'baronet', 'bayonet'},\n",
1284 " {'oarlock', 'warlock'},\n",
1285 " {'deserve', 'reserve'},\n",
1286 " {'bumpkin', 'pumpkin'},\n",
1287 " {'chamois', 'chamoix'},\n",
1288 " {'devalue', 'revalue'},\n",
1289 " {'paunchy', 'raunchy'},\n",
1290 " {'highest', 'nighest'},\n",
1291 " {'infused', 'infuses'},\n",
1292 " {'louvred', 'louvres'},\n",
1293 " {'bookish', 'boorish'},\n",
1294 " {'elapsed', 'elapses'},\n",
1295 " {'denture', 'venture'},\n",
1296 " {'consuls', 'consult'},\n",
1297 " {'salvage', 'selvage'},\n",
1298 " {'specced', 'specked'},\n",
1299 " {'ferment', 'fervent'},\n",
1300 " {'tussled', 'tussles'},\n",
1301 " {'hermits', 'permits'},\n",
1302 " {'honchos', 'ponchos'},\n",
1303 " {'widowed', 'widower'},\n",
1304 " {'cicadae', 'cicadas'},\n",
1305 " {'aureola', 'aureole'},\n",
1306 " {'inhered', 'inheres'},\n",
1307 " {'legible', 'legibly'},\n",
1308 " {'outline', 'outlive'},\n",
1309 " {'present', 'prevent'},\n",
1310 " {'bureaus', 'bureaux'},\n",
1311 " {'desists', 'resists'},\n",
1312 " {'heavens', 'leavens'},\n",
1313 " {'tongued', 'tongues'},\n",
1314 " {'roughly', 'toughly'},\n",
1315 " {'quashed', 'quashes'},\n",
1316 " {'outwore', 'outworn'},\n",
1317 " {'designs', 'resigns'},\n",
1318 " {'upright', 'uptight'},\n",
1319 " {'revoked', 'revokes'},\n",
1320 " {'skydive', 'skydove'},\n",
1321 " {'consort', 'contort'},\n",
1322 " {'labored', 'laborer'},\n",
1323 " {'dingoes', 'lingoes'},\n",
1324 " {'trestle', 'wrestle'},\n",
1325 " {'favored', 'savored'},\n",
1326 " {'ignored', 'ignores'},\n",
1327 " {'forgave', 'forgive'},\n",
1328 " {'confirm', 'conform'},\n",
1329 " {'effaced', 'effaces'},\n",
1330 " {'hangman', 'hangmen'},\n",
1331 " {'garotte', 'gavotte'},\n",
1332 " {'capable', 'capably'},\n",
1333 " {'pajamas', 'pyjamas'},\n",
1334 " {'opening', 'opining'},\n",
1335 " {'require', 'requite'},\n",
1336 " {'nemeses', 'nemesis'},\n",
1337 " {'stature', 'statute'},\n",
1338 " {'famines', 'gamines'},\n",
1339 " {'datives', 'natives'},\n",
1340 " {'pebbled', 'pebbles'},\n",
1341 " {'anaemia', 'anaemic'},\n",
1342 " {'emitted', 'omitted'},\n",
1343 " {'sobered', 'soberer'},\n",
1344 " {'clovers', 'plovers'},\n",
1345 " {'rampant', 'rampart'},\n",
1346 " {'mailman', 'mailmen'},\n",
1347 " {'novella', 'novelle'},\n",
1348 " {'usurped', 'usurper'},\n",
1349 " {'calyces', 'calyxes'},\n",
1350 " {'pierced', 'pierces'},\n",
1351 " {'kneaded', 'kneader'},\n",
1352 " {'ignited', 'ignites'},\n",
1353 " {'dudgeon', 'dungeon'},\n",
1354 " {'impeded', 'impedes'},\n",
1355 " {'scherzi', 'scherzo'},\n",
1356 " {'generic', 'genetic'},\n",
1357 " {'paroled', 'parolee', 'paroles'},\n",
1358 " {'civvies', 'divvied', 'divvies'},\n",
1359 " {'crackle', 'crackly', 'grackle'},\n",
1360 " {'pinkest', 'puniest', 'punkest'},\n",
1361 " {'nebulae', 'nebular', 'nebulas'},\n",
1362 " {'condoes', 'condoms', 'condors'},\n",
1363 " {'steamed', 'steamer', 'stemmed'},\n",
1364 " {'equable', 'equably', 'equally'},\n",
1365 " {'command', 'commend', 'comment'},\n",
1366 " {'stubble', 'stubbly', 'stumble'},\n",
1367 " {'handbag', 'sandbag', 'sandbar'},\n",
1368 " {'sponged', 'sponger', 'sponges'},\n",
1369 " {'quavers', 'quavery', 'quivers'},\n",
1370 " {'burnous', 'burnout', 'turnout'},\n",
1371 " {'cookout', 'lockout', 'lookout'},\n",
1372 " {'drivels', 'drivers', 'drovers'},\n",
1373 " {'densest', 'tensest', 'tersest'},\n",
1374 " {'minnows', 'windows', 'winnows'},\n",
1375 " {'chequed', 'chequer', 'cheques'},\n",
1376 " {'comical', 'conical', 'cynical'},\n",
1377 " {'crassly', 'crossly', 'grossly'},\n",
1378 " {'soluble', 'voluble', 'volubly'},\n",
1379 " {'schemed', 'schemer', 'schemes'},\n",
1380 " {'fidgets', 'fidgety', 'midgets'},\n",
1381 " {'heights', 'weights', 'weighty'},\n",
1382 " {'knacker', 'knocked', 'knocker'},\n",
1383 " {'favours', 'savours', 'savoury'},\n",
1384 " {'invaded', 'invader', 'invades'},\n",
1385 " {'duality', 'qualify', 'quality'},\n",
1386 " {'lichees', 'lichens', 'lychees'},\n",
1387 " {'spruced', 'sprucer', 'spruces'},\n",
1388 " {'humours', 'rumours', 'tumours'},\n",
1389 " {'confuse', 'confute', 'contuse'},\n",
1390 " {'cutlets', 'outlets', 'outsets'},\n",
1391 " {'fistful', 'wishful', 'wistful'},\n",
1392 " {'coupled', 'couples', 'couplet'},\n",
1393 " {'growled', 'prowled', 'prowler'},\n",
1394 " {'collage', 'collate', 'college'},\n",
1395 " {'shaikhs', 'shaykhs', 'sheikhs'},\n",
1396 " {'cloning', 'closing', 'cloying'},\n",
1397 " {'digests', 'diverts', 'divests'},\n",
1398 " {'massage', 'message', 'passage'},\n",
1399 " {'storied', 'stories', 'stormed'},\n",
1400 " {'fainest', 'fairest', 'vainest'},\n",
1401 " {'soothed', 'soothes', 'toothed'},\n",
1402 " {'deigned', 'feigned', 'reigned'},\n",
1403 " {'grandee', 'grander', 'grinder'},\n",
1404 " {'carbide', 'carbine', 'carmine'},\n",
1405 " {'dignify', 'dignity', 'signify'},\n",
1406 " {'diction', 'faction', 'fiction'},\n",
1407 " {'noticed', 'notices', 'novices'},\n",
1408 " {'plagued', 'plagues', 'plaques'},\n",
1409 " {'scarlet', 'starlet', 'starlit'},\n",
1410 " {'pursued', 'pursuer', 'pursues'},\n",
1411 " {'ranched', 'rancher', 'ranches'},\n",
1412 " {'sidings', 'tidings', 'timings'},\n",
1413 " {'squeaks', 'squeaky', 'squeals'},\n",
1414 " {'ejected', 'elected', 'erected'},\n",
1415 " {'enduing', 'ensuing', 'induing'},\n",
1416 " {'notable', 'notably', 'potable'},\n",
1417 " {'dustman', 'dustmen', 'dustpan'},\n",
1418 " {'pompoms', 'pompons', 'pompous'},\n",
1419 " {'blandly', 'blankly', 'blindly'},\n",
1420 " {'vaginae', 'vaginal', 'vaginas'},\n",
1421 " {'spacial', 'spatial', 'special'},\n",
1422 " {'editing', 'exiling', 'exiting'},\n",
1423 " {'lateral', 'liberal', 'literal'},\n",
1424 " {'pendant', 'pendent', 'pennant'},\n",
1425 " {'purveys', 'surreys', 'surveys'},\n",
1426 " {'sarapes', 'serapes', 'seraphs'},\n",
1427 " {'devolve', 'resolve', 'revolve'},\n",
1428 " {'reneged', 'reneges', 'renewed'},\n",
1429 " {'innards', 'inwards', 'onwards'},\n",
1430 " {'unified', 'unifies', 'unities'},\n",
1431 " {'rescued', 'rescuer', 'rescues'},\n",
1432 " {'cachets', 'sachems', 'sachets'},\n",
1433 " {'condole', 'condone', 'console'},\n",
1434 " {'empress', 'express', 'impress'},\n",
1435 " {'alerted', 'averred', 'averted'},\n",
1436 " {'badness', 'madness', 'sadness'},\n",
1437 " {'swaddle', 'twaddle', 'twiddle'},\n",
1438 " {'cornier', 'hornier', 'horsier'},\n",
1439 " {'burnish', 'furbish', 'furnish'},\n",
1440 " {'jealous', 'zealots', 'zealous'},\n",
1441 " {'sublets', 'subsets', 'sunsets'},\n",
1442 " {'cellars', 'collars', 'dollars'},\n",
1443 " {'voyaged', 'voyager', 'voyages'},\n",
1444 " {'haddock', 'paddock', 'padlock'},\n",
1445 " {'process', 'profess', 'prowess'},\n",
1446 " {'doorman', 'doormat', 'doormen'},\n",
1447 " {'discard', 'discoed', 'discord'},\n",
1448 " {'secured', 'securer', 'secures'},\n",
1449 " {'shallot', 'shallow', 'swallow'},\n",
1450 " {'modules', 'modulus', 'nodules'},\n",
1451 " {'groomed', 'grooved', 'grooves'},\n",
1452 " {'hookahs', 'hoorahs', 'hoorays'},\n",
1453 " {'allayed', 'allowed', 'alloyed'},\n",
1454 " {'advents', 'adverbs', 'adverts'},\n",
1455 " {'tiptoed', 'tiptoes', 'tiptops'},\n",
1456 " {'shadier', 'shakier', 'snakier'},\n",
1457 " {'honeyed', 'moneyed', 'moseyed'},\n",
1458 " {'respect', 'respell', 'respelt'},\n",
1459 " {'recipes', 'recited', 'recites'},\n",
1460 " {'project', 'protect', 'protest'},\n",
1461 " {'dullest', 'fellest', 'fullest'},\n",
1462 " {'thistle', 'whistle', 'whittle'},\n",
1463 " {'regaled', 'regales', 'resales'},\n",
1464 " {'naively', 'naivete', 'naivety'},\n",
1465 " {'primacy', 'primary', 'privacy'},\n",
1466 " {'curable', 'durable', 'durably'},\n",
1467 " {'demount', 'recount', 'remount'},\n",
1468 " {'accused', 'accuser', 'accuses'},\n",
1469 " {'opaqued', 'opaquer', 'opaques'},\n",
1470 " {'deified', 'deifies', 'deities'},\n",
1471 " {'kindled', 'kindles', 'kindred'},\n",
1472 " {'deflect', 'reelect', 'reflect'},\n",
1473 " {'learned', 'learner', 'yearned'},\n",
1474 " {'baptise', 'baptism', 'baptist'},\n",
1475 " {'caromed', 'chromed', 'chromes'},\n",
1476 " {'descant', 'descend', 'descent'},\n",
1477 " {'impalas', 'impaled', 'impales'},\n",
1478 " {'passels', 'pastels', 'tassels'},\n",
1479 " {'inhaled', 'inhaler', 'inhales'},\n",
1480 " {'epoxied', 'epoxies', 'epoxyed'},\n",
1481 " {'capture', 'rapture', 'rupture'},\n",
1482 " {'overlap', 'overlay', 'overpay'},\n",
1483 " {'risible', 'visible', 'visibly'},\n",
1484 " {'unbends', 'unbinds', 'unwinds'},\n",
1485 " {'balance', 'valance', 'valence'},\n",
1486 " {'sneaked', 'sneaker', 'speaker'},\n",
1487 " {'savvied', 'savvier', 'savvies'},\n",
1488 " {'gentled', 'gentler', 'gentles'},\n",
1489 " {'handily', 'hardily', 'tardily'},\n",
1490 " {'sprains', 'strains', 'straits'},\n",
1491 " {'forgers', 'forgery', 'forgets'},\n",
1492 " {'garnish', 'tarnish', 'varnish'},\n",
1493 " {'gnarled', 'snailed', 'snarled'},\n",
1494 " {'galleys', 'valleys', 'volleys'},\n",
1495 " {'loonier', 'loonies', 'loopier'},\n",
1496 " {'conduce', 'conduct', 'conduit'},\n",
1497 " {'cosiest', 'nosiest', 'rosiest'},\n",
1498 " {'gestate', 'restate', 'testate'},\n",
1499 " {'gimpier', 'wimpier', 'wispier'},\n",
1500 " {'marinas', 'mariner', 'marines'},\n",
1501 " {'knitted', 'knitter', 'knotted'},\n",
1502 " {'czarina', 'tsarina', 'tzarina'},\n",
1503 " {'pricier', 'privier', 'privies'},\n",
1504 " {'thither', 'whether', 'whither'},\n",
1505 " {'jerkier', 'perkier', 'peskier'},\n",
1506 " {'geneses', 'genesis', 'genuses'},\n",
1507 " {'queened', 'queered', 'queerer'},\n",
1508 " {'escaped', 'escapee', 'escapes'},\n",
1509 " {'plodded', 'plodder', 'prodded'},\n",
1510 " {'heroics', 'heroine', 'heroins'},\n",
1511 " {'freshen', 'fresher', 'freshet'},\n",
1512 " {'encased', 'encases', 'uncased'},\n",
1513 " {'densely', 'tensely', 'tersely'},\n",
1514 " {'mortals', 'mortars', 'portals'},\n",
1515 " {'stylise', 'stylish', 'stylist'},\n",
1516 " {'impacts', 'imparts', 'imports'},\n",
1517 " {'careens', 'careers', 'carvers'},\n",
1518 " {'chorale', 'chorals', 'chortle'},\n",
1519 " {'gainful', 'pailful', 'painful'},\n",
1520 " {'circled', 'circles', 'circlet'},\n",
1521 " {'etching', 'inching', 'itching'},\n",
1522 " {'sultana', 'sultans', 'suntans'},\n",
1523 " {'futures', 'sutured', 'sutures'},\n",
1524 " {'joshing', 'noshing', 'nothing'},\n",
1525 " {'fondled', 'fondles', 'fondues'},\n",
1526 " {'auction', 'section', 'suction'},\n",
1527 " {'undoing', 'undying', 'untying'},\n",
1528 " {'drinker', 'drunken', 'drunker'},\n",
1529 " {'bluffed', 'bluffer', 'fluffed'},\n",
1530 " {'foisted', 'heisted', 'hoisted'},\n",
1531 " {'rubdown', 'rundown', 'sundown'},\n",
1532 " {'psyched', 'psyches', 'psychos'},\n",
1533 " {'lassies', 'lassoed', 'lassoes'},\n",
1534 " {'baskets', 'caskets', 'gaskets'},\n",
1535 " {'blueing', 'clueing', 'glueing'},\n",
1536 " {'emptied', 'emptier', 'empties'},\n",
1537 " {'locales', 'located', 'locates'},\n",
1538 " {'merging', 'verging', 'versing'},\n",
1539 " {'admired', 'admirer', 'admires'},\n",
1540 " {'greened', 'greener', 'greeted', 'preened'},\n",
1541 " {'dankest', 'darkest', 'lankest', 'rankest'},\n",
1542 " {'abetted', 'abetter', 'abettor', 'abutted'},\n",
1543 " {'threads', 'threats', 'throats', 'throaty'},\n",
1544 " {'pronged', 'wringer', 'wronged', 'wronger'},\n",
1545 " {'gassier', 'sassier', 'sissier', 'sissies'},\n",
1546 " {'crinkle', 'crinkly', 'wrinkle', 'wrinkly'},\n",
1547 " {'pardons', 'parsons', 'persona', 'persons'},\n",
1548 " {'lightly', 'nightly', 'rightly', 'tightly'},\n",
1549 " {'install', 'instals', 'instill', 'instils'},\n",
1550 " {'dwindle', 'spindle', 'spindly', 'swindle'},\n",
1551 " {'acidify', 'acidity', 'aridity', 'avidity'},\n",
1552 " {'shrills', 'shrilly', 'thralls', 'thrills'},\n",
1553 " {'arbours', 'ardours', 'armours', 'armoury'},\n",
1554 " {'decants', 'recants', 'recasts', 'repasts'},\n",
1555 " {'sedated', 'sedater', 'sedates', 'senates'},\n",
1556 " {'bumpier', 'dumpier', 'jumpier', 'lumpier'},\n",
1557 " {'crumble', 'crumbly', 'crumple', 'grumble'},\n",
1558 " {'fastest', 'fattest', 'fittest', 'vastest'},\n",
1559 " {'precise', 'premise', 'premiss', 'promise'},\n",
1560 " {'dilated', 'dilates', 'diluted', 'dilutes'},\n",
1561 " {'expands', 'expends', 'extends', 'extents'},\n",
1562 " {'prickle', 'prickly', 'trickle', 'truckle'},\n",
1563 " {'undated', 'updated', 'updater', 'updates'},\n",
1564 " {'abjured', 'abjures', 'adjured', 'adjures'},\n",
1565 " {'buzzing', 'fizzing', 'futzing', 'fuzzing'},\n",
1566 " {'bravest', 'gravest', 'grayest', 'greyest'},\n",
1567 " {'receded', 'recedes', 'seceded', 'secedes'},\n",
1568 " {'wheeled', 'wheeler', 'wheezed', 'wheezes'},\n",
1569 " {'twisted', 'twister', 'twitted', 'twitter'},\n",
1570 " {'abasing', 'abating', 'abusing', 'amusing'},\n",
1571 " {'realest', 'realise', 'realism', 'realist'},\n",
1572 " {'engaged', 'engages', 'enraged', 'enrages'},\n",
1573 " {'charily', 'charity', 'clarify', 'clarity'},\n",
1574 " {'curfews', 'curlers', 'curlews', 'hurlers'},\n",
1575 " {'avenged', 'avenger', 'avenges', 'avenues'},\n",
1576 " {'distils', 'pistils', 'pistols', 'pistons'},\n",
1577 " {'haziest', 'laciest', 'laziest', 'raciest'},\n",
1578 " {'alluded', 'alludes', 'allured', 'allures'},\n",
1579 " {'inbound', 'unbound', 'unsound', 'unwound'},\n",
1580 " {'advised', 'adviser', 'advises', 'advisor'},\n",
1581 " {'rebound', 'redound', 'resound', 'rewound'},\n",
1582 " {'berthed', 'birched', 'birches', 'birthed'},\n",
1583 " {'teasels', 'teasers', 'teazels', 'weasels'},\n",
1584 " {'encrust', 'entrust', 'incrust', 'intrust'},\n",
1585 " {'certain', 'curtail', 'curtain', 'pertain'},\n",
1586 " {'defaced', 'defaces', 'defamed', 'defames'},\n",
1587 " {'burlier', 'curlier', 'curvier', 'surlier'},\n",
1588 " {'hokiest', 'holiest', 'homiest', 'pokiest'},\n",
1589 " {'fielded', 'fielder', 'wielded', 'yielded'},\n",
1590 " {'adapted', 'adapter', 'adaptor', 'adopted'},\n",
1591 " {'anglers', 'anthems', 'anthers', 'antlers'},\n",
1592 " {'assumed', 'assumes', 'assured', 'assures'},\n",
1593 " {'iodised', 'iodises', 'ionised', 'ionises'},\n",
1594 " {'chamber', 'clamber', 'climbed', 'climber'},\n",
1595 " {'retinae', 'retinal', 'retinas', 'retinue'},\n",
1596 " {'fizzled', 'fizzles', 'sizzled', 'sizzles'},\n",
1597 " {'forties', 'softies', 'sortied', 'sorties'},\n",
1598 " {'seethed', 'seethes', 'teethed', 'teethes'},\n",
1599 " {'showman', 'showmen', 'snowman', 'snowmen'},\n",
1600 " {'detract', 'refract', 'retrace', 'retract'},\n",
1601 " {'screams', 'streaks', 'streaky', 'streams'},\n",
1602 " {'massive', 'missile', 'missive', 'passive'},\n",
1603 " {'foraged', 'forager', 'forages', 'forayed'},\n",
1604 " {'dummies', 'mommies', 'mummies', 'tummies'},\n",
1605 " {'despise', 'despite', 'respire', 'respite'},\n",
1606 " {'deposed', 'deposes', 'reposed', 'reposes'},\n",
1607 " {'fireman', 'firemen', 'foreman', 'foremen'},\n",
1608 " {'boniest', 'tidiest', 'tiniest', 'toniest'},\n",
1609 " {'cattily', 'hastily', 'nastily', 'nattily'},\n",
1610 " {'feather', 'heathen', 'heather', 'leather', 'weather'},\n",
1611 " {'average', 'operate', 'overage', 'overate', 'overawe'},\n",
1612 " {'whimper', 'whisked', 'whisker', 'whiskey', 'whisper'},\n",
1613 " {'enquire', 'enquiry', 'esquire', 'inquire', 'inquiry'},\n",
1614 " {'daftest', 'deftest', 'leftest', 'leftism', 'leftist'},\n",
1615 " {'cottage', 'hostage', 'portage', 'postage', 'pottage'},\n",
1616 " {'haughty', 'naughts', 'naughty', 'nougats', 'noughts'},\n",
1617 " {'brought', 'draught', 'drought', 'fraught', 'wrought'},\n",
1618 " {'legatee', 'legates', 'legatos', 'negated', 'negates'},\n",
1619 " {'smidgen', 'smidges', 'smidgin', 'smudged', 'smudges'},\n",
1620 " {'exhorts', 'expects', 'experts', 'exports', 'extorts'},\n",
1621 " {'jailers', 'jailors', 'mailers', 'sailors', 'tailors'},\n",
1622 " {'departs', 'deports', 'reports', 'resorts', 'retorts'},\n",
1623 " {'margins', 'marlins', 'martens', 'martini', 'martins'},\n",
1624 " {'dimpled', 'dimples', 'pimples', 'wimpled', 'wimples'},\n",
1625 " {'behaved', 'behaves', 'behoved', 'behoves', 'beloved'},\n",
1626 " {'fatness', 'fitness', 'wetness', 'witless', 'witness'},\n",
1627 " {'empires', 'expired', 'expires', 'umpired', 'umpires'},\n",
1628 " {'sampled', 'sampler', 'samples', 'simpler', 'simplex'},\n",
1629 " {'enacted', 'exacted', 'exacter', 'exalted', 'exulted'},\n",
1630 " {'macrons', 'matrons', 'microns', 'patrols', 'patrons'},\n",
1631 " {'besides', 'betided', 'betides', 'resided', 'resides'},\n",
1632 " {'guessed', 'guesser', 'guesses', 'guested', 'quested'},\n",
1633 " {'encoded', 'encoder', 'encodes', 'encored', 'encores'},\n",
1634 " {'mileage', 'millage', 'pillage', 'tillage', 'village'},\n",
1635 " {'breathe', 'breaths', 'breathy', 'wreathe', 'wreaths'},\n",
1636 " {'pranced', 'prancer', 'prances', 'princes', 'trances'},\n",
1637 " {'deadest', 'deafest', 'dearest', 'nearest', 'neatest'},\n",
1638 " {'drizzle', 'drizzly', 'frazzle', 'frizzle', 'grizzly'},\n",
1639 " {'indices', 'indicts', 'induced', 'induces', 'inducts'},\n",
1640 " {'berried', 'berries', 'ferried', 'ferries', 'serried'},\n",
1641 " {'demands', 'rebinds', 'remands', 'reminds', 'rewinds'},\n",
1642 " {'scudded', 'studded', 'studied', 'studies', 'studios'},\n",
1643 " {'decreed', 'decrees', 'decried', 'decries', 'degrees'},\n",
1644 " {'ravaged', 'ravages', 'savaged', 'savager', 'savages'},\n",
1645 " {'deluded', 'deludes', 'deluged', 'deluges', 'denuded', 'denudes'},\n",
1646 " {'buffers', 'buffets', 'differs', 'duffers', 'suffers', 'surfers'},\n",
1647 " {'quieted', 'quieter', 'quilted', 'quilter', 'quitted', 'quitter'},\n",
1648 " {'manured', 'manures', 'matured', 'maturer', 'matures', 'natures'},\n",
1649 " {'billion', 'bullion', 'million', 'mullion', 'pillion', 'zillion'},\n",
1650 " {'defeats', 'defects', 'dejects', 'detects', 'detests', 'rejects'},\n",
1651 " {'fledged', 'pledged', 'pledges', 'sledded', 'sledged', 'sledges'},\n",
1652 " {'locally', 'loyally', 'loyalty', 'royally', 'royalty', 'vocally'},\n",
1653 " {'blither', 'glitter', 'skitter', 'slather', 'slither', 'slitter'},\n",
1654 " {'scuffle', 'shuffle', 'snaffle', 'sniffle', 'snuffle', 'souffle'},\n",
1655 " {'craters', 'graders', 'graters', 'tracers', 'tracery', 'traders'},\n",
1656 " {'incised', 'incises', 'incited', 'incites', 'invited', 'invites'},\n",
1657 " {'dowdier', 'dowdies', 'downier', 'dowries', 'rowdier', 'rowdies'},\n",
1658 " {'doubled', 'doubles', 'doublet', 'doubted', 'doubter', 'roubles'},\n",
1659 " {'betaken', 'betakes', 'betoken', 'remakes', 'retaken', 'retakes'},\n",
1660 " {'dizzied', 'dizzier', 'dizzies', 'fizzier', 'fuzzier', 'tizzies'},\n",
1661 " {'fibbers', 'gibbers', 'gibbets', 'giblets', 'gimlets', 'goblets'},\n",
1662 " {'bearded', 'boarded', 'boarder', 'hoarded', 'hoarder', 'hoarier'},\n",
1663 " {'depress', 'redness', 'redress', 'regress', 'regrets', 'repress'},\n",
1664 " {'excised', 'excises', 'excited', 'excites', 'excused', 'excuses'},\n",
1665 " {'therein', 'thereof', 'thereon', 'wherein', 'whereof', 'whereon'},\n",
1666 " {'baddest', 'baldest', 'boldest', 'coldest', 'maddest', 'saddest'},\n",
1667 " {'corneal', 'corneas', 'corners', 'cornets', 'corsets', 'hornets'},\n",
1668 " {'bravely', 'bravery', 'gravels', 'gravely', 'grovels', 'travels'},\n",
1669 " {'fevered', 'levered', 'revered', 'reveres', 'reverts', 'severed', 'severer'},\n",
1670 " {'managed', 'manager', 'manages', 'menaced', 'menaces', 'menages', 'tanager'},\n",
1671 " {'alights', 'blights', 'flights', 'flighty', 'frights', 'plights', 'slights'},\n",
1672 " {'rehired', 'rehires', 'retired', 'retiree', 'retires', 'rewired', 'rewires'},\n",
1673 " {'divided', 'divider', 'divides', 'divined', 'diviner', 'divines', 'vivider'},\n",
1674 " {'petards', 'records', 'regards', 'retards', 'rewards', 'rewords', 'reworks'},\n",
1675 " {'cations', 'lotions', 'motions', 'nations', 'notions', 'potions', 'rations'},\n",
1676 " {'coffees', 'coffers', 'confers', 'confess', 'taffies', 'toffees', 'toffies'},\n",
1677 " {'derails', 'details', 'detains', 'regains', 'remains', 'retails', 'retains'},\n",
1678 " {'crabbed', 'cribbed', 'drabber', 'drubbed', 'grabbed', 'grabber', 'grubbed'},\n",
1679 " {'breezed', 'breezes', 'freezer', 'freezes', 'friezes', 'frizzed', 'frizzes'},\n",
1680 " {'funnels', 'gunners', 'gunnery', 'nunnery', 'runnels', 'runners', 'tunnels'},\n",
1681 " {'dirtied', 'dirtier', 'dirties', 'ditties', 'dittoed', 'dittoes', 'kitties'},\n",
1682 " {'boodles', 'doodled', 'doodler', 'doodles', 'noodled', 'noodles', 'poodles'},\n",
1683 " {'legions', 'lesions', 'lessees', 'lessens', 'lessons', 'lessors', 'regions'},\n",
1684 " {'briskly', 'bristle', 'bristly', 'brittle', 'bruskly', 'gristle', 'gristly'},\n",
1685 " {'fleeing', 'flexing', 'fluting', 'fluxing', 'freeing', 'treeing', 'trueing'},\n",
1686 " {'blowers', 'flowers', 'flowery', 'glowers', 'grocers', 'grocery', 'growers'},\n",
1687 " {'hectors', 'rectors', 'rectory', 'sectors', 'vectors', 'victors', 'victory'},\n",
1688 " {'pennies',\n",
1689 " 'peonies',\n",
1690 " 'phobias',\n",
1691 " 'phobics',\n",
1692 " 'phonics',\n",
1693 " 'phonied',\n",
1694 " 'phonier',\n",
1695 " 'phonies'},\n",
1696 " {'capered',\n",
1697 " 'catered',\n",
1698 " 'caterer',\n",
1699 " 'papered',\n",
1700 " 'tapered',\n",
1701 " 'wagered',\n",
1702 " 'watered',\n",
1703 " 'wavered'},\n",
1704 " {'dickies',\n",
1705 " 'dingier',\n",
1706 " 'dinkier',\n",
1707 " 'dinkies',\n",
1708 " 'kickier',\n",
1709 " 'kinkier',\n",
1710 " 'pickier',\n",
1711 " 'pinkies'},\n",
1712 " {'nipples',\n",
1713 " 'rippled',\n",
1714 " 'ripples',\n",
1715 " 'tippled',\n",
1716 " 'tippler',\n",
1717 " 'tipples',\n",
1718 " 'toppled',\n",
1719 " 'topples'},\n",
1720 " {'absents',\n",
1721 " 'accents',\n",
1722 " 'accepts',\n",
1723 " 'ascends',\n",
1724 " 'ascents',\n",
1725 " 'assents',\n",
1726 " 'asserts',\n",
1727 " 'assorts'},\n",
1728 " {'regents',\n",
1729 " 'reheats',\n",
1730 " 'relents',\n",
1731 " 'repeals',\n",
1732 " 'repeats',\n",
1733 " 'repents',\n",
1734 " 'resents',\n",
1735 " 'reveals'},\n",
1736 " {'deduced',\n",
1737 " 'deduces',\n",
1738 " 'deducts',\n",
1739 " 'reduced',\n",
1740 " 'reduces',\n",
1741 " 'seduced',\n",
1742 " 'seducer',\n",
1743 " 'seduces'},\n",
1744 " {'fighter',\n",
1745 " 'lighted',\n",
1746 " 'lighten',\n",
1747 " 'lighter',\n",
1748 " 'righted',\n",
1749 " 'righter',\n",
1750 " 'sighted',\n",
1751 " 'tighten',\n",
1752 " 'tighter'},\n",
1753 " {'crafted',\n",
1754 " 'drafted',\n",
1755 " 'draftee',\n",
1756 " 'drifted',\n",
1757 " 'drifter',\n",
1758 " 'grafted',\n",
1759 " 'grafter',\n",
1760 " 'granted',\n",
1761 " 'grunted'},\n",
1762 " {'screwed',\n",
1763 " 'splayed',\n",
1764 " 'sprayed',\n",
1765 " 'sprayer',\n",
1766 " 'strafed',\n",
1767 " 'strafes',\n",
1768 " 'strawed',\n",
1769 " 'strayed',\n",
1770 " 'strewed'},\n",
1771 " {'endured',\n",
1772 " 'endures',\n",
1773 " 'ensured',\n",
1774 " 'ensures',\n",
1775 " 'injured',\n",
1776 " 'injures',\n",
1777 " 'insured',\n",
1778 " 'insurer',\n",
1779 " 'insures'},\n",
1780 " {'comfort',\n",
1781 " 'commune',\n",
1782 " 'commute',\n",
1783 " 'compete',\n",
1784 " 'comport',\n",
1785 " 'compose',\n",
1786 " 'compost',\n",
1787 " 'compote',\n",
1788 " 'compute'},\n",
1789 " {'squared',\n",
1790 " 'squarer',\n",
1791 " 'squares',\n",
1792 " 'squints',\n",
1793 " 'squired',\n",
1794 " 'squires',\n",
1795 " 'squirms',\n",
1796 " 'squirmy',\n",
1797 " 'squirts'},\n",
1798 " {'cleaned',\n",
1799 " 'cleaner',\n",
1800 " 'cleared',\n",
1801 " 'clearer',\n",
1802 " 'cleaved',\n",
1803 " 'cleaver',\n",
1804 " 'cleaves',\n",
1805 " 'gleamed',\n",
1806 " 'gleaned'},\n",
1807 " {'diapers',\n",
1808 " 'dippers',\n",
1809 " 'kippers',\n",
1810 " 'nippers',\n",
1811 " 'rapiers',\n",
1812 " 'rappers',\n",
1813 " 'rippers',\n",
1814 " 'tippers',\n",
1815 " 'zippers'},\n",
1816 " {'scalded',\n",
1817 " 'scalier',\n",
1818 " 'scalped',\n",
1819 " 'scalpel',\n",
1820 " 'scalper',\n",
1821 " 'scamper',\n",
1822 " 'scarcer',\n",
1823 " 'scarier',\n",
1824 " 'scolded'},\n",
1825 " {'happier',\n",
1826 " 'nappier',\n",
1827 " 'nappies',\n",
1828 " 'nippier',\n",
1829 " 'sappier',\n",
1830 " 'soapier',\n",
1831 " 'soppier',\n",
1832 " 'soupier',\n",
1833 " 'zippier'},\n",
1834 " {'bridged',\n",
1835 " 'bridges',\n",
1836 " 'bridled',\n",
1837 " 'bridles',\n",
1838 " 'cringed',\n",
1839 " 'cringes',\n",
1840 " 'fridges',\n",
1841 " 'fringed',\n",
1842 " 'fringes'}]"
1843 ]
1844 },
1845 "execution_count": 45,
1846 "metadata": {},
1847 "output_type": "execute_result"
1848 }
1849 ],
1850 "source": [
1851 "sorted((r for r in reachables if len(r) > 1 if len(r) < 10), key=len)"
1852 ]
1853 },
1854 {
1855 "cell_type": "code",
1856 "execution_count": 46,
1857 "metadata": {},
1858 "outputs": [
1859 {
1860 "data": {
1861 "text/plain": [
1862 "'abalone; abandon; abdomen; abducts; abiding; abolish; aborted; abounds; abreast; abridge; abscess; abscond; absence; absinth; absolve; absorbs; abstain; abusers; abusive; abysmal; abysses; acacias; academy; acanthi; acclaim; accords; accosts; account; accrual; accurst; acerbic; acetate; acetone; achieve; acolyte; aconite; acquire; acquits; acreage; acrider; acrobat; acronym; acrylic; actions; actives; actress; actuary; actuate; acutely; acutest; adagios; adamant; addicts; addling; address; adenoid; adeptly; adipose; adjoins; adjourn; adjudge; adjunct; adjusts; admiral; adoring; adorned; adrenal; adulate; advance; adverse; aerator; aerobic; aerosol; affairs; affirms; afflict; affords; affrays; affront; afghans; against; ageings; ageless; agendas; agilely; agilest; agitate; agonies; agonise; aground; aileron; ailment; airdrop; airfare; airhead; airings; airlift; airline; airmail; airport; airship; airsick; airways; alarmed; albinos; alchemy; alcohol; alcoves; alertly; alfalfa; algebra; alibied; alimony; alining; alkalis; allegro; allergy; allover; alluvia; allying; almanac; almonds; alpacas; already; alright; altered; alumnae; alumnus; amalgam; amateur; amatory; amazing; amazons; ambient; ambling; amenity; ammeter; ammonia; amnesia; amnesty; amoebas; amoebic; amongst; amorous; amounts; amperes; amplest; amplify; ampoule; ampules; amputee; amulets; anagram; anapest; anarchy; anatomy; anchors; anchovy; ancient; andante; andiron; android; anemone; angelic; angered; angling; angoras; angrier; angrily; anguish; animals; animate; aniseed; anklets; annoyed; annuity; anodyne; anoints; anomaly; anoraks; another; answers; antacid; anteing; antenna; anthill; anthrax; antigen; antique; antiwar; antonym; anxiety; anxious; anybody; anymore; anytime; aphelia; aplenty; apogees; apology; apostle; apparel; appease; appends; applaud; appoint; apprise; approve; apricot; apropos; aptness; aquaria; aquatic; aquavit; aqueous; aquifer; arbiter; arbutus; arcades; archaic; archest; archive; archway; arctics; arduous; arguing; argyles; armadas; armband; armfuls; armhole; armlets; armpits; armrest; armsful; arousal; arraign; arrange; arrayed; arrears; arrests; arrival; arroyos; article; artiest; artisan; artless; artsier; artwork; ascetic; ascribe; aseptic; asexual; ashamed; ashcans; ashrams; ashtray; asinine; askance; asocial; aspects; asphalt; aspirin; assails; assault; assigns; assists; assizes; assuage; astound; astride; astuter; asunder; asylums; atavism; atelier; athlete; atlases; atriums; atrophy; attache; attacks; attains; attempt; attends; attests; attract; audited; auditor; augment; augured; aurally; auricle; auspice; austere; authors; autopsy; autumns; availed; avarice; avatars; aviator; avocado; avoided; avowals; avowing; awaited; awakens; awaking; awarded; awesome; awfully; awkward; awnings; azaleas; azimuth; babiest; baboons; babying; babyish; bacilli; backbit; backhoe; backlog; backups; baggage; bagpipe; bailiff; bailout; balcony; ballads; ballast; balloon; balsams; bamboos; bananas; bandana; banjoes; banquet; banshee; bantams; banyans; baobabs; barbell; bargain; barmaid; baroque; barrack; barrage; barrios; barroom; bashful; bassist; bassoon; bastard; bastion; bathmat; bathtub; bauxite; bawdily; bazaars; bazooka; beagles; beanbag; bearish; beastly; beatify; beatnik; becalms; because; becomes; bedbugs; bedecks; bedevil; bedlams; bedpans; bedrock; bedroll; bedroom; bedside; bedsore; bedtime; beefier; beehive; beeline; beeswax; befalls; befouls; beggars; begonia; beguile; beheads; behests; behinds; beholds; belabor; bellboy; bellhop; belongs; beltway; bemoans; beneath; benefit; benumbs; benzene; bereave; berserk; beseech; besiege; bespeak; bespoke; bestial; bestirs; bestows; bestrid; betrays; betroth; between; betwixt; beveled; bewails; bewitch; biasing; biassed; bicycle; bifocal; biggest; bighorn; bigness; bigoted; bigotry; bigwigs; bikinis; bilious; bimboes; biology; bipedal; biplane; bipolar; biretta; biscuit; bisects; bishops; bismuth; bistros; bitumen; bivalve; bivouac; bizarre; blarney; blatant; blazers; blazons; bleakly; bleeped; blemish; blintze; blossom; blotchy; blowgun; blowout; blowups; blubber; bluejay; bluntly; bobcats; bobtail; bodegas; bodkins; bogeyed; boleros; bologna; bombard; bombast; bombers; bonanza; bonbons; boneyer; bonfire; bongoes; bonitos; bonnier; bonuses; bookend; booklet; bootleg; boozers; borders; boredom; borough; borscht; bossily; bottoms; boudoir; bouquet; bourbon; bovines; boxcars; boxwood; boycott; boyhood; braille; bramble; brasher; brashly; bravado; bravura; brazens; breadth; breakup; breasts; brevity; bribery; bribing; bridals; briefly; brigade; brigand; brimful; brinier; briquet; broadly; brocade; brogans; brogues; brokers; broncos; brownie; brunets; brusque; brutish; buckets; buckeye; buckram; bucksaw; bucolic; budgets; buffalo; buffoon; bugaboo; bugbear; buildup; bulbous; bulldog; bullish; bullock; bullpen; bulrush; bulwark; bunions; buoyant; burdens; burdock; burgher; burglar; burials; burrito; bursars; bursted; busbies; busboys; bushels; busiest; buttock; buttons; buyouts; buzzard; buzzers; byelaws; bygones; bylines; bywords; cabanas; cabaret; cabbage; cabinet; caboose; cadaver; cadence; cadenza; cadging; cadmium; caducei; caesium; caesura; cagiest; cahoots; caisson; calcify; calcium; calculi; caldron; calibre; calicos; caliper; caliphs; callers; callous; calmest; calumny; calypso; cambium; cambric; cameras; camphor; campier; canapes; canards; canasta; cancans; candour; canines; cannily; cantata; canteen; canvass; caplets; caprice; capsize; capstan; capsule; captain; captive; caracul; carafes; caramel; caravan; carcass; cardiac; careful; cargoes; caribou; carjack; carnage; carotid; carouse; carport; carrion; carsick; cartoon; cascade; cashews; cassava; cassias; cassino; castoff; casuals; casuist; catalpa; catarrh; catbird; catboat; catcall; catchup; catfish; cathode; catkins; catnaps; cattail; catwalk; caustic; cavalry; caveats; caviare; caviled; cavorts; cayenne; cedilla; celesta; cellist; cements; censure; centaur; centime; century; ceramic; cereals; cerebra; certify; chaffed; chagrin; chaises; chalets; chalice; chalked; chaotic; chapels; chaplet; charade; chariot; chasers; chassis; chateau; cheaply; checkup; cheddar; cheetah; cherish; cheroot; cherubs; chervil; chevron; chewers; chewier; chicest; chichis; chicory; chidden; chiefer; chiefly; chiffon; chigger; chignon; chimera; chimney; chintzy; chirrup; chisels; cholera; chowder; chronic; chuckle; chugged; chummed; churned; chutney; chutzpa; cigaret; cinemas; ciphers; circuit; cistern; citadel; citizen; civilly; clangor; clarets; clarion; classic; clayier; cleanse; cleanup; clerics; clerked; clients; climate; clinics; cliques; closely; closest; closets; coastal; cobwebs; cocaine; cochlea; cockade; cockily; cockney; cockpit; coconut; cocoons; codeine; codfish; codicil; coequal; coevals; coexist; coffins; cogency; cognacs; cognate; cohabit; cohorts; coiffed; coinage; colicky; colitis; collect; colleen; colloid; cologne; colored; colossi; colours; columns; comedic; comfier; commits; commode; commons; compact; company; compare; compass; compels; compile; complex; comrade; concave; concede; concise; concoct; concord; concurs; condemn; confabs; congaed; conifer; conjoin; conjure; connect; connive; connote; conquer; consign; consist; consume; contact; contain; contour; control; convict; convoke; coolant; coolest; copilot; copious; coppice; copycat; cordial; cordite; cordons; corncob; cornice; cornrow; corolla; corpora; corpses; corrals; correct; corrode; corrupt; corsage; corsair; cortege; cosigns; costars; costume; coterie; cottons; cougars; council; counsel; country; coupons; courage; courtly; cousins; coverts; cowbird; cowboys; cowgirl; cowhand; cowhide; cowlick; cowpoke; cowslip; coxcomb; coyness; coyotes; cozened; crackup; cranial; cravats; cravens; crayons; crazily; creator; creches; credits; creeper; cremate; creoles; cretins; crevice; crimson; cripple; crisply; critics; crochet; croquet; crouton; crowbar; crucial; crucify; crudely; crudest; crudity; crumbed; crunchy; crusade; crybaby; cryings; cryptic; crystal; cubical; cubists; cuckold; cuckoos; cudgels; cuisine; culotte; culprit; culvert; cumulus; cupcake; cupfuls; cupolas; cupsful; curates; curator; cursive; curtest; curtsey; cushion; cuspids; custody; customs; cutlass; cutlery; cutoffs; cyanide; cycling; cyclist; cyclone; cygnets; cymbals; cypress; dactyls; daemons; daffier; dahlias; damasks; dampest; damsels; damsons; dashiki; daubers; dauphin; daybeds; daytime; deadpan; deathly; debacle; debarks; debauch; debrief; debtors; debunks; decamps; decease; deceits; decency; decibel; decimal; declare; decorum; deejays; deepens; deepest; default; deficit; deflate; defraud; defrays; defrost; defunct; degrade; deicers; deicing; delight; delimit; deliria; deliver; delving; demagog; demeans; demerit; demesne; demigod; demoing; demonic; demurer; deniers; denizen; density; dentist; depicts; deplane; deplore; deploys; deposit; derange; derbies; derrick; dervish; deserts; desktop; despair; despoil; despots; dessert; destroy; detente; develop; deviate; devilry; devious; dewdrop; dewiest; dewlaps; diadems; diagram; dialect; dialled; dialogs; diamond; diaries; diarist; diatoms; diciest; dictate; dictums; diehard; diesels; dietary; dieters; dieting; diffuse; digital; digraph; dilemma; dimmest; dimness; dimwits; dinette; diocese; diorama; dioxide; dioxins; diploma; directs; disable; disarms; disavow; disband; disbars; discern; discuss; disdain; disease; disgust; dishpan; dishrag; dislike; dismays; dismiss; disobey; disowns; dispels; dispose; dispute; disrobe; disrupt; distaff; distant; distend; disturb; diurnal; divisor; divorce; divulge; dizzily; docents; doctors; doffing; dogfish; doggone; dogmata; dogtrot; dogwood; doleful; dollops; dolmens; dolphin; domains; dominos; doodads; doorway; dopiest; dorkier; dormant; dormers; dormice; dosages; doughty; dowager; dowdily; downers; drachma; dragnet; dragons; dragoon; drapery; drastic; drawers; dribble; driblet; driving; droller; droplet; dropout; drouths; drywall; dualism; dubiety; dubious; duchess; duchies; ductile; dugouts; dukedom; dullard; duodena; dustbin; duteous; dutiful; dwarfed; dwarves; dynamic; dynamos; dynasty; eagerer; eagerly; eaglets; earache; eardrum; earfuls; earldom; earlier; earlobe; earmark; earmuff; earnest; earplug; earshot; earthly; earwigs; easiest; eatable; ebonies; echelon; echoing; eclairs; ecology; economy; ecstasy; eddying; edgiest; edgings; edibles; edifice; edition; editors; educate; efforts; egghead; egoists; eighths; elation; elbowed; elderly; elector; elegant; elegiac; elegies; elevate; elevens; elicits; elision; elixirs; elusive; emailed; emanate; embalms; embargo; embarks; embassy; emblems; embrace; embroil; embryos; emerald; emetics; emigres; eminent; emirate; emoting; emotion; emotive; empathy; emperor; emporia; empower; emptily; emulate; enamels; enamors; enamour; encamps; enchant; encrypt; endears; endemic; endings; endives; endless; endowed; endways; endwise; enemata; enemies; enforce; engines; engorge; engrave; engross; engulfs; enhance; enigmas; enjoins; enjoyed; enlarge; enlists; enliven; ennoble; ensigns; ensnare; entails; entente; entered; enthral; enthuse; entitle; entombs; entrant; entraps; entreat; entropy; entwine; envelop; envious; envying; enzymes; epaulet; epicure; epigram; epilogs; episode; epistle; epitaph; epithet; epitome; epochal; epsilon; equator; equines; equinox; erasers; erasing; erasure; erectly; ermines; eroding; erosion; erosive; erotica; errands; erratas; erratic; erratum; erudite; erupted; eschews; escorts; escrows; espouse; espying; essence; estates; esteems; esthete; estuary; etchers; eternal; ethical; ethnics; eunuchs; euphony; evacuee; evading; evasion; evasive; evenest; evening; evicted; evident; eviller; evoking; exactly; examine; example; exceeds; excepts; excerpt; exclaim; exclude; execute; exempts; exerted; exhaust; exhibit; exigent; existed; exotics; expiate; explain; exploit; expound; expunge; extinct; extolls; extract; extreme; extrude; eyeball; eyebrow; eyefuls; eyelash; eyelets; eyelids; eyesore; fabrics; facades; faceted; facials; facings; factual; faculty; failure; fairway; falcons; fallacy; falloff; fallout; falsely; falsest; fanatic; fancily; fanfare; fantasy; fanzine; fashion; fatally; fathead; fathoms; fatigue; fatuous; faucets; feasted; feature; febrile; federal; fedoras; feebler; feedbag; felines; females; femoral; ferrets; ferrous; ferrule; fertile; fervour; festoon; fetlock; fetuses; fiascos; fibroid; fibrous; fickler; fifteen; fifties; filbert; filmier; finagle; finales; finally; finance; finesse; finicky; finises; firebug; firefly; firmest; firstly; fiscals; fishier; fishnet; fissure; fixable; fixedly; flaccid; flagons; flailed; flambes; flanges; flannel; flatcar; flattop; flaunts; flavors; flavour; floozie; florins; florist; flotsam; flounce; fluency; fluidly; flummox; flunkie; flyleaf; flyover; foghorn; foibles; foliage; fondant; fondest; foolery; foolish; footage; footsie; foppish; forbade; forbear; forbids; forbore; forceps; foreign; foreleg; foresaw; foresee; forests; forever; forfeit; forgoes; forgone; forlorn; formula; forsake; forsook; fortune; forward; forwent; fossils; foulest; foundry; fourths; foxhole; foxiest; foxtrot; fractal; fragile; frailty; framers; frankly; frantic; frappes; freckle; freedom; freeway; freight; frescos; fretful; fretted; friable; friends; frigate; frolics; frontal; frothed; fruited; fuchsia; fulcrum; fulfils; fulsome; funeral; fungous; funnily; furnace; furrier; further; furtive; fusible; fusions; fussily; fustian; fuzzily; gabbier; gadgets; gaffing; gainsay; gallant; galleon; gallery; gallium; gambits; gambols; gametes; gamiest; ganglia; gangway; gantlet; garbage; garland; garment; garrote; gaseous; gasohol; gastric; gateway; gaucher; gauchos; gaudily; gawkier; gawkily; gayness; gazebos; gazelle; gazette; gearbox; geckoes; geekier; geezers; geishas; gelatin; general; genital; genomes; genteel; gentian; gentile; genuine; geology; gerbils; germane; gerunds; gesture; getaway; geysers; gherkin; ghettos; ghosted; giddier; giddily; gigabit; gigolos; gimmick; gingham; gingkos; ginkgos; ginseng; giraffe; girders; girlish; gizzard; glacial; gleeful; glibber; glimpse; glinted; glisten; globule; glorify; glottis; glucose; gluiest; glutted; glutton; gnawing; gnomish; goatees; goblins; goddamn; godhood; godlier; godlike; godsend; godsons; goitres; golfers; gondola; goobers; goofier; gophers; gorilla; gosling; gospels; gougers; goulash; gourmet; goutier; governs; gradual; grammar; granary; grandad; grandly; granite; grannie; granola; granule; graphed; graphic; grapnel; grapple; gratify; gravies; gravity; greater; greatly; gremlin; grenade; greyish; griddle; griffin; grimace; gringos; grinned; gritted; groaned; grommet; grottos; grouchy; grounds; groupie; grownup; growths; groynes; gruffer; gruffly; gryphon; guarded; guffaws; guineas; guitars; gumdrop; gunboat; gunfire; gunshot; gunwale; gurneys; gutless; gutsier; gymnast; gypping; habitat; habitue; hackney; hacksaw; hafnium; haircut; hairdos; hairier; hairnet; hairpin; halberd; halcyon; halibut; halogen; halyard; hamlets; hamster; handcar; handful; handgun; handset; hangdog; hankies; hapless; happens; happily; harbors; harbour; hardtop; harelip; harlots; harmful; harmony; harness; harpist; harpoon; harsher; harshly; hashish; hatreds; haulers; hauteur; haycock; hayloft; haymows; hayseed; haywire; hazards; hazings; headset; headway; hearsay; heavily; hectare; heehaws; heftier; heifers; heinous; heiress; helical; hellion; hellish; helmets; helpers; helpful; hemline; hemlock; hennaed; henpeck; hepatic; heralds; herbage; heretic; heroism; herself; hertzes; hexagon; heydays; hibachi; hiccups; hickory; highboy; highway; hijacks; hillock; hilltop; himself; hippies; hirsute; history; hoagies; hoaxers; hobnail; hobnobs; hoedown; hoggish; hogwash; holdout; holdups; holiday; homages; homburg; homeboy; homonym; honesty; honored; honours; hoodlum; hookups; hopeful; horizon; hormone; horrify; horrors; hosanna; hosiery; hospice; hostile; hotbeds; hotcake; hothead; hotness; hottest; hoummos; howdahs; however; hubbubs; hubcaps; huffily; humaner; humanly; humbugs; humdrum; humerus; humidor; hundred; hurtful; husband; huskily; hussars; hutzpah; hyaenas; hybrids; hydrant; hydrate; hygiene; hymnals; hymning; hyphens; iambics; iceberg; icecaps; icicles; iciness; ideally; idiotic; idolise; idyllic; iffiest; igneous; iguanas; illegal; illicit; illness; imagery; imbuing; imitate; immoral; impairs; impasse; impeach; impends; imperil; impetus; impiety; impinge; impious; implant; impound; imprint; improve; impugns; impulse; impurer; inanely; inanest; inanity; inboard; inbreed; inbuilt; incisor; incline; include; incomes; incubus; indoors; indulge; inertia; inexact; infancy; infants; inferno; infidel; infield; informs; ingenue; ingrain; ingrate; ingress; ingrown; inherit; inhuman; initial; inkblot; inkling; inkwell; inmates; innings; inquest; inroads; insaner; inseams; insight; insigne; insipid; insists; insofar; insoles; inspect; inspire; instant; instead; insteps; insular; insulin; insults; intagli; intakes; integer; interim; intrude; intuits; invalid; inveigh; inverse; invoice; involve; ionizer; ipecacs; irately; iridium; irksome; islands; isobars; isolate; isotope; issuing; isthmus; italics; itchier; itemise; iterate; ivories; jackdaw; jackpot; jaguars; janitor; jasmine; javelin; jawbone; jaywalk; jazzier; jerkily; jerseys; jetties; jewelry; jiffies; jinxing; jitneys; jockeys; jocular; joiners; jointly; jollity; jonquil; journal; jousted; jubilee; jugular; juicers; juicier; juicing; jujubes; jukebox; juncoes; juniors; juniper; justest; justice; justify; karakul; karaoke; katydid; kayaked; keenest; keratin; kerbing; kestrel; ketchup; keyhole; keynote; keyword; kibbutz; kickoff; kidnaps; kidneys; killjoy; kiloton; kimonos; kindest; kinetic; kinfolk; kingdom; kingpin; kinship; kissers; kitchen; kitschy; klutzes; knavery; knavish; kneecap; kneeing; knifing; knights; knuckle; kookier; koshers; kowtows; krypton; labials; labours; lackeys; laconic; lacquer; lactate; lactose; ladings; ladling; ladybug; lagoons; lambast; lambent; lambkin; laments; lampoon; lamprey; languid; languor; lankier; lanolin; lantern; lanyard; laptops; larceny; largely; lariats; latency; latrine; lattice; laughed; laundry; laurels; lawless; lawsuit; laxness; layaway; layered; layette; layouts; layover; lazying; leaflet; leakage; lectern; lecture; leerier; leeward; lefties; legends; leggier; legless; legroom; legumes; legwork; leisure; lenient; lentils; leonine; leprosy; leprous; lesbian; letdown; lettuce; levying; lewdest; lexical; lexicon; liaison; liberty; libidos; library; liefest; liftoff; lignite; likable; limeade; limited; limpets; lindens; lingual; linnets; linseed; lintels; lioness; lionise; lipread; liqueur; liquids; liquors; lissome; listens; litchis; lithest; lithium; littler; liturgy; lockjaw; lockups; locusts; loftier; loftily; logbook; logical; logjams; longish; looneys; loosely; loosens; loosest; lotuses; loudest; loutish; louvers; lowbrow; lowdown; lowland; lowlier; lowness; loyaler; lozenge; luckily; luggage; lullaby; lumbago; lumpish; lunatic; lupines; lushest; lustful; lustily; lyceums; lyrical; macabre; macadam; machete; machine; macrame; madcaps; magenta; magical; magnate; magnify; magnums; magpies; mahatma; mahjong; mailbox; majesty; majored; majorly; makeups; malaise; malaria; maligns; mallard; malteds; mamboed; mammals; mammary; mammoth; manacle; manatee; mandate; manhole; manhood; manhunt; maniacs; manikin; mankind; mannish; mansard; mansion; mantels; mantras; manuals; manumit; marabou; maracas; marauds; marimba; marital; markups; marmots; maroons; marquee; marquis; marshal; martyrs; marvels; mascara; mascots; masonic; masonry; masseur; mastiff; mastoid; matador; matinee; mattock; matzohs; matzoth; maudlin; maxilla; maximal; maximum; mayoral; maypole; mazurka; meadows; meander; measles; measure; medians; mediate; medical; mediums; medleys; medulla; meekest; megaton; melange; melanin; melodic; members; memento; memoirs; menfolk; menorah; menthol; mention; mentors; meowing; mercies; mercury; mergers; merinos; merited; mermaid; merrily; mescals; messiah; messily; mestizo; meteors; methane; methods; metiers; metrics; mewling; miaowed; miasmas; microbe; midland; midmost; midriff; midterm; midtown; midways; midweek; midwife; midyear; migrant; migrate; mildews; militia; milksop; mimetic; mimicry; mimosas; minaret; mindful; mineral; minibus; minicam; minimal; minimum; minivan; minored; minuend; minuets; minutia; miracle; mirages; mirrors; miscall; miscast; misdeal; misdeed; misdoes; misdone; miserly; misfire; misfits; mishaps; mislaid; mislays; misrule; missals; misstep; mistake; mistily; mistime; mistook; mistype; mitosis; mitring; mizzens; moderns; modesty; modicum; moistly; molests; mollify; mollusc; monarch; mongrel; moniker; monitor; monocle; monolog; monsoon; montage; monthly; moodily; moonlit; moppets; moraine; morally; mordant; morgues; morocco; moronic; morsels; mosaics; motleys; motlier; motored; mousers; mouthed; muezzin; mukluks; mulatto; mullahs; mummify; mundane; murders; murkily; murmurs; museums; musical; musings; muskets; muskrat; mussels; mustang; mutable; mutants; muumuus; mynahes; myriads; myrtles; mystics; mystify; naiades; naivest; nakedly; napalms; naphtha; napkins; narrate; narwhal; nasally; nascent; natural; nautili; necktie; neglect; negligs; neither; neonate; nephews; nervous; network; neurons; neuters; neutral; neutron; newbies; newborn; newness; newsboy; newsier; newtons; nexuses; nickels; niftier; niggard; nightie; ninepin; nirvana; nitpick; nitrate; nitwits; noblest; noggins; noisier; noisily; noisome; nomadic; nominal; nominee; noncoms; nonplus; nonskid; nonstop; nonuser; nonzero; noonday; nosegay; nostril; notepad; nourish; novelty; nowhere; noxious; nuclear; nucleic; nucleus; nudists; nuggets; numbing; numeral; numeric; nuncios; nuptial; nursery; nurture; nutmeat; nutmegs; nutrias; oatmeal; obelisk; obesity; obeying; objects; oblique; oblongs; obloquy; oboists; obscene; obscure; obsequy; observe; obtains; obtrude; obtuser; obverse; obviate; obvious; ocarina; occlude; oceanic; ocelots; octagon; octaves; octette; octopus; oculars; oculist; oddball; oddness; odorous; odyssey; offbeat; offends; offered; offhand; offings; offload; offsets; offside; oftener; oilskin; omelets; ominous; omnibus; oneness; onerous; oneself; onetime; ongoing; opacity; openers; openest; operand; opiates; opinion; opossum; oppress; optimum; options; opulent; oracles; orbital; orbited; orchard; orchids; ordains; ordeals; ordered; orderly; ordinal; oregano; organic; orgasms; orients; orifice; origami; origins; orioles; orotund; orphans; osmosis; osmotic; ospreys; ostrich; ottoman; outages; outbids; outcome; outcrop; outdone; outdoor; outings; outlaid; outlook; outplay; outpost; outputs; outrage; outrank; outruns; outsell; outsold; outstay; outtake; outvote; outward; outwear; ovarian; ovaries; overact; overall; overdid; overdue; overeat; overjoy; overlie; oversaw; oversee; overtax; overtly; overuse; oviduct; ovulate; oxfords; oxidise; oxymora; pacific; package; pageant; pagodas; palatal; palaver; palette; palmist; palpate; panacea; panache; pancake; panicky; panoply; panther; papayas; papilla; papoose; paprika; papyrus; paradox; paragon; parapet; parasol; parboil; parcels; parfait; pariahs; parlors; parlour; parquet; parsnip; partake; partner; partook; parvenu; paschal; passion; passkey; pastime; patella; pathway; patient; patriot; paucity; pawpaws; payload; payment; payroll; peacock; peafowl; peahens; peanuts; pearled; peasant; peccary; pedagog; pedants; pedlars; peerage; peevish; peewees; pelagic; pelican; penalty; penance; pencils; penguin; penises; penlite; pennons; pensive; peonage; peppier; peptics; percale; percent; perfect; perfidy; perform; perfume; perhaps; perigee; periods; periwig; permute; perplex; persist; pertest; perturb; perusal; pervade; pervert; pesetas; petiole; petites; petrels; petrify; pettily; petunia; phalanx; phallic; phallus; phantom; pharaoh; pharynx; philtre; phloxes; phoebes; phoenix; phoneme; phoneys; phoning; photoed; phrasal; physics; pianist; piazzas; piccolo; pickaxe; pickups; picnics; picture; pidgins; piebald; piecing; piggish; piglets; pigpens; pigskin; pigtail; pilaffs; pileups; pilfers; pilgrim; pillars; pillbox; pillory; pimento; pinball; pincers; pinhead; pinhole; pinkeye; pinkish; pinnate; pintoes; pioneer; piously; piquant; piquing; piranha; piteous; pitfall; pithier; pithily; pitiful; pivotal; pizzazz; placard; placate; placebo; placket; plainly; plaints; planets; plateau; platens; platoon; platypi; plaudit; playact; playboy; playful; playoff; playpen; plectra; plenary; pliable; pliancy; plinths; plugins; plumage; pluming; plurals; plusses; plywood; podcast; podiums; poetess; pogroms; polecat; polemic; politer; politic; polkaed; pollute; polygon; polymer; poniard; pontiff; pontoon; poorest; popcorn; popguns; poplars; popover; popular; porcine; portico; portion; portray; poseurs; poshest; posited; possess; possums; postbox; postdoc; postwar; potency; potfuls; pothole; pothook; potluck; poultry; poverty; powwows; prairie; praline; prattle; prawned; preachy; precede; precept; predict; preempt; prefabs; preface; prefect; prefers; preheat; prelude; premier; premium; prepaid; prepare; prepays; preppie; prequel; presage; presets; preside; prestos; presume; preteen; pretend; pretext; pretzel; prevail; preview; prevues; priests; primers; prithee; probity; problem; proceed; proctor; procure; prodigy; proffer; profile; profits; profuse; progeny; program; prologs; prolong; promote; prompts; pronoun; proofed; propels; prophet; propose; prosaic; prosody; protege; prouder; proudly; proverb; provide; proviso; provoke; provost; proxies; prudent; prudery; prudish; pruning; psychic; puberty; publish; puckish; pudgier; pueblos; puerile; pullout; pulpier; pulpits; pulsars; pulsate; pumices; pundits; pungent; punster; puppets; puritan; purloin; purport; purpose; pursers; pursuit; purview; pushups; pustule; putrefy; pyramid; pythons; quacked; quaffed; quahaug; quahogs; quailed; quaking; quantum; quarrel; quartos; quasars; queuing; quibble; quiches; quickie; quickly; quietly; quietus; quinces; quinine; quintet; quipped; quirked; quoited; quondam; quorums; quoting; rabbits; raccoon; racemes; raceway; racoons; racquet; radials; radiant; radiate; radical; radioed; raffish; rafters; raggedy; raglans; ragouts; ragtags; ragtime; ragweed; raiders; railway; raiment; rainbow; rainier; rampage; ramrods; rancour; ransack; rapider; rapidly; rapport; rascals; rashest; raspier; rattans; rattrap; raucous; ravened; ravioli; rawhide; rawness; readily; readmit; readout; reagent; realign; reality; reapply; rearmed; rebirth; rebuffs; recalls; receipt; recheck; recital; recluse; recoils; recoups; recruit; rectify; rectums; recycle; redcaps; redcoat; reddens; reddest; reddish; redeems; redhead; redneck; redoing; redoubt; redraft; redskin; redwood; reefers; reenact; reenter; reentry; referee; refocus; refresh; refuels; refunds; refusal; regalia; regatta; regency; regroup; regular; reissue; rejoice; rejoins; relabel; relapse; relearn; release; reliant; reloads; remarks; remarry; rematch; remnant; remodel; remorse; removal; renewal; rentals; reoccur; reopens; reorder; repairs; replace; replays; replica; reprise; reproof; reprove; reptile; repulse; requiem; rereads; reroute; rescind; residue; respond; restart; restock; restore; restudy; results; retools; retouch; retrial; returns; reunify; reunion; reunite; revamps; revelry; reviews; revisit; revival; revolts; rhizome; rhodium; rhombus; rhubarb; rhyming; rhythms; richest; ricksha; ricotta; rigidly; rigours; ringlet; rioters; riotous; ripened; riposte; ripsaws; riskier; rituals; ritzier; rivalry; riveted; rivulet; roadbed; roadway; robotic; rodents; roebuck; rogered; roguery; rollick; romaine; romance; rompers; romping; rooftop; roomful; roomier; rosebud; rosined; rotunda; roundup; rowboat; roweled; rubbish; rubella; rubiest; rubrics; rudders; ruffian; ruinous; rulings; rummage; runaway; runoffs; runways; rustics; sackful; sadists; safaris; saffron; saguaro; salaams; salamis; saltest; saltier; salvoes; sambaed; samovar; sampans; samurai; sanctum; sandbox; sandhog; sandlot; sarcasm; sarcoma; sardine; sarongs; sashays; satanic; satchel; satiate; satiety; satires; satisfy; satraps; saucers; saucier; saucily; saucing; saunaed; sausage; sauteed; savanna; savants; saviors; saviour; sawdust; sawmill; scabies; scalars; scalene; scandal; scapula; scarabs; scarify; scenery; sceptic; sceptre; schisms; schlock; schmalz; schmuck; scholar; schools; schrods; schtick; sciatic; science; scissor; sconces; scorned; scotchs; scourge; scowled; scratch; scrawny; screech; screens; scribes; scripts; scrooge; scrotum; scrunch; scruple; scubaed; sculled; sculpts; scumbag; scupper; seabeds; seabird; seafood; sealant; seamier; seaport; seasick; seaside; seaward; seaways; seaweed; seclude; seconds; secrecy; secular; seeings; seekers; seepage; seesaws; segment; seismic; seizing; seizure; selects; selfish; sellout; seltzer; senator; sensual; septums; sequels; sequins; sequoia; serener; serfdom; serious; sermons; serpent; servant; servers; sesames; several; sexiest; sexists; sexless; sexpots; sextant; sextons; shackle; shakeup; shakily; shamans; shamble; shampoo; shapely; sharply; shebang; shekels; shellac; sherbet; sheriff; shields; shindig; shingle; shlepps; shlocky; shoaled; shodden; shoguns; shortly; shotgun; shovels; showbiz; showily; showoff; shrouds; shticks; shudder; shuteye; shutout; shyster; sickbed; sickens; sickest; sidearm; sierras; sieving; signals; silence; silents; silicon; simians; similar; similes; sincere; sinuous; sirloin; sirocco; sitcoms; situate; sixteen; sixties; sizable; skaters; sketchy; skewers; skidded; skilful; skycaps; skyjack; skylark; skyline; skyward; slaloms; slavish; sleazes; sleekly; sleeves; sleighs; sleuths; slogans; slouchy; slovens; slowest; smaller; smartly; smitten; smokier; smolder; smooths; smother; snidest; snipers; snorkel; soapbox; soberly; socials; society; softens; softest; soggily; soirees; sojourn; solaria; solicit; solider; solidly; soloist; solvent; somehow; someone; sonatas; sonnies; soonest; sootier; soprano; sorbets; sorcery; sorghum; sorrels; sottish; soulful; soupcon; soviets; soybean; spandex; spangle; spaniel; sparely; sparest; sparkle; sparrow; spartan; spastic; spatula; species; specify; speckle; speedup; spheres; spigots; spinach; spinets; spinoff; spiraea; spirits; spittle; splashy; spleens; splodge; splotch; splurge; sponsor; sporran; spouses; spreads; sprites; sprouts; spuming; squalid; squalls; squalor; squawks; squeeze; squelch; stadium; staider; staidly; stained; stalest; stamens; stamina; standby; stanzas; starchy; stardom; starkly; startle; stately; station; statues; staunch; stealth; stellar; stencil; stepson; stereos; sterile; sterner; sternly; sternum; steroid; steward; stickup; stiffly; stigmas; stimuli; stipend; stipple; stirrup; stoical; stomach; stonier; stonily; stooges; stopgap; storage; storeys; stouter; stoutly; strands; strange; stratum; streets; stretch; strophe; strudel; stuccos; student; stupefy; stupids; stupors; styptic; suavely; suavest; suavity; subhead; subject; subjoin; sublime; suborns; subplot; subsist; subsoil; subsume; subteen; subtler; suburbs; subvert; subways; succeed; success; succour; succumb; sucrose; sudsier; suffice; suffuse; sugared; suggest; suicide; suitors; sulfate; sulfide; sulfurs; sulkily; sulphur; summons; sunbeam; sunburn; sundaes; sundial; sunfish; sunlamp; sunless; sunrise; sunroof; sunspot; suppers; suppler; support; suppose; supreme; surface; surfeit; surgery; surmise; surname; surpass; surplus; surreal; survive; suspect; suspend; sustain; swarmed; swarthy; sweetie; sweetly; swiftly; swinish; swollen; syllabi; symbols; symptom; synagog; synapse; syncing; synergy; synonym; syringe; systems; tableau; tablets; tabloid; tabooed; tacitly; tactful; tactics; tactile; tadpole; taffeta; takeoff; takeout; talents; tallest; tallyho; tamales; tandems; tangelo; tangent; tankard; tankful; tantrum; tapioca; targets; tariffs; tarmacs; tattoos; tawnier; taxicab; teacups; teapots; teargas; tearoom; teatime; teazles; tedious; teenage; teenier; teepees; temblor; tempest; temples; tenable; tenancy; tenants; tendons; tendril; tenfold; tenoned; tenpins; tensile; tenuous; tequila; terabit; termite; terrace; terrain; terrify; terrors; tetanus; tethers; textile; textual; texture; thalami; thanked; thawing; theatre; theists; theorem; therapy; thereto; thermal; thermos; thiamin; thickly; thimble; thirdly; thorium; thought; through; thrower; thrusts; thruway; thudded; thunder; thwacks; thwarts; thyroid; thyself; tidying; timbres; timider; timidly; timpani; tinfoil; tinsels; tipsily; tirades; tireder; tissues; titanic; titbits; titmice; titular; tobacco; tocsins; toehold; toenail; tomboys; tomcats; tonight; tonnage; tonsils; tonsure; toolbar; toolbox; toolkit; topazes; topcoat; topknot; topless; topside; tornado; torpedo; torsion; torture; tossups; totally; totemic; toucans; toupees; towhead; towpath; trachea; traduce; traffic; tragedy; traipse; trample; transit; transom; trapeze; traumas; travail; treason; treetop; trefoil; trekked; trellis; tremble; tremolo; tremors; trended; triceps; trident; trigger; trilogy; trinity; trinket; tripods; trisect; tritely; tritest; triumph; trivial; trochee; trodden; troikas; trollop; tropics; tropism; trouble; troughs; trounce; trowels; truancy; truants; truffle; truisms; trundle; tryouts; tsunami; tubbier; tufting; tugboat; tuition; tumults; tundras; tuneful; turbans; turbine; turbots; tureens; turkeys; turmoil; turnips; turnkey; turnoff; turrets; tussock; tutored; tuxedos; tweaked; twelfth; twelves; twining; twinkle; twofers; twofold; twosome; tycoons; tympana; typeset; typhoid; typhoon; typists; tyranny; tyrants; ugliest; ululate; umbrage; umlauts; umpteen; unaided; unarmed; unasked; unaware; unblock; unbolts; unbosom; uncanny; uncivil; unclasp; uncoils; uncorks; uncouth; uncover; unction; undergo; undress; unearth; uneaten; unequal; unfrock; unfunny; unfurls; ungodly; unguent; unhands; unhappy; unheard; unhinge; unhitch; unhooks; unhorse; unicorn; uniform; uniquer; unitary; uniting; unkempt; unknown; unlatch; unlearn; unleash; unloads; unlocks; unloose; unlucky; unmakes; unmanly; unmasks; unmoral; unnerve; unpacks; unpaved; unplugs; unquote; unravel; unready; unriper; unsafer; unscrew; unsnaps; unsnarl; unstops; unstuck; untried; untruer; untruth; untwist; unusual; unveils; unwiser; unwraps; upbeats; upbraid; upchuck; upended; upfront; upgrade; uphills; upholds; uplands; uplifts; upraise; uproars; uproots; upscale; upshots; upsides; upstart; upsurge; upswing; uptakes; upturns; upwards; urbaner; urchins; urethra; urgency; urinals; urinary; urinate; urology; useable; useless; ushered; usually; usurers; utensil; uterine; utilise; utility; uttered; utterly; uvulars; vacancy; vaccine; vacuity; vacuous; vacuums; vagrant; vaguely; vaguest; valeted; validly; valises; vamoose; vampire; vanilla; vapours; variate; variety; various; varlets; varmint; varsity; varying; vassals; veggies; velours; velvety; venally; venison; veranda; verbals; verbena; verbose; verdant; verdict; verdure; versify; version; vertigo; vespers; vessels; vestige; veteran; viaduct; vibrant; viceroy; vicious; victims; vicunas; viewers; viewing; vinegar; vintner; violate; violent; violets; violins; violist; viragos; virgins; virgule; virtues; viruses; visages; visaing; viscera; viscous; visions; visited; visitor; visuals; vitally; vitamin; vitiate; vitriol; viziers; vocalic; volcano; voltage; voltaic; volumes; vomited; voyeurs; waggish; wagoner; wakeful; wakened; walkout; walkway; wallaby; walleye; walnuts; wannabe; wapitis; warhead; warlike; warlord; warpath; warrant; warrior; warthog; wartier; wartime; washout; washtub; waspish; wassail; wastrel; wavelet; waxwing; waxwork; waylaid; waylays; wayside; wayward; weakens; weakest; weapons; wearily; webbing; website; wedlock; weekday; weekend; weevils; weirder; weirdly; weirdos; welcome; welfare; western; wetland; wettest; whacked; whalers; wharves; whatnot; wheaten; wheedle; whetted; whiffed; whimsey; whiskys; whitens; whitest; whitish; whoever; widgeon; wildcat; willful; windbag; windier; windups; wingtip; winsome; wiretap; without; wittier; wittily; wolfish; wolfram; womanly; woodcut; woofers; woolens; woollen; workday; workers; workout; worldly; worsens; worsted; wraiths; wrangle; written; wrongly; yachted; yardage; yardarm; yeshiva; yoghurt; yogurts; younger; yttrium; zaniest; zeniths; zephyrs; zeroing; zigzags; zincked; zinnias; zircons; zodiacs; zombies; zoology; zygotes'"
1863 ]
1864 },
1865 "execution_count": 46,
1866 "metadata": {},
1867 "output_type": "execute_result"
1868 }
1869 ],
1870 "source": [
1871 "'; '.join(sorted(list(r)[0] for r in reachables if len(r) == 1))"
1872 ]
1873 },
1874 {
1875 "cell_type": "code",
1876 "execution_count": 47,
1877 "metadata": {
1878 "collapsed": true
1879 },
1880 "outputs": [],
1881 "source": [
1882 "for a in reachables:\n",
1883 " for b in reachables:\n",
1884 " if a != b:\n",
1885 " if not a.isdisjoint(b):\n",
1886 " print(a, b)"
1887 ]
1888 },
1889 {
1890 "cell_type": "code",
1891 "execution_count": 35,
1892 "metadata": {
1893 "collapsed": true
1894 },
1895 "outputs": [],
1896 "source": [
1897 "# longest_chain = []\n",
1898 "# with open('all-chains-4.txt', 'w', 1) as f:\n",
1899 "# for ws in reachables:\n",
1900 "# for s in ws:\n",
1901 "# for t in ws:\n",
1902 "# if s < t:\n",
1903 "# chain = astar_search(s, t)\n",
1904 "# if chain:\n",
1905 "# f.write('{}\\n'.format(chain))\n",
1906 "# if len(chain) > len(longest_chain):\n",
1907 "# longest_chain = chain\n",
1908 "\n",
1909 "# longest_chain"
1910 ]
1911 },
1912 {
1913 "cell_type": "code",
1914 "execution_count": 48,
1915 "metadata": {
1916 "collapsed": true
1917 },
1918 "outputs": [],
1919 "source": [
1920 "bigset = max(reachables, key=len)"
1921 ]
1922 },
1923 {
1924 "cell_type": "code",
1925 "execution_count": 51,
1926 "metadata": {},
1927 "outputs": [
1928 {
1929 "name": "stdout",
1930 "output_type": "stream",
1931 "text": [
1932 "['galling', 'gelling', 'selling', 'sealing', 'scaling', 'scaring']\n",
1933 "['raining', 'railing', 'tailing', 'tabling', 'tabbing', 'gabbing', 'gobbing', 'bobbing', 'bobbins', 'bobbies', 'bobbles', 'babbles', 'gabbles', 'garbles', 'gargles', 'gaggles', 'giggles', 'wiggles']\n",
1934 "['blowing', 'flowing', 'flawing', 'flaking', 'slaking', 'soaking', 'socking', 'sacking', 'tacking', 'tasking']\n",
1935 "['bumbled', 'bubbled', 'bobbled', 'bobbles', 'bobbies', 'bobbins', 'bobbing', 'boobing', 'booting', 'boating', 'beating', 'beading', 'bending', 'pending']\n",
1936 "['felling', 'belling', 'belting', 'bolting', 'booting', 'boobing', 'bobbing', 'bobbins', 'bobbies', 'bobbles', 'bubbles', 'burbles', 'burgles', 'bungles', 'bangles', 'tangles', 'tingles', 'tinkles', 'tickles']\n",
1937 "['hurdled', 'huddled', 'huddles', 'puddles', 'paddles', 'paddies', 'daddies', 'dandies', 'dandier', 'handier', 'hardier', 'tardier', 'tarrier', 'terrier', 'tearier']\n",
1938 "['seeding', 'sending', 'rending', 'renting', 'ranting', 'ratting', 'hatting']\n",
1939 "['muddled', 'fuddled', 'fiddled', 'riddled']\n",
1940 "['canting', 'casting', 'basting', 'besting', 'beating', 'bearing', 'fearing']\n",
1941 "['furling', 'fulling', 'felling', 'selling', 'sealing', 'searing', 'gearing', 'glaring', 'glazing']\n",
1942 "['bracing', 'gracing', 'grading', 'goading', 'loading', 'leading', 'leaking', 'peaking', 'peeking', 'peeping']\n",
1943 "['rallied', 'dallied', 'dallies', 'dollies', 'collies', 'coolies', 'cookies', 'bookies', 'boobies', 'bobbies', 'bobbins', 'bobbing', 'boobing', 'booting', 'rooting', 'rioting', 'rifting']\n",
1944 "['sorting', 'porting', 'potting', 'pitting', 'hitting']\n",
1945 "['halving', 'halting', 'hatting', 'hitting', 'hinting', 'hinging', 'tinging']\n",
1946 "['warping', 'warring', 'barring', 'barbing', 'garbing', 'gabbing', 'gobbing', 'bobbing', 'bobbins', 'bobbies', 'bobbles', 'bubbles', 'burbles', 'burgles', 'bungles', 'bangles', 'dangles', 'dandles', 'dandies', 'daddies', 'paddies', 'paddles', 'puddles', 'huddles', 'hurdles', 'hurtles', 'hustles', 'hustler', 'rustler', 'rustier', 'mustier', 'mussier', 'mossier']\n",
1947 "['warding', 'carding', 'carting', 'parting', 'patting', 'putting']\n",
1948 "['hawking', 'hacking', 'hocking', 'hooking', 'booking', 'boobing', 'bobbing', 'bobbins', 'bobbies', 'bobbles', 'bubbles', 'burbles', 'burgles', 'bungles', 'bangles', 'dangles', 'dandles', 'dandies', 'dandier', 'handier', 'hardier', 'tardier', 'tarrier', 'tarries', 'parries', 'parties', 'patties', 'potties', 'potpies', 'poppies', 'puppies']\n",
1949 "['hussies', 'huskies', 'huskier', 'duskier', 'dustier', 'rustier', 'rustler', 'hustler', 'hustles', 'hurtles', 'hurdles', 'huddles', 'puddles', 'paddles', 'paddies', 'daddies', 'dandies', 'dandles', 'dangles', 'wangles', 'waggles', 'wiggles', 'wiggler']\n",
1950 "['gonging', 'bonging', 'bonding', 'bending', 'beading', 'bearing', 'searing', 'sparing', 'spacing', 'spicing', 'slicing', 'sliding', 'eliding', 'eluding', 'exuding']\n",
1951 "['locking', 'lucking', 'bucking', 'bulking', 'bulling', 'fulling', 'furling', 'furlong']\n"
1952 ]
1953 }
1954 ],
1955 "source": [
1956 "for _ in range(20):\n",
1957 " start, goal = random.sample(bigset, 2)\n",
1958 " print(astar_search_closed(start, goal))"
1959 ]
1960 },
1961 {
1962 "cell_type": "code",
1963 "execution_count": 52,
1964 "metadata": {},
1965 "outputs": [
1966 {
1967 "data": {
1968 "text/plain": [
1969 "{2: [['soggier', 'doggier'],\n",
1970 " ['bashing', 'hashing'],\n",
1971 " ['growing', 'groping'],\n",
1972 " ['gulling', 'pulling']],\n",
1973 " 3: [['middles', 'cuddles'],\n",
1974 " ['staring', 'snoring'],\n",
1975 " ['lashing', 'wishing'],\n",
1976 " ['reeking', 'peeping']],\n",
1977 " 4: [['mulling', 'welling'],\n",
1978 " ['seeding', 'peering'],\n",
1979 " ['diddled', 'meddled'],\n",
1980 " ['wiggler', 'wangled']],\n",
1981 " 5: [['yapping', 'bailing'],\n",
1982 " ['seating', 'pitying'],\n",
1983 " ['budging', 'gorging'],\n",
1984 " ['mailing', 'footing']],\n",
1985 " 6: [['mooring', 'polling'],\n",
1986 " ['lapping', 'pocking'],\n",
1987 " ['rooking', 'slating'],\n",
1988 " ['palling', 'yucking']],\n",
1989 " 7: [['polling', 'funding'],\n",
1990 " ['showing', 'jetting'],\n",
1991 " ['gonging', 'kenning'],\n",
1992 " ['tarring', 'tinting']],\n",
1993 " 8: [['gabbing', 'fudging'],\n",
1994 " ['rubbing', 'forking'],\n",
1995 " ['zooming', 'railing'],\n",
1996 " ['humping', 'fouling']],\n",
1997 " 9: [['soloing', 'gadding'],\n",
1998 " ['reefing', 'denying'],\n",
1999 " ['huffing', 'gearing'],\n",
2000 " ['gabbing', 'tensing']],\n",
2001 " 10: [['touting', 'bumming'],\n",
2002 " ['loafing', 'kissing'],\n",
2003 " ['destiny', 'lording'],\n",
2004 " ['styling', 'dogging']],\n",
2005 " 11: [['bagging', 'booties'],\n",
2006 " ['woolies', 'dooming'],\n",
2007 " ['whining', 'termini'],\n",
2008 " ['trading', 'fibbing']],\n",
2009 " 12: [['tangier', 'boggles'],\n",
2010 " ['hubbies', 'bonding'],\n",
2011 " ['minting', 'boobies'],\n",
2012 " ['sagging', 'bobbled']],\n",
2013 " 13: [['bandies', 'battier'],\n",
2014 " ['woodies', 'muggier'],\n",
2015 " ['pinning', 'cobbles'],\n",
2016 " ['pegging', 'bobbled']],\n",
2017 " 14: [['cobbles', 'humming'],\n",
2018 " ['rustler', 'dawdler'],\n",
2019 " ['tumbler', 'jarring'],\n",
2020 " ['wobbled', 'milking']],\n",
2021 " 15: [['gambles', 'spacing'],\n",
2022 " ['willies', 'bungled'],\n",
2023 " ['hugging', 'mumbles'],\n",
2024 " ['bidding', 'gambler']],\n",
2025 " 16: [['sillies', 'pooping'],\n",
2026 " ['cussing', 'mumbled'],\n",
2027 " ['gushing', 'gambled'],\n",
2028 " ['bundles', 'tasking']],\n",
2029 " 17: [['singled', 'hostler'],\n",
2030 " ['horsing', 'wiggles'],\n",
2031 " ['bullies', 'parking'],\n",
2032 " ['handing', 'woodies']],\n",
2033 " 18: [['tickles', 'fouling'],\n",
2034 " ['toggles', 'bidding'],\n",
2035 " ['besting', 'soldier'],\n",
2036 " ['joining', 'toggles']],\n",
2037 " 19: [['masking', 'jiggled'],\n",
2038 " ['birdied', 'boogies'],\n",
2039 " ['mantled', 'praying'],\n",
2040 " ['hillier', 'hatting']],\n",
2041 " 20: [['rapping', 'sulkier'],\n",
2042 " ['candied', 'pasting'],\n",
2043 " ['singled', 'longing'],\n",
2044 " ['sillier', 'peeving']],\n",
2045 " 21: [['sighing', 'dailies'],\n",
2046 " ['sickles', 'begging'],\n",
2047 " ['piggies', 'humbler'],\n",
2048 " ['bawling', 'paddies']],\n",
2049 " 22: [['tardier', 'rolling'],\n",
2050 " ['judging', 'bandies'],\n",
2051 " ['tardier', 'letting'],\n",
2052 " ['tasking', 'rangier']],\n",
2053 " 23: [['kicking', 'diddles'],\n",
2054 " ['dawning', 'bulgier'],\n",
2055 " ['pedaled', 'felting'],\n",
2056 " ['piddled', 'jetting']],\n",
2057 " 24: [['veining', 'cockles'],\n",
2058 " ['forcing', 'biggies'],\n",
2059 " ['gauging', 'boggier'],\n",
2060 " ['kenning', 'hardier']],\n",
2061 " 25: [['palmier', 'husking'],\n",
2062 " ['toddles', 'healing'],\n",
2063 " ['middies', 'burping'],\n",
2064 " ['bobbled', 'dossier']],\n",
2065 " 26: [['middies', 'mushing'],\n",
2066 " ['buckled', 'smoking'],\n",
2067 " ['tearier', 'gracing'],\n",
2068 " ['hitting', 'doggies']],\n",
2069 " 27: [['wearier', 'gonging'],\n",
2070 " ['farming', 'hurtled'],\n",
2071 " ['tinging', 'merrier'],\n",
2072 " ['basting', 'hustled']],\n",
2073 " 28: [['chasing', 'buddies'],\n",
2074 " ['pigmies', 'huffing'],\n",
2075 " ['veining', 'hustles'],\n",
2076 " ['manning', 'wearies']],\n",
2077 " 29: [['bulking', 'patsies'],\n",
2078 " ['bustled', 'pending'],\n",
2079 " ['rustles', 'slewing'],\n",
2080 " ['tattles', 'doggies']],\n",
2081 " 30: [['tarring', 'dustier'],\n",
2082 " ['hostler', 'glowing'],\n",
2083 " ['battier', 'flaming'],\n",
2084 " ['singing', 'potties']],\n",
2085 " 31: [['nuttier', 'packing'],\n",
2086 " ['bumping', 'potpies'],\n",
2087 " ['wagging', 'testier'],\n",
2088 " ['gushier', 'crazing']],\n",
2089 " 32: [['fattier', 'signing'],\n",
2090 " ['testing', 'tattler'],\n",
2091 " ['bossier', 'belying'],\n",
2092 " ['curling', 'gushier']],\n",
2093 " 33: [['tattled', 'soiling'],\n",
2094 " ['mintier', 'milling'],\n",
2095 " ['tacking', 'dossier'],\n",
2096 " ['bagging', 'yuckier']],\n",
2097 " 34: [['wattled', 'mending'],\n",
2098 " ['yuppies', 'dogging'],\n",
2099 " ['dunging', 'rattled'],\n",
2100 " ['tattled', 'seeming']],\n",
2101 " 35: [['wattles', 'rigging'],\n",
2102 " ['routine', 'motiles'],\n",
2103 " ['pussies', 'lathing'],\n",
2104 " ['lousier', 'staling']],\n",
2105 " 36: [['wattles', 'chasing'],\n",
2106 " ['motiles', 'orating'],\n",
2107 " ['chafing', 'mintier'],\n",
2108 " ['mottles', 'dulling']],\n",
2109 " 37: [['keeling', 'mottles'],\n",
2110 " ['yuckier', 'rimming'],\n",
2111 " ['cupping', 'motives'],\n",
2112 " ['bottled', 'scoping']],\n",
2113 " 38: [['mobiles', 'girting'],\n",
2114 " ['motiles', 'fencing'],\n",
2115 " ['motives', 'sitting'],\n",
2116 " ['killing', 'motives']],\n",
2117 " 40: [['mossier', 'noising'],\n",
2118 " ['mobiles', 'jeering'],\n",
2119 " ['scoping', 'mobiles'],\n",
2120 " ['revving', 'mottoes']]}"
2121 ]
2122 },
2123 "execution_count": 52,
2124 "metadata": {},
2125 "output_type": "execute_result"
2126 }
2127 ],
2128 "source": [
2129 "solutions = {}\n",
2130 "for _ in range(10000):\n",
2131 " start, goal = random.sample(bigset, 2)\n",
2132 " solution = astar_search_closed(start, goal)\n",
2133 " sl = len(solution)\n",
2134 " if sl not in solutions:\n",
2135 " solutions[sl] = []\n",
2136 " if len(solutions[sl]) < 4:\n",
2137 " solutions[sl].append([start, goal])\n",
2138 " \n",
2139 "# if len(solution) >= 10:\n",
2140 "# solutions += [solution]\n",
2141 " \n",
2142 "solutions"
2143 ]
2144 },
2145 {
2146 "cell_type": "code",
2147 "execution_count": 74,
2148 "metadata": {},
2149 "outputs": [
2150 {
2151 "data": {
2152 "text/plain": [
2153 "{31: [['pupping', 'lustier'],\n",
2154 " ['eloping', 'pastier'],\n",
2155 " ['daisies', 'poppies'],\n",
2156 " ['dossier', 'tattled'],\n",
2157 " ['betting', 'murkier']],\n",
2158 " 32: [['getting', 'mossier'],\n",
2159 " ['busting', 'guppies'],\n",
2160 " ['mussier', 'staring'],\n",
2161 " ['coifing', 'murkier'],\n",
2162 " ['massing', 'cattier']],\n",
2163 " 33: [['cattier', 'signing'],\n",
2164 " ['mousier', 'bulling'],\n",
2165 " ['tattles', 'railing'],\n",
2166 " ['rattler', 'tensing'],\n",
2167 " ['guppies', 'peeking']],\n",
2168 " 34: [['tattled', 'sparing'],\n",
2169 " ['darting', 'bushier'],\n",
2170 " ['dunning', 'tattled'],\n",
2171 " ['rattles', 'deeding'],\n",
2172 " ['girting', 'luckier']],\n",
2173 " 35: [['goading', 'battles'],\n",
2174 " ['rattles', 'griping'],\n",
2175 " ['jerkins', 'rattled'],\n",
2176 " ['wattled', 'pegging'],\n",
2177 " ['mintier', 'damming']],\n",
2178 " 36: [['dotting', 'motives'],\n",
2179 " ['foiling', 'motives'],\n",
2180 " ['bottles', 'missing'],\n",
2181 " ['hussies', 'hulking'],\n",
2182 " ['letting', 'mottoes']],\n",
2183 " 37: [['exuding', 'fattier'],\n",
2184 " ['tinting', 'mottoes'],\n",
2185 " ['bottled', 'temping'],\n",
2186 " ['mobiles', 'bending'],\n",
2187 " ['gushier', 'prising']],\n",
2188 " 38: [['mobiles', 'walking'],\n",
2189 " ['motives', 'furring'],\n",
2190 " ['bottled', 'yessing'],\n",
2191 " ['bottled', 'griming'],\n",
2192 " ['wormier', 'motives']],\n",
2193 " 39: [['mottoes', 'reeving'],\n",
2194 " ['guiding', 'pussier'],\n",
2195 " ['pricing', 'cashier'],\n",
2196 " ['messier', 'arising'],\n",
2197 " ['playing', 'mobiles']],\n",
2198 " 40: [['kissing', 'motives'],\n",
2199 " ['atoning', 'motives'],\n",
2200 " ['mossier', 'noising'],\n",
2201 " ['bottled', 'pricing']],\n",
2202 " 41: [['priding', 'mottled']],\n",
2203 " 42: [['eliding', 'mottoes']]}"
2204 ]
2205 },
2206 "execution_count": 74,
2207 "metadata": {},
2208 "output_type": "execute_result"
2209 }
2210 ],
2211 "source": [
2212 "solutions = {}\n",
2213 "for _ in range(10000):\n",
2214 " start, goal = random.sample(bigset, 2)\n",
2215 " solution = astar_search_closed(start, goal)\n",
2216 " if not solution:\n",
2217 " solution = astar_search_closed(goal, start)\n",
2218 " sl = len(solution)\n",
2219 " if sl > 30:\n",
2220 " if sl not in solutions:\n",
2221 " solutions[sl] = []\n",
2222 " if len(solutions[sl]) < 5:\n",
2223 " solutions[sl].append([start, goal])\n",
2224 " \n",
2225 "# if len(solution) >= 10:\n",
2226 "# solutions += [solution]\n",
2227 " \n",
2228 "solutions"
2229 ]
2230 },
2231 {
2232 "cell_type": "code",
2233 "execution_count": 75,
2234 "metadata": {
2235 "collapsed": true
2236 },
2237 "outputs": [],
2238 "source": [
2239 "solutions = {31: [['pupping', 'lustier'],\n",
2240 " ['eloping', 'pastier'],\n",
2241 " ['daisies', 'poppies'],\n",
2242 " ['dossier', 'tattled'],\n",
2243 " ['betting', 'murkier']],\n",
2244 " 32: [['getting', 'mossier'],\n",
2245 " ['busting', 'guppies'],\n",
2246 " ['mussier', 'staring'],\n",
2247 " ['coifing', 'murkier'],\n",
2248 " ['massing', 'cattier']],\n",
2249 " 33: [['cattier', 'signing'],\n",
2250 " ['mousier', 'bulling'],\n",
2251 " ['tattles', 'railing'],\n",
2252 " ['rattler', 'tensing'],\n",
2253 " ['guppies', 'peeking']],\n",
2254 " 34: [['tattled', 'sparing'],\n",
2255 " ['darting', 'bushier'],\n",
2256 " ['dunning', 'tattled'],\n",
2257 " ['rattles', 'deeding'],\n",
2258 " ['girting', 'luckier']],\n",
2259 " 35: [['goading', 'battles'],\n",
2260 " ['rattles', 'griping'],\n",
2261 " ['jerkins', 'rattled'],\n",
2262 " ['wattled', 'pegging'],\n",
2263 " ['mintier', 'damming']],\n",
2264 " 36: [['dotting', 'motives'],\n",
2265 " ['foiling', 'motives'],\n",
2266 " ['bottles', 'missing'],\n",
2267 " ['hussies', 'hulking'],\n",
2268 " ['letting', 'mottoes']],\n",
2269 " 37: [['exuding', 'fattier'],\n",
2270 " ['tinting', 'mottoes'],\n",
2271 " ['bottled', 'temping'],\n",
2272 " ['mobiles', 'bending'],\n",
2273 " ['gushier', 'prising']],\n",
2274 " 38: [['mobiles', 'walking'],\n",
2275 " ['motives', 'furring'],\n",
2276 " ['bottled', 'yessing'],\n",
2277 " ['bottled', 'griming'],\n",
2278 " ['wormier', 'motives']],\n",
2279 " 39: [['mottoes', 'reeving'],\n",
2280 " ['guiding', 'pussier'],\n",
2281 " ['pricing', 'cashier'],\n",
2282 " ['messier', 'arising'],\n",
2283 " ['playing', 'mobiles']],\n",
2284 " 40: [['motives', 'jamming'],\n",
2285 " ['guppies', 'noising'],\n",
2286 " ['dimming', 'motiles'],\n",
2287 " ['chasing', 'mobiles'],\n",
2288 " ['poising', 'battled'],\n",
2289 " ['motives', 'smoking'],\n",
2290 " ['kissing', 'motives'],\n",
2291 " ['atoning', 'motives'],\n",
2292 " ['mossier', 'noising'],\n",
2293 " ['bottled', 'pricing']],\n",
2294 " 41: [['priding', 'mottled']],\n",
2295 " 42: [['eliding', 'mottoes'], ['poising', 'mottles']]}"
2296 ]
2297 },
2298 {
2299 "cell_type": "code",
2300 "execution_count": 55,
2301 "metadata": {
2302 "scrolled": true
2303 },
2304 "outputs": [
2305 {
2306 "data": {
2307 "text/plain": [
2308 "40"
2309 ]
2310 },
2311 "execution_count": 55,
2312 "metadata": {},
2313 "output_type": "execute_result"
2314 }
2315 ],
2316 "source": [
2317 "len(astar_search_closed('mossier', 'noising'))"
2318 ]
2319 },
2320 {
2321 "cell_type": "code",
2322 "execution_count": 54,
2323 "metadata": {
2324 "scrolled": true
2325 },
2326 "outputs": [
2327 {
2328 "name": "stdout",
2329 "output_type": "stream",
2330 "text": [
2331 "10 loops, best of 3: 154 ms per loop\n"
2332 ]
2333 }
2334 ],
2335 "source": [
2336 "%%timeit\n",
2337 "astar_search_closed('mossier', 'noising')"
2338 ]
2339 },
2340 {
2341 "cell_type": "code",
2342 "execution_count": 77,
2343 "metadata": {
2344 "scrolled": true
2345 },
2346 "outputs": [
2347 {
2348 "data": {
2349 "text/plain": [
2350 "42"
2351 ]
2352 },
2353 "execution_count": 77,
2354 "metadata": {},
2355 "output_type": "execute_result"
2356 }
2357 ],
2358 "source": [
2359 "len(astar_search_closed('eliding', 'mottoes'))"
2360 ]
2361 },
2362 {
2363 "cell_type": "code",
2364 "execution_count": 78,
2365 "metadata": {
2366 "scrolled": true
2367 },
2368 "outputs": [
2369 {
2370 "data": {
2371 "text/plain": [
2372 "'eliding sliding slicing spicing spacing sparing searing bearing beating boating booting boobing bobbing bobbins bobbies bobbles bubbles burbles burgles bungles bangles dangles dandles dandies dandier handier hardier tardier tarrier tarries parries parties patties fatties fattier rattier rattler rattles battles bottles mottles mottoes'"
2373 ]
2374 },
2375 "execution_count": 78,
2376 "metadata": {},
2377 "output_type": "execute_result"
2378 }
2379 ],
2380 "source": [
2381 "' '.join(astar_search_closed('eliding', 'mottoes'))"
2382 ]
2383 },
2384 {
2385 "cell_type": "code",
2386 "execution_count": 76,
2387 "metadata": {
2388 "scrolled": true
2389 },
2390 "outputs": [
2391 {
2392 "name": "stdout",
2393 "output_type": "stream",
2394 "text": [
2395 "10 loops, best of 3: 99.7 ms per loop\n"
2396 ]
2397 }
2398 ],
2399 "source": [
2400 "%%timeit\n",
2401 "astar_search_closed('eliding', 'mottoes')"
2402 ]
2403 },
2404 {
2405 "cell_type": "code",
2406 "execution_count": 80,
2407 "metadata": {},
2408 "outputs": [
2409 {
2410 "name": "stdout",
2411 "output_type": "stream",
2412 "text": [
2413 "pupping, lustier\n",
2414 "getting, mossier\n",
2415 "cattier, signing\n",
2416 "tattled, sparing\n",
2417 "goading, battles\n",
2418 "dotting, motives\n",
2419 "exuding, fattier\n",
2420 "mobiles, walking\n",
2421 "mottoes, reeving\n",
2422 "motives, jamming\n",
2423 "priding, mottled\n",
2424 "eliding, mottoes\n"
2425 ]
2426 }
2427 ],
2428 "source": [
2429 "for l in sorted(solutions):\n",
2430 " print(', '.join(solutions[l][0]))"
2431 ]
2432 },
2433 {
2434 "cell_type": "code",
2435 "execution_count": null,
2436 "metadata": {
2437 "collapsed": true
2438 },
2439 "outputs": [],
2440 "source": []
2441 }
2442 ],
2443 "metadata": {
2444 "kernelspec": {
2445 "display_name": "Python 3",
2446 "language": "python",
2447 "name": "python3"
2448 },
2449 "language_info": {
2450 "codemirror_mode": {
2451 "name": "ipython",
2452 "version": 3
2453 },
2454 "file_extension": ".py",
2455 "mimetype": "text/x-python",
2456 "name": "python",
2457 "nbconvert_exporter": "python",
2458 "pygments_lexer": "ipython3",
2459 "version": "3.5.2+"
2460 }
2461 },
2462 "nbformat": 4,
2463 "nbformat_minor": 2
2464 }