Removing files from data analysis directory
[ou-summer-of-code-2017.git] / 10-word-search / wordsearch-creation.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 re\n",
13 "import random\n",
14 "import collections\n",
15 "import copy\n",
16 "import os\n",
17 "\n",
18 "from IPython.display import clear_output\n",
19 "\n",
20 "from enum import Enum\n",
21 "Direction = Enum('Direction', 'left right up down upleft upright downleft downright')\n",
22 " \n",
23 "delta = {Direction.left: (0, -1),Direction.right: (0, 1), \n",
24 " Direction.up: (-1, 0), Direction.down: (1, 0), \n",
25 " Direction.upleft: (-1, -1), Direction.upright: (-1, 1), \n",
26 " Direction.downleft: (1, -1), Direction.downright: (1, 1)}\n",
27 "\n",
28 "cat = ''.join\n",
29 "wcat = ' '.join\n",
30 "lcat = '\\n'.join"
31 ]
32 },
33 {
34 "cell_type": "code",
35 "execution_count": 180,
36 "metadata": {
37 "collapsed": true
38 },
39 "outputs": [],
40 "source": [
41 "# all_words = [w.strip() for w in open('/usr/share/dict/british-english').readlines()\n",
42 "# if all(c in string.ascii_lowercase for c in w.strip())]\n",
43 "# words = [w for w in all_words\n",
44 "# if not any(w in w2 for w2 in all_words if w != w2)]\n",
45 "# open('wordsearch-words', 'w').write(lcat(words))"
46 ]
47 },
48 {
49 "cell_type": "code",
50 "execution_count": 181,
51 "metadata": {
52 "collapsed": true
53 },
54 "outputs": [],
55 "source": [
56 "# ws_words = [w.strip() for w in open('wordsearch-words').readlines()\n",
57 "# if all(c in string.ascii_lowercase for c in w.strip())]\n",
58 "# ws_words[:10]"
59 ]
60 },
61 {
62 "cell_type": "code",
63 "execution_count": 2,
64 "metadata": {
65 "collapsed": true
66 },
67 "outputs": [],
68 "source": [
69 "ws_words = [w.strip() for w in open('/usr/share/dict/british-english').readlines()\n",
70 " if all(c in string.ascii_lowercase for c in w.strip())]"
71 ]
72 },
73 {
74 "cell_type": "code",
75 "execution_count": 3,
76 "metadata": {},
77 "outputs": [
78 {
79 "data": {
80 "text/plain": [
81 "62183"
82 ]
83 },
84 "execution_count": 3,
85 "metadata": {},
86 "output_type": "execute_result"
87 }
88 ],
89 "source": [
90 "len([w for w in ws_words if len(w) >= 4])"
91 ]
92 },
93 {
94 "cell_type": "code",
95 "execution_count": 4,
96 "metadata": {
97 "collapsed": true
98 },
99 "outputs": [],
100 "source": [
101 "def empty_grid(w, h):\n",
102 " return [['.' for c in range(w)] for r in range(h)]"
103 ]
104 },
105 {
106 "cell_type": "code",
107 "execution_count": 5,
108 "metadata": {
109 "collapsed": true
110 },
111 "outputs": [],
112 "source": [
113 "def show_grid(grid):\n",
114 " return lcat(cat(r) for r in grid)"
115 ]
116 },
117 {
118 "cell_type": "code",
119 "execution_count": 6,
120 "metadata": {},
121 "outputs": [
122 {
123 "name": "stdout",
124 "output_type": "stream",
125 "text": [
126 "..........\n",
127 "..........\n",
128 "..........\n",
129 "..........\n",
130 "..........\n",
131 "..........\n",
132 "..........\n",
133 "..........\n",
134 "..........\n",
135 "..........\n"
136 ]
137 }
138 ],
139 "source": [
140 "grid = empty_grid(10, 10)\n",
141 "print(show_grid(grid))"
142 ]
143 },
144 {
145 "cell_type": "code",
146 "execution_count": 7,
147 "metadata": {
148 "collapsed": true
149 },
150 "outputs": [],
151 "source": [
152 "def indices(grid, r, c, l, d):\n",
153 " dr, dc = delta[d]\n",
154 " w = len(grid[0])\n",
155 " h = len(grid)\n",
156 " inds = [(r + i * dr, c + i * dc) for i in range(l)]\n",
157 " return [(i, j) for i, j in inds\n",
158 " if i >= 0\n",
159 " if j >= 0\n",
160 " if i < h\n",
161 " if j < w]"
162 ]
163 },
164 {
165 "cell_type": "code",
166 "execution_count": 8,
167 "metadata": {
168 "collapsed": true
169 },
170 "outputs": [],
171 "source": [
172 "def gslice(grid, r, c, l, d):\n",
173 " return [grid[i][j] for i, j in indices(grid, r, c, l, d)]"
174 ]
175 },
176 {
177 "cell_type": "code",
178 "execution_count": 9,
179 "metadata": {
180 "collapsed": true
181 },
182 "outputs": [],
183 "source": [
184 "def set_grid(grid, r, c, d, word):\n",
185 " for (i, j), l in zip(indices(grid, r, c, len(word), d), word):\n",
186 " grid[i][j] = l\n",
187 " return grid"
188 ]
189 },
190 {
191 "cell_type": "code",
192 "execution_count": 10,
193 "metadata": {},
194 "outputs": [
195 {
196 "name": "stdout",
197 "output_type": "stream",
198 "text": [
199 "..........\n",
200 "..........\n",
201 "...t......\n",
202 "....e.....\n",
203 ".....s....\n",
204 "......t...\n",
205 ".......w..\n",
206 "........o.\n",
207 ".........r\n",
208 "..........\n"
209 ]
210 }
211 ],
212 "source": [
213 "set_grid(grid, 2, 3, Direction.downright, 'testword')\n",
214 "print(show_grid(grid))"
215 ]
216 },
217 {
218 "cell_type": "code",
219 "execution_count": 191,
220 "metadata": {},
221 "outputs": [
222 {
223 "data": {
224 "text/plain": [
225 "'..e.....'"
226 ]
227 },
228 "execution_count": 191,
229 "metadata": {},
230 "output_type": "execute_result"
231 }
232 ],
233 "source": [
234 "cat(gslice(grid, 3, 2, 15, Direction.right))"
235 ]
236 },
237 {
238 "cell_type": "code",
239 "execution_count": 192,
240 "metadata": {},
241 "outputs": [
242 {
243 "data": {
244 "text/plain": [
245 "<_sre.SRE_Match object; span=(0, 4), match='keen'>"
246 ]
247 },
248 "execution_count": 192,
249 "metadata": {},
250 "output_type": "execute_result"
251 }
252 ],
253 "source": [
254 "re.match(cat(gslice(grid, 3, 2, 4, Direction.right)), 'keen')"
255 ]
256 },
257 {
258 "cell_type": "code",
259 "execution_count": 193,
260 "metadata": {},
261 "outputs": [
262 {
263 "data": {
264 "text/plain": [
265 "<_sre.SRE_Match object; span=(0, 3), match='kee'>"
266 ]
267 },
268 "execution_count": 193,
269 "metadata": {},
270 "output_type": "execute_result"
271 }
272 ],
273 "source": [
274 "re.match(cat(gslice(grid, 3, 2, 3, Direction.right)), 'keen')"
275 ]
276 },
277 {
278 "cell_type": "code",
279 "execution_count": 194,
280 "metadata": {
281 "collapsed": true
282 },
283 "outputs": [],
284 "source": [
285 "re.fullmatch(cat(gslice(grid, 3, 2, 3, Direction.right)), 'keen')"
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 195,
291 "metadata": {
292 "collapsed": true
293 },
294 "outputs": [],
295 "source": [
296 "re.match(cat(gslice(grid, 3, 2, 4, Direction.right)), 'kine')"
297 ]
298 },
299 {
300 "cell_type": "code",
301 "execution_count": 11,
302 "metadata": {
303 "collapsed": true
304 },
305 "outputs": [],
306 "source": [
307 "def could_add(grid, r, c, d, word):\n",
308 " s = gslice(grid, r, c, len(word), d)\n",
309 " return re.fullmatch(cat(s), word)"
310 ]
311 },
312 {
313 "cell_type": "code",
314 "execution_count": 197,
315 "metadata": {},
316 "outputs": [
317 {
318 "data": {
319 "text/plain": [
320 "<_sre.SRE_Match object; span=(0, 4), match='keen'>"
321 ]
322 },
323 "execution_count": 197,
324 "metadata": {},
325 "output_type": "execute_result"
326 }
327 ],
328 "source": [
329 "could_add(grid, 3, 2, Direction.right, 'keen')"
330 ]
331 },
332 {
333 "cell_type": "code",
334 "execution_count": 198,
335 "metadata": {
336 "collapsed": true
337 },
338 "outputs": [],
339 "source": [
340 "could_add(grid, 3, 2, Direction.right, 'kine')"
341 ]
342 },
343 {
344 "cell_type": "code",
345 "execution_count": 199,
346 "metadata": {},
347 "outputs": [
348 {
349 "data": {
350 "text/plain": [
351 "<Direction.up: 3>"
352 ]
353 },
354 "execution_count": 199,
355 "metadata": {},
356 "output_type": "execute_result"
357 }
358 ],
359 "source": [
360 "random.choice(list(Direction))"
361 ]
362 },
363 {
364 "cell_type": "code",
365 "execution_count": 14,
366 "metadata": {
367 "collapsed": true
368 },
369 "outputs": [],
370 "source": [
371 "def present(grid, word):\n",
372 " w = len(grid[0])\n",
373 " h = len(grid)\n",
374 " for r in range(h):\n",
375 " for c in range(w):\n",
376 " for d in Direction:\n",
377 " if cat(gslice(grid, r, c, len(word), d)) == word:\n",
378 " return True, r, c, d\n",
379 " return False, 0, 0, list(Direction)[0]"
380 ]
381 },
382 {
383 "cell_type": "code",
384 "execution_count": 15,
385 "metadata": {
386 "collapsed": true
387 },
388 "outputs": [],
389 "source": [
390 "def present_many(grid, words):\n",
391 " w = len(grid[0])\n",
392 " h = len(grid)\n",
393 " wordlens = set(len(w) for w in words)\n",
394 " presences = []\n",
395 " for r in range(h):\n",
396 " for c in range(w):\n",
397 " for d in Direction:\n",
398 " for wordlen in wordlens:\n",
399 " word = cat(gslice(grid, r, c, wordlen, d))\n",
400 " if word in words:\n",
401 " presences += [(word, r, c, d)]\n",
402 " return set(presences)"
403 ]
404 },
405 {
406 "cell_type": "code",
407 "execution_count": 16,
408 "metadata": {
409 "collapsed": true
410 },
411 "outputs": [],
412 "source": [
413 "def fill_grid(grid, words, word_count, max_attempts=10000, min_word_len=4):\n",
414 " attempts = 0\n",
415 " added_words = []\n",
416 " w = len(grid[0])\n",
417 " h = len(grid)\n",
418 " while len(added_words) < word_count and attempts < max_attempts:\n",
419 " clear_output(wait=True)\n",
420 " print(\"Added\", len(added_words), '; attempt', attempts)\n",
421 " attempts += 1\n",
422 " r = random.randrange(w)\n",
423 " c = random.randrange(h)\n",
424 " word = random.choice(words)\n",
425 " d = random.choice(list(Direction))\n",
426 "# print(word, r, c, d, \n",
427 "# len(word) >= min_word_len, \n",
428 "# not any(word in w2 for w2 in added_words), \n",
429 "# could_add(grid, r, c, d, word), \n",
430 "# not present(grid, word)[0]\n",
431 "# )\n",
432 " if (len(word) >= min_word_len\n",
433 " and not any(word in w2 for w2 in added_words) \n",
434 " and could_add(grid, r, c, d, word)\n",
435 " and not present(grid, word)[0]):\n",
436 " grid2 = copy.deepcopy(grid)\n",
437 " set_grid(grid2, r, c, d, word)\n",
438 "# print(present_many(grid2, [word]))\n",
439 " if collections.Counter(p[0] for p in \n",
440 " present_many(grid2, added_words + [word])).most_common(1)[0][1] == 1:\n",
441 " set_grid(grid, r, c, d, word)\n",
442 " added_words += [word]\n",
443 " attempts = 0\n",
444 " return grid, added_words"
445 ]
446 },
447 {
448 "cell_type": "code",
449 "execution_count": 17,
450 "metadata": {},
451 "outputs": [
452 {
453 "name": "stdout",
454 "output_type": "stream",
455 "text": [
456 "Added 39 ; attempt 9\n"
457 ]
458 },
459 {
460 "data": {
461 "text/plain": [
462 "40"
463 ]
464 },
465 "execution_count": 17,
466 "metadata": {},
467 "output_type": "execute_result"
468 }
469 ],
470 "source": [
471 "g = empty_grid(20, 20)\n",
472 "g, ws = fill_grid(g, ws_words, 40)\n",
473 "len(ws)"
474 ]
475 },
476 {
477 "cell_type": "code",
478 "execution_count": 18,
479 "metadata": {},
480 "outputs": [
481 {
482 "name": "stdout",
483 "output_type": "stream",
484 "text": [
485 "emityad..yltnetap...\n",
486 "noitcesib.selbmur.b.\n",
487 "....hy...dc.......a.\n",
488 "..g.et.r.eoretset.s.\n",
489 "p.rwri.apkud......k.\n",
490 "udoonu.vaene......sl\n",
491 "ritmir.elett.....me.\n",
492 "iseaaf.lspei...taaru\n",
493 "tssne.teatrd..esp.en\n",
494 "aiqlcoifedbe.uhs..dh\n",
495 "nmui.s.yc.ansi.e.nae\n",
496 "suee.g.bnplunskce.re\n",
497 ".lss.n.raeag.iemh.gd\n",
498 ".ast.i.ahan.r.er.u.e\n",
499 ".t.f.l.enhct.ra.a.nd\n",
500 ".e..fs.neei.og.l.wik\n",
501 ".d...u...nnf..e.pde.\n",
502 "elppa.n..sg....eya.b\n",
503 ".......s.waist.ls.c.\n",
504 "suppression.vilere.a\n",
505 "40 words added\n",
506 "smashing counterbalancing womanliest teat unedited unheeded puritans apple patently dissimulated bask tester bewares suet herniae nearby idyll geese grader waist grotesques slap peahens ravel suppression rumbles snuffs peeked bisection alpaca enhance daytime trike leaps coifed foremen chunk slings viler fruity\n"
507 ]
508 }
509 ],
510 "source": [
511 "print(show_grid(g))\n",
512 "print(len(ws), 'words added')\n",
513 "print(wcat(ws))"
514 ]
515 },
516 {
517 "cell_type": "code",
518 "execution_count": null,
519 "metadata": {
520 "collapsed": true,
521 "scrolled": true
522 },
523 "outputs": [],
524 "source": [
525 "for w in ws:\n",
526 " print(w, present(g, w))"
527 ]
528 },
529 {
530 "cell_type": "code",
531 "execution_count": 19,
532 "metadata": {
533 "collapsed": true
534 },
535 "outputs": [],
536 "source": [
537 "def interesting(grid, words, words_limit=40, direction_slack=1):\n",
538 " dirs = set(present(grid, w)[3] for w in words)\n",
539 " return len(words) > words_limit and len(dirs) + direction_slack >= len(delta)"
540 ]
541 },
542 {
543 "cell_type": "code",
544 "execution_count": null,
545 "metadata": {
546 "collapsed": true
547 },
548 "outputs": [],
549 "source": [
550 "interesting(g, ws)"
551 ]
552 },
553 {
554 "cell_type": "code",
555 "execution_count": 20,
556 "metadata": {
557 "collapsed": true
558 },
559 "outputs": [],
560 "source": [
561 "def interesting_grid(width=20, height=20, words_limit=40, max_words=80, direction_slack=1):\n",
562 " boring = True\n",
563 " while boring:\n",
564 " grid = empty_grid(width, height)\n",
565 " grid, words = fill_grid(grid, ws_words, max_words)\n",
566 " boring = not interesting(grid, words, words_limit=words_limit, direction_slack=direction_slack)\n",
567 " return grid, words"
568 ]
569 },
570 {
571 "cell_type": "code",
572 "execution_count": null,
573 "metadata": {
574 "collapsed": true
575 },
576 "outputs": [],
577 "source": [
578 "g, ws = interesting_grid()\n",
579 "print(show_grid(g))\n",
580 "print(len(ws), 'words added; ', len(set(present(g, w)[3] for w in ws)), 'directions')\n",
581 "print(wcat(ws))"
582 ]
583 },
584 {
585 "cell_type": "code",
586 "execution_count": 21,
587 "metadata": {
588 "collapsed": true
589 },
590 "outputs": [],
591 "source": [
592 "def datafile(name, sep='\\t'):\n",
593 " \"\"\"Read key,value pairs from file.\n",
594 " \"\"\"\n",
595 " with open(name) as f:\n",
596 " for line in f:\n",
597 " splits = line.split(sep)\n",
598 " yield [splits[0], int(splits[1])]"
599 ]
600 },
601 {
602 "cell_type": "code",
603 "execution_count": 22,
604 "metadata": {
605 "collapsed": true
606 },
607 "outputs": [],
608 "source": [
609 "def normalise(frequencies):\n",
610 " \"\"\"Scale a set of frequencies so they sum to one\n",
611 " \n",
612 " >>> sorted(normalise({1: 1, 2: 0}).items())\n",
613 " [(1, 1.0), (2, 0.0)]\n",
614 " >>> sorted(normalise({1: 1, 2: 1}).items())\n",
615 " [(1, 0.5), (2, 0.5)]\n",
616 " >>> sorted(normalise({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS\n",
617 " [(1, 0.333...), (2, 0.333...), (3, 0.333...)]\n",
618 " >>> sorted(normalise({1: 1, 2: 2, 3: 1}).items())\n",
619 " [(1, 0.25), (2, 0.5), (3, 0.25)]\n",
620 " \"\"\"\n",
621 " length = sum(f for f in frequencies.values())\n",
622 " return collections.defaultdict(int, ((k, v / length) \n",
623 " for (k, v) in frequencies.items()))\n"
624 ]
625 },
626 {
627 "cell_type": "code",
628 "execution_count": 23,
629 "metadata": {
630 "collapsed": true
631 },
632 "outputs": [],
633 "source": [
634 "english_counts = collections.Counter(dict(datafile('count_1l.txt')))\n",
635 "normalised_english_counts = normalise(english_counts)"
636 ]
637 },
638 {
639 "cell_type": "code",
640 "execution_count": 24,
641 "metadata": {
642 "collapsed": true
643 },
644 "outputs": [],
645 "source": [
646 "wordsearch_counts = collections.Counter(cat(ws_words))\n",
647 "normalised_wordsearch_counts = normalise(wordsearch_counts)"
648 ]
649 },
650 {
651 "cell_type": "code",
652 "execution_count": 25,
653 "metadata": {
654 "collapsed": true
655 },
656 "outputs": [],
657 "source": [
658 "normalised_wordsearch_counts = normalise(collections.Counter(normalised_wordsearch_counts) + collections.Counter({l: 0.05 for l in string.ascii_lowercase}))"
659 ]
660 },
661 {
662 "cell_type": "code",
663 "execution_count": 35,
664 "metadata": {
665 "collapsed": true
666 },
667 "outputs": [],
668 "source": [
669 "def weighted_choice(d):\n",
670 " \"\"\"Generate random item from a dictionary of item counts\n",
671 " \"\"\"\n",
672 " target = random.uniform(0, sum(d.values()))\n",
673 " cuml = 0.0\n",
674 " for (l, p) in d.items():\n",
675 " cuml += p\n",
676 " if cuml > target:\n",
677 " return l\n",
678 " return None\n",
679 "\n",
680 "def random_english_letter():\n",
681 " \"\"\"Generate a random letter based on English letter counts\n",
682 " \"\"\"\n",
683 " return weighted_choice(normalised_english_counts)\n",
684 "\n",
685 "def random_wordsearch_letter():\n",
686 " \"\"\"Generate a random letter based on wordsearch letter counts\n",
687 " \"\"\"\n",
688 " return weighted_choice(normalised_wordsearch_counts)"
689 ]
690 },
691 {
692 "cell_type": "code",
693 "execution_count": null,
694 "metadata": {
695 "collapsed": true
696 },
697 "outputs": [],
698 "source": [
699 "cat(sorted(random_english_letter() for i in range(100)))"
700 ]
701 },
702 {
703 "cell_type": "code",
704 "execution_count": null,
705 "metadata": {
706 "collapsed": true
707 },
708 "outputs": [],
709 "source": [
710 "cat(sorted(random_wordsearch_letter() for i in range(100)))"
711 ]
712 },
713 {
714 "cell_type": "code",
715 "execution_count": 37,
716 "metadata": {},
717 "outputs": [
718 {
719 "data": {
720 "text/plain": [
721 "'h'"
722 ]
723 },
724 "execution_count": 37,
725 "metadata": {},
726 "output_type": "execute_result"
727 }
728 ],
729 "source": [
730 "random_wordsearch_letter()"
731 ]
732 },
733 {
734 "cell_type": "code",
735 "execution_count": 27,
736 "metadata": {
737 "collapsed": true
738 },
739 "outputs": [],
740 "source": [
741 "def pad_grid(g0):\n",
742 " grid = copy.deepcopy(g0)\n",
743 " w = len(grid[0])\n",
744 " h = len(grid)\n",
745 " for r in range(h):\n",
746 " for c in range(w):\n",
747 " if grid[r][c] == '.':\n",
748 " grid[r][c] = random_wordsearch_letter()\n",
749 " return grid"
750 ]
751 },
752 {
753 "cell_type": "code",
754 "execution_count": null,
755 "metadata": {
756 "collapsed": true
757 },
758 "outputs": [],
759 "source": [
760 "padded = pad_grid(g)\n",
761 "print(show_grid(padded))"
762 ]
763 },
764 {
765 "cell_type": "code",
766 "execution_count": null,
767 "metadata": {
768 "collapsed": true
769 },
770 "outputs": [],
771 "source": [
772 "print(show_grid(g))"
773 ]
774 },
775 {
776 "cell_type": "code",
777 "execution_count": null,
778 "metadata": {
779 "collapsed": true,
780 "scrolled": true
781 },
782 "outputs": [],
783 "source": [
784 "for w in ws:\n",
785 " print(w, present(padded, w))"
786 ]
787 },
788 {
789 "cell_type": "code",
790 "execution_count": 28,
791 "metadata": {
792 "collapsed": true
793 },
794 "outputs": [],
795 "source": [
796 "def decoys(grid, words, all_words, limit=100):\n",
797 " decoy_words = []\n",
798 " dlen_limit = max(len(w) for w in words)\n",
799 " while len(words) + len(decoy_words) < limit:\n",
800 " d = random.choice(all_words)\n",
801 " if d not in words and len(d) >= 4 and len(d) <= dlen_limit and not present(grid, d)[0]:\n",
802 " decoy_words += [d]\n",
803 " return decoy_words"
804 ]
805 },
806 {
807 "cell_type": "code",
808 "execution_count": 55,
809 "metadata": {},
810 "outputs": [],
811 "source": [
812 "def decoys(grid, words, all_words, limit=100, min_word_len=4):\n",
813 " decoy_words = []\n",
814 "# dlen_limit = max(len(w) for w in words)\n",
815 " while len(words) + len(decoy_words) < limit:\n",
816 " d = random.choice(all_words)\n",
817 " if (d not in words and \n",
818 " d not in decoy_words and \n",
819 " len(d) >= min_word_len and \n",
820 " not any(w in d for w in (decoy_words + words)) and\n",
821 " not any(d in w for w in decoy_words) and\n",
822 " not present(grid, d)[0]):\n",
823 " decoy_words += [d]\n",
824 " return decoy_words"
825 ]
826 },
827 {
828 "cell_type": "code",
829 "execution_count": null,
830 "metadata": {
831 "collapsed": true
832 },
833 "outputs": [],
834 "source": [
835 "ds = decoys(padded, ws, ws_words)\n",
836 "ds"
837 ]
838 },
839 {
840 "cell_type": "code",
841 "execution_count": null,
842 "metadata": {
843 "collapsed": true,
844 "scrolled": true
845 },
846 "outputs": [],
847 "source": [
848 "for w in ws + ds:\n",
849 " print(w, present(padded, w))"
850 ]
851 },
852 {
853 "cell_type": "code",
854 "execution_count": null,
855 "metadata": {
856 "collapsed": true,
857 "scrolled": true
858 },
859 "outputs": [],
860 "source": [
861 "g, ws = interesting_grid()\n",
862 "p = pad_grid(g)\n",
863 "ds = decoys(p, ws, ws_words)\n",
864 "print(show_grid(g))\n",
865 "print(show_grid(p))\n",
866 "print(len(ws), 'words added; ', len(set(present(g, w)[3] for w in ws)), 'directions')\n",
867 "print('Present:', wcat(sorted(ws)))\n",
868 "print('Decoys:', wcat(sorted(ds)))"
869 ]
870 },
871 {
872 "cell_type": "code",
873 "execution_count": null,
874 "metadata": {
875 "collapsed": true,
876 "scrolled": true
877 },
878 "outputs": [],
879 "source": [
880 "g, ws = interesting_grid(width=10, height=10, words_limit=5, direction_slack=6)\n",
881 "p = pad_grid(g)\n",
882 "ds = decoys(p, ws, ws_words)\n",
883 "print(show_grid(g))\n",
884 "print()\n",
885 "print(show_grid(p))\n",
886 "print(len(ws), 'words added; ', len(set(present(g, w)[3] for w in ws)), 'directions')\n",
887 "print('Present:', wcat(sorted(ws)))\n",
888 "print('Decoys:', wcat(sorted(ds)))"
889 ]
890 },
891 {
892 "cell_type": "code",
893 "execution_count": null,
894 "metadata": {
895 "collapsed": true
896 },
897 "outputs": [],
898 "source": [
899 "ds_original = ['regards', 'perfect', 'instants', 'refined', 'coddle', 'fickler', 'gambol', 'misprint', 'tapes', 'impugns', 'moonshot', 'chump', 'brick', 'siren', 'faddish', 'winced', 'kielbasy', 'market', 'puckered', 'trains', 'welts', 'cackles', 'foaming', 'proceed', 'gliding', 'guts', 'uric', 'oaks', 'molested', 'curled', 'boor', 'solaria', 'gristle', 'bombing', 'loamier', 'ensuing', 'cunt', 'sunder', 'revel', 'coaster', 'grunts', 'mucking', 'typesets', 'carnal', 'whimsy', 'scoff', 'coccyxes', 'meanly', 'sprain', 'minuend', 'ringlet', 'fest', 'winced', 'shinier', 'dicier', 'thirds', 'olives', 'garoting', 'pastrami', 'tranquil', 'tamped', 'sunup', 'crumbled', 'throw', 'ridges', 'chaplets', 'curlier', 'lugs', 'collies', 'adapting', 'demeanor', 'deepen', 'lanyard', 'tiller', 'transfix', 'wariness', 'times', 'mitts', 'dowses', 'creels', 'curds', 'quashed', 'orgasmic', 'ibex', 'retraces', 'casino']\n",
900 "ds = random.sample(ds_original, 15)\n",
901 "ds"
902 ]
903 },
904 {
905 "cell_type": "code",
906 "execution_count": null,
907 "metadata": {
908 "collapsed": true,
909 "scrolled": true
910 },
911 "outputs": [],
912 "source": [
913 "ds_original"
914 ]
915 },
916 {
917 "cell_type": "code",
918 "execution_count": null,
919 "metadata": {
920 "collapsed": true,
921 "scrolled": true
922 },
923 "outputs": [],
924 "source": [
925 "print('grid = ', g)\n",
926 "print('padded_grid = ', p)\n",
927 "print('present_words = ', ws)\n",
928 "print('decoy_words = ', ds)\n",
929 "print('Directions: ', [(w, '`' + str(present(g, w)) + '`') for w in ws])"
930 ]
931 },
932 {
933 "cell_type": "code",
934 "execution_count": null,
935 "metadata": {
936 "collapsed": true
937 },
938 "outputs": [],
939 "source": [
940 "# with open('example-wordsearch.txt', 'w') as f:\n",
941 "# f.write('10x10\\n')\n",
942 "# f.write(show_grid(p))\n",
943 "# f.write('\\n')\n",
944 "# f.write(lcat(sorted(ws + ds)))\n",
945 "# with open('exmaple-wordsearch-solution.txt', 'w') as f:\n",
946 "# f.write('10x10\\n')\n",
947 "# f.write(show_grid(g))\n",
948 "# f.write('\\n')\n",
949 "# f.write(lcat(sorted(ws)) + '\\n\\n')\n",
950 "# f.write(lcat(sorted(ds)))"
951 ]
952 },
953 {
954 "cell_type": "code",
955 "execution_count": null,
956 "metadata": {
957 "collapsed": true,
958 "scrolled": true
959 },
960 "outputs": [],
961 "source": [
962 "cts = collections.Counter()\n",
963 "for w in ws:\n",
964 " _, r, c, d = present(g, w)\n",
965 " inds = indices(g, r, c, len(w), d)\n",
966 " for i in inds:\n",
967 " cts[i] += 1\n",
968 " print(w, r, c, len(w), d, inds)\n",
969 "[i for i in cts if cts[i] > 1]"
970 ]
971 },
972 {
973 "cell_type": "code",
974 "execution_count": null,
975 "metadata": {
976 "collapsed": true
977 },
978 "outputs": [],
979 "source": []
980 },
981 {
982 "cell_type": "code",
983 "execution_count": null,
984 "metadata": {
985 "collapsed": true,
986 "scrolled": true
987 },
988 "outputs": [],
989 "source": [
990 "# for i in range(100):\n",
991 "# print(i)\n",
992 "# g, ws = interesting_grid()\n",
993 "# p = pad_grid(g)\n",
994 "# ds = decoys(p, ws, ws_words)\n",
995 "# with open('wordsearch{:02}.txt'.format(i), 'w') as f:\n",
996 "# f.write('20x20\\n')\n",
997 "# f.write(show_grid(p))\n",
998 "# f.write('\\n')\n",
999 "# f.write(lcat(sorted(ws + ds)))\n",
1000 "# with open('wordsearch-solution{:02}.txt'.format(i), 'w') as f:\n",
1001 "# f.write('20x20\\n')\n",
1002 "# f.write(show_grid(g))\n",
1003 "# f.write('\\n')\n",
1004 "# f.write(lcat(sorted(ws)) + '\\n\\n')\n",
1005 "# f.write(lcat(sorted(ds)))"
1006 ]
1007 },
1008 {
1009 "cell_type": "code",
1010 "execution_count": null,
1011 "metadata": {
1012 "collapsed": true
1013 },
1014 "outputs": [],
1015 "source": [
1016 "g, ws = interesting_grid(width=100, height=100, words_limit=1, max_words=2000, direction_slack=1)\n",
1017 "p = pad_grid(g)\n",
1018 "ds = decoys(p, ws, ws_words, limit=2500)\n",
1019 "# print(show_grid(g))\n",
1020 "# print()\n",
1021 "# print(show_grid(p))"
1022 ]
1023 },
1024 {
1025 "cell_type": "code",
1026 "execution_count": null,
1027 "metadata": {
1028 "collapsed": true
1029 },
1030 "outputs": [],
1031 "source": [
1032 "print(len(ws), 'words added; ', len(set(present(g, w)[3] for w in ws)), 'directions')\n",
1033 "# print('Present:', wcat(sorted(ws)))\n",
1034 "# print('Decoys:', wcat(sorted(ds)))"
1035 ]
1036 },
1037 {
1038 "cell_type": "code",
1039 "execution_count": null,
1040 "metadata": {
1041 "collapsed": true,
1042 "scrolled": true
1043 },
1044 "outputs": [],
1045 "source": [
1046 "with open('huge-wordsearch.txt', 'w') as f:\n",
1047 " f.write('{}x{}\\n'.format(len(g[0]), len(g)))\n",
1048 " f.write(show_grid(p))\n",
1049 " f.write('\\n')\n",
1050 " f.write(lcat(sorted(ws + ds)))"
1051 ]
1052 },
1053 {
1054 "cell_type": "code",
1055 "execution_count": 30,
1056 "metadata": {
1057 "collapsed": true
1058 },
1059 "outputs": [],
1060 "source": [
1061 "def read_wordsearch(fn):\n",
1062 " lines = [l.strip() for l in open(fn).readlines()]\n",
1063 " w, h = [int(s) for s in lines[0].split('x')]\n",
1064 " grid = lines[1:h+1]\n",
1065 " words = lines[h+1:]\n",
1066 " return w, h, grid, words"
1067 ]
1068 },
1069 {
1070 "cell_type": "code",
1071 "execution_count": 31,
1072 "metadata": {
1073 "collapsed": true
1074 },
1075 "outputs": [],
1076 "source": [
1077 "def do_wordsearch_tasks(fn, show_anyway=False):\n",
1078 " width, height, grid, words = read_wordsearch(fn)\n",
1079 " used_words = [w for w in words if present(grid, w)[0]]\n",
1080 " unused_words = [w for w in words if not present(grid, w)[0]]\n",
1081 " lwp = sorted([w for w in words if present(grid, w)[0]], key=len)[-1]\n",
1082 " lwps = [w for w in used_words if len(w) == len(lwp)]\n",
1083 " lwa = sorted(unused_words, key=len)[-1]\n",
1084 " lwas = [w for w in unused_words if len(w) == len(lwa)]\n",
1085 " g0 = empty_grid(width, height)\n",
1086 " for w in words:\n",
1087 " p, r, c, d = present(grid, w)\n",
1088 " if p:\n",
1089 " set_grid(g0, r, c, d, w) \n",
1090 " unused_letters = [l for l, u in zip((c for c in cat(cat(l) for l in grid)), (c for c in cat(cat(l) for l in g0)))\n",
1091 " if u == '.']\n",
1092 " unused_letter_count = collections.Counter(unused_letters)\n",
1093 " makeable_words = []\n",
1094 " for w in unused_words:\n",
1095 " unused_word_count = collections.Counter(w)\n",
1096 " if all(unused_word_count[l] <= unused_letter_count[l] for l in unused_word_count):\n",
1097 " makeable_words += [w]\n",
1098 " lwm = sorted(makeable_words, key=len)[-1]\n",
1099 " lwms = [w for w in makeable_words if len(w) == len(lwm)]\n",
1100 " if show_anyway or len(set((len(lwp),len(lwa),len(lwm)))) == 3:\n",
1101 " print('\\n{}'.format(fn))\n",
1102 " print('{} words present'.format(len(words) - len(unused_words)))\n",
1103 " print('Longest word present: {}, {} letters ({})'.format(lwp, len(lwp), lwps))\n",
1104 " print('Longest word absent: {}, {} letters ({})'.format(lwa, len(lwa), lwas))\n",
1105 " print('{} unused letters'.format(len([c for c in cat(cat(l) for l in g0) if c == '.'])))\n",
1106 " print('Longest makeable word: {}, {} ({})'.format(lwm, len(lwm), lwms))"
1107 ]
1108 },
1109 {
1110 "cell_type": "code",
1111 "execution_count": null,
1112 "metadata": {
1113 "collapsed": true
1114 },
1115 "outputs": [],
1116 "source": [
1117 "[w for w in ws_words if len(w) == 16]"
1118 ]
1119 },
1120 {
1121 "cell_type": "code",
1122 "execution_count": null,
1123 "metadata": {
1124 "collapsed": true
1125 },
1126 "outputs": [],
1127 "source": [
1128 "# all_lines = []\n",
1129 "# for fn in sorted(os.listdir()):\n",
1130 "# if re.match('wordsearch\\d\\d\\.txt', fn):\n",
1131 "# all_lines += open(fn).readlines()\n",
1132 "# all_lines += ['\\n'] * 2\n",
1133 "\n",
1134 "# open('all-wordsearches.txt', 'w').writelines(all_lines)"
1135 ]
1136 },
1137 {
1138 "cell_type": "code",
1139 "execution_count": 209,
1140 "metadata": {
1141 "scrolled": true
1142 },
1143 "outputs": [
1144 {
1145 "name": "stdout",
1146 "output_type": "stream",
1147 "text": [
1148 "Added 6 ; attempt 19\n"
1149 ]
1150 },
1151 {
1152 "data": {
1153 "text/plain": [
1154 "6"
1155 ]
1156 },
1157 "execution_count": 209,
1158 "metadata": {},
1159 "output_type": "execute_result"
1160 }
1161 ],
1162 "source": [
1163 "g = empty_grid(10, 10)\n",
1164 "g, ws = fill_grid(g, ws_words, 200, min_word_len=4, max_attempts=20)\n",
1165 "len(ws)"
1166 ]
1167 },
1168 {
1169 "cell_type": "code",
1170 "execution_count": 210,
1171 "metadata": {},
1172 "outputs": [
1173 {
1174 "name": "stdout",
1175 "output_type": "stream",
1176 "text": [
1177 "Added 1149 ; attempt 9427\n"
1178 ]
1179 },
1180 {
1181 "name": "stderr",
1182 "output_type": "stream",
1183 "text": [
1184 "IOPub message rate exceeded.\n",
1185 "The notebook server will temporarily stop sending output\n",
1186 "to the client in order to avoid crashing it.\n",
1187 "To change this limit, set the config variable\n",
1188 "`--NotebookApp.iopub_msg_rate_limit`.\n"
1189 ]
1190 }
1191 ],
1192 "source": [
1193 "g = empty_grid(100, 100)\n",
1194 "g, ws = fill_grid(g, ws_words, 2000, min_word_len=5)\n",
1195 "len(ws)"
1196 ]
1197 },
1198 {
1199 "cell_type": "code",
1200 "execution_count": 216,
1201 "metadata": {},
1202 "outputs": [
1203 {
1204 "data": {
1205 "text/plain": [
1206 "(1149, 1149, [('scofflaw', 1)])"
1207 ]
1208 },
1209 "execution_count": 216,
1210 "metadata": {},
1211 "output_type": "execute_result"
1212 }
1213 ],
1214 "source": [
1215 "pm = present_many(g, ws)\n",
1216 "pold = [w for w in ws if present(g, w)[0]]\n",
1217 "len(pm), len(pold), collections.Counter(p[0] for p in pm).most_common(1)"
1218 ]
1219 },
1220 {
1221 "cell_type": "code",
1222 "execution_count": 219,
1223 "metadata": {
1224 "collapsed": true
1225 },
1226 "outputs": [],
1227 "source": [
1228 "\n",
1229 "# with open('huge-unpadded-wordsearch.txt', 'w') as f:\n",
1230 "# f.write('{}x{}\\n'.format(len(g[0]), len(g)))\n",
1231 "# f.write(show_grid(g))\n",
1232 "# f.write('\\n')\n",
1233 "# f.write(lcat(sorted(ws)))"
1234 ]
1235 },
1236 {
1237 "cell_type": "code",
1238 "execution_count": 41,
1239 "metadata": {},
1240 "outputs": [
1241 {
1242 "data": {
1243 "text/plain": [
1244 "(100, 100, 1149)"
1245 ]
1246 },
1247 "execution_count": 41,
1248 "metadata": {},
1249 "output_type": "execute_result"
1250 }
1251 ],
1252 "source": [
1253 "w, h, g, ws = read_wordsearch('huge-unpadded-wordsearch.txt')\n",
1254 "g = [[c for c in row] for row in g]\n",
1255 "w, h, len(ws)"
1256 ]
1257 },
1258 {
1259 "cell_type": "code",
1260 "execution_count": 42,
1261 "metadata": {
1262 "scrolled": true
1263 },
1264 "outputs": [
1265 {
1266 "name": "stdout",
1267 "output_type": "stream",
1268 "text": [
1269 "smuiclacphysics.hcnebrevilingd..skcabllup.s...gnitnacs..blusted.....pilafeldrig..enquireddetnawnu...\n",
1270 "e....nutmegs.t..telbanimret...e..tseikwagewoodpeckerstirwas.b.r...picksn...ylhsiroobsuspectingsexevd\n",
1271 "cgnittacdliw..isuoniallivsegas.lrafts.y.vcs..demrofsnart.mla...e.c....e..fannysdiscrimination.oe..e.\n",
1272 "nnytima.wharfrep.stswashbucklersw....m.eos...noprat....ao.rs....t.h..m.relabele..sss...b.sc.ts..vb.s\n",
1273 "eid..desivedaia.shegdtg.gniyugys.o..a.rme.gpantedsobeysodgm.a....t.osabound...s.bttp...uje.orhd.boe.\n",
1274 "tverediw...dtlw.eiar.ehacrierhsrmccosiant.nbestridi..sreepegarotedadr.slaropauses..e..rdis.oteia.lld\n",
1275 "nardd.p...itli.i.pesu.srwe...ciuuhfsnti.sgingivitislubl.fotkcuhs..rmsensitisedeu...eleygbutsiyjcf.u.\n",
1276 "eerne.u..aiin.r.i.nset.ioku..taeia.gods.e.n..dh.n.emld.r.lht.hobnobsi.s..l.c.trs...jnb.ieoizw.llka.f\n",
1277 "shiense.nhae.s.n.aietun.owig.idtrp.srsayi.w..ogu.oecnie..yo.u...whmt.t..u.a.lcds...tb.ondran.oeersa.\n",
1278 ".nhpnnktsts...g.d.cve.qe.pblohdoaseomtc.r.a.tgnrgdnaiae.spd.sc.sora...nt.r.en.no..ro...g.l..msbfdue.\n",
1279 ".asxiiasehcnerdj.moido.edsoayvebr.w.ufh.rtr.sgiaxgdekm.rtfo.k.noir.....ag.se..ur.al..sreraehsu.xnoet\n",
1280 "gr.erah.peeweeu.i.tdir..h.acc.mard..tie.u.pdeehbo.eyx.u.ralge.kucnoveltiesseirfdp..buttocksn..laodne\n",
1281 "nr.sgls..d..sdwrg.iela...c.uikise.o.altwf.i.idcbtged...poeoatsqo...gratefully..sportingsweepersaa..s\n",
1282 "iaw.bp...e.hgor.ulnnstullee.ntl.t.mttps.os..d.tienstc...nhggcst.gsugaringinsight..snifters.....cde.i\n",
1283 "nta..m..ssteno..i.eckef..b...ar..y.ieu.lpls.n.endirswu..gsiehs..n.delbaf....interpose..dsurt..r.el.u\n",
1284 "oeg..oae.usdr..kl..ecd.aiproveso..llsdsayeb.a.ra.iee.er.l.esih.ti.sllihygrellapractisedatcneea..gg.r\n",
1285 "sdeb.cziofe.r.e.d..da..rgthrive.p.agearetr.hs.stsavr..riy.srec.ar.pocketbooktrotxe.....nw.unlk..gg.b\n",
1286 "a.re.a.m.rs.espumoneb.t..o.semorhc.rnadau.istp.eehio..cpoga.sn.uuyratchetswisher.....n.se..fepc.aos.\n",
1287 "e.saf...fsrrh.a.retpada...t.....e.iggiiv.llcaam.vgnt.o.t.sidtu.pj.r.retemarapecnarussau.a.l.frpante.\n",
1288 "rretarcurne.c.g.pellagra...s...d.wni.dk.elgnaae.inusm..msgibehfedtsl..prowldenimn.shiedrka...l.il.ss\n",
1289 "n..i..leatgbt.rc..s..sesitengamedinkafgnonn.tladta.m....uentbl.aa.oeegniyartrop.eseitoobsnoleme.tpuu\n",
1290 "ub.f.lent.gri.afassevissimagingslgiryuoriit...nsahaseigodniiyelwb..upwthguorb.obmil....hfeedings..tr\n",
1291 ".a.yydne..aew.ryrri.emackintoshw.trsbnasnh.u..trksr.gasketrpc.raar..ptereinterpretingie....deggiwtnp\n",
1292 ".s..nyl...raslitloeett.splinesobtih.gnlgtkt.r.ealwasset....usu.bvgi..eej......rtss.dnrtonnaccords.oa\n",
1293 ".ihikers..bkawa.rtssrao...gc.r.yek..ues..rhn.ennaob.gmovers.bid.riwcsketches.esar.etsi.gswollefdebcs\n",
1294 ".leticilli.zaen..uftsrnv..log..dils.rrc..noau.nitrlbr.eidrib.iwa.irea..st...ieiadxe.n.lrolocsid....s\n",
1295 "sr...m....edl.s...loyeage.ap...e.pc....h..ilk.am.roouevilamsidv.r.e.gt..ge.gfdeaer.s.ygnideerbnquoit\n",
1296 "reprobatesdiyruovasbs.d.oddu..hks..h.s..e..kliee.uoae.lairetsigamt.r..e..nneedmsp.t.p.incisesuhctulc\n",
1297 "s.vr.t.sdld..s.controllablel.s.aleavese..l..s..s.btrshalvesylsuougibma.s.sim.pgo.avhshortensr.zzazip\n",
1298 ".ebae.oliedpmsuesilangisg..a..hc.zingsyy..oqueryingdoreopened..endless...l.bs.lrlsnikskcub.t..knifed\n",
1299 "jiklruons.lefilbsnwodwohsn.ttupnit..tdretsenohl..cvsm...gnimirgnidaetsemoh..baamongst..y.wucustomers\n",
1300 "doionfgh.a.lsotej.....e.h.iee...gniretnuas..s..o.oa.e.g.r...snoitulos.selppitue..w...io.trrbfruits..\n",
1301 ".eydj.g.n..i.iutvosplithsejlhp.s.eieinveighing..mnl.rlbu..pineapple....a.f.e.nsrealiseadel.ar.eevell\n",
1302 "r.ertu.e..gc..dleoi....htiiyi.m.avr..transducers.fe.aatempts.b.....d.n.f.ud.t.scales.r.tr.aopinion.l\n",
1303 ".d.yoveterinaryoenrn..a.bapg.wjuin..psalmist.x...innlenvd...iebrashereat.ne...snaeco..aeiide.ps...ii\n",
1304 "..pb.dtacosei.l.sr.gim.b.eb.ho.nrideraems....opa.dcdri.ie..n.lv.sc.k.kweent.outsmartedwl.oaef.ek..mb\n",
1305 "feweste....p.v.a.p..enisreesbtg..t.h.e.k.tt..bem.eecas.lpggday.ipmrn.akrqeasedoberofmrr.l.nhp..de.pn\n",
1306 "dy.sighting...o.spalfngsd..b.cellistott.nscc.hdesshlhe.leinde.aas.ea.ewnulcsekytmrg.oa..co..la...tao\n",
1307 ".ddr..object...r.aehg.ee..ipr......degmreioascontrrits.an.oieinw.umlzwaoa.iss..i.netu.midictatorialo\n",
1308 ".e.em..muiretcab.sn.rnh.gnoigimletslry.denreftmdie.trsygdm.rssvsealplyrobcll.gx.i.egusnm..b.c.ps..ap\n",
1309 ".pstekcolsopyh..s...schngpsteppes.esoadwcaib.aesvsrhiiree.iprikvrc.l.ydniapisenb.banaoicar.yagr...ss\n",
1310 "ep.sew......macinimin.islp..s....xrpaotoirdf.mto.eoomharntse.elti.a.a.eslrxarebiajdahvalaslprnoarbez\n",
1311 "so.ykbongothistlektass.iidsreg..e.ia.lreogaiweevilgg..n.tagrw.ia.d.r..s.ioemsoinsa.pnnavtr.adidllucs\n",
1312 "il.oloverwhelmednilni.neegee.cnd.as.mduvrch.n.r..lurd.oarnasenilesab..t.tul.stkxuie.ctesae.rigd.....\n",
1313 "rp..y.......l..ivbal.nrigdn.l.ni.n.damava..t.g...seaeyi.ik..se...rtheoryysab.shnolreeril.edknniesohw\n",
1314 "oproponents.etli.kacotr.in.o.t.en.innsidu...relruc.pgetge.d.lciportosi...ega.itgeplpyautge.egon.ar..\n",
1315 "ecaudalyokelrst.ynoiif.l.piklstsrrtf.aenvoyeuristichnludta.b.se.i.ngnirabrer.entuleaugsno.gd.rgdlibd\n",
1316 "h..configurationontnt.g...omr.toteo.fsg.g..stsefni.yora.psa.t.l.msa.....e.rbd.sseol.e.at.x.dwhesieee\n",
1317 "tpalsy.r..c.e..ivcsrscinap.tma.irsfm.uliuqnartoday..racp.neo..u.plncaninev.eg.eduynr.rg.e.ieat.lgngp\n",
1318 "..fleshyuk.s.dteeme.eruptingtah.lhir.gm.r.contrastedhbe.ugni..p.uei.yamsidad.nreal..r.ny.rrntc.antoy\n",
1319 "....yogins..earnis..ripeness.edsmethe.na.bsromalgte.trr.ni..k.m.lemigfieryed..iwvtta.wia.hnis.ss.eth\n",
1320 "nonhuman..knnsnte...e...cupolargiitapt.igreideew.s.re.pie....oaespo.nrcb.y.ke.wlfiee.hdws.p...mu.d..\n",
1321 "bywords...osiohme..estnemegagnedlnstcon.ya...primessn.mshockerhleyd..sehe.t.ssealra.daua.s....ar....\n",
1322 "outlastedt.ocsb.c.x....enilefileeavgotsi.lrfordssgt..ettautnessbdebbadieil.p.ur.po.w.lle......oe.k.g\n",
1323 "ddetsyrte.n..l.gnp.esuccocddypl.ppdeisi..rlpimplyn..ecg..dsuitcases.a.ksnfl.mdtnekrahecs.etsawfpn.cn\n",
1324 "iawaitss.s..e.a.e..lp....euhauwpi.udrv.ve..er.a..udt..as.se...ctlocn.c.ltifsretaehcc.rnempollenag.ii\n",
1325 "essertsimdaehrsci.gdr...tstrcocrn.stesidi..ejs...o.e..erq..lt.i.akaco.ksussocondoretsaocno....tdnnls\n",
1326 "s.rettab.es.rptgc.ide..itaeidodohb.cynen.sn.o....y..vrcua..uclb.earhgiyhla.hn..lebil..c..ak..senioli\n",
1327 "retsim.tlu.eoo.rssfaa.xsendns.ehoqa.oeesgdtpmoppets.ueeu.moseyu.cygan.tlaib..detoormoisterpe.l.olial\n",
1328 "......hbbdtpr..inmt.desrtaetjhpilu.rlrtdsso.derunettceirltesl.csneofis.aenssregnifrettub...od.asbtha\n",
1329 "sfeergalebia.f.noui.iobattlae.ebei.bdwe..r..os...gpoz.orslsl.le.odefdr..tvdn...adjectivess.dr.geaapr\n",
1330 "....isitultscrbdccn.n.lelipa.gnime..is.dp....we..ane.b..toi..bikc.sener..ii.eslays.rp..c.du..pagnr.t\n",
1331 "f..limocleiasoaegsgignduear..udtut.l...gambol.nsrv.ib.o.re.ni..mupfdete..ysa.t....ea.oa..fetm.taeu.n\n",
1332 "o.ideokoslb.ewnr.nrso.psnss.reeifelatrinems....ei..etb.s..rvg...ol..rtc.y.lin.u..t.lsne.cp.tceeyypte\n",
1333 "owd.mel.ear.isir.eipeatsenye.snvfr..latticeworkndlrfesgnihsalpslagf.suunsprlv...u..otk.tardslassgpcc\n",
1334 "t.yltd.dl.e.hysam.uhtl.so.tm.scelcascadinghl..c.asiyrse.vexed.tsng.fshpaslpua..c.oasislliiumtocsguie\n",
1335 "wynifnpseydscetdso.acyyi.e..i.elihslanifbstsle.r.vevrycv.....rhi.ne.tsetoahdstaupset..eascae.rj.isvd\n",
1336 "euamrae.sliuraeicccecnttmstner.yn.st....olansonsade.ieeoi...oeo..i.ga.rubqyaito..deposittdaat.a.wael\n",
1337 "apmeitr.ussrarra..aaraiosgy...g.g.gie...tewor.wart.n.cbrfd.odds.hrpnb.ar.usddlltpoesyrr.js.l...wt.he\n",
1338 "rpisasmtoutgid.l..ilctnl.nabiopsy.gnbi..cwsii.gepei.g..u.fn.ee.cseiimptaweiecoae..s.euyu...ynominees\n",
1339 ".ictrsiarorerr..gdiipoi.fiwgnilratsnibu.hortcgn.saef.e.rtslrre.lcknlooelahcka.rvre.isdraeslather...r\n",
1340 "yekopuspalirtu.eenf.re.m.nbslartueneiloqebeakoihstlhi.ru...ap.aaonilculirskrs..nnsntaarttdetcartsbao\n",
1341 ".s.n.bsrclcyamnmei.h.pl..nu.deniapeptllns.kvslky.mymce.fs.mawussrane.nasdaiut.ylsasetmae.canoes.oe.m\n",
1342 "...e.oio.at.ptmrt.c..r...estappinggp.odos.cahfnm..imi.dfl.c.gtudihgv.cieiunlerugpshietetniksgipdnt..\n",
1343 "flierroo.cs.liac.gunfire.pwhimsd..aa..grr.ucasue...rmn.lis.hidu.n..i.etdnqgerfoceaodidsdewotwokrgals\n",
1344 "latconnm.f.e..epaimedc...deducesddshs..aunfx..rn....kugie.tgdl..g..n..y.g.nawn.krnilse.snoopingisgil\n",
1345 "obmibsss..asir..l..a.eeviecerggee.em....ecue..tstoadspynveael....resonantgtan.ugseiti.ruolev...freao\n",
1346 "u..gdarnsspegniciee.sylbatonarpgfhrsodomychaiserelbmuh.grtnsstseebedliw.o.la.p..ncmpr.enrapturetertv\n",
1347 "t...rd...oncc.t.srnclennut.cainoaap...od..bfrolics.k....o.rosseforp...brazzesb.laopa.eseifidoc.elgee\n",
1348 "v...ee..o..ooe.eslsth.ke...drarnwan.l.es..a...sc.liatesrohc.sdellennekgi..s.u.af.albtkn...clawsrigrn\n",
1349 "o..bdbyc....krsindekyasa..etredsdodi.l.re.l..tgo.nobscuredhh..securere..al.c.nsfn.iace.i.coupledoanl\n",
1350 "t.mei.si..maximaltedynn.sdstss.doem.iebe.dm.n.nng.gnippohca....m....dt..eso.dnes.a.operpetuatingbo.i\n",
1351 "eegggclassroomss...ral.t.pssp.ewbidtlelpd.yedoic.g.....s.dnm..otopaetn.t.lsmov..sfh.s.piling....i..e\n",
1352 "dahh.n...h..pecnarpeeti.yeeredsrte.ere.e..mdepkrn.np....iucsun..ae...eotisaie..eis.ey.rknittings..br\n",
1353 "rt.eenickinglfy...l.rdig..ie.neet.cev.ha.eo.naceo.wispsenme.eie.gr..lmncertrntdxs.bdpsao.tokenismda.\n",
1354 "...dla.g..i.oar.cc.e.onchnn.ktihttfi.s.lgg.lwqitcp.en.rpttmt.ldnn.ti.i.bkii.hgeamyseprzk.r..mld.e.l.\n",
1355 ".vwkibp.a.n.wlo.ifg..g.ugtw.afglrtr.i..nwpa.auleae.crorpoaaek.ueo.ssoai.ds.a.ryognhkaaec..euye.ce.ad\n",
1356 "..ai.nmseph.msvsta..st.qh.ow.iiirden..iornp.pes.ec.eboigarxcrld.tslp.r.ahsw.sitsra.ortde..svt.a.ndne\n",
1357 "b.rl.inacae.aeatel.yortuetl.l.fn.irr.rooe..e.s..dcv.vuytireypii.i.a.c.rlessdnoluvy.pcsggsidaim.aoect\n",
1358 "u.loi.rerrr.nssacs.tuoaac.bp.y..iuakfdpr..egatsopasetznlapsni.nmf.zs.tynctrgrato..c.so.in.repnr.rbet\n",
1359 "tgibps.idceott.nsi.ittnrntnalaesfsnnseysword.c..lrdedoygst.lrnggisi.xaoinoscvrcharsa.cngmesiamn.kkdu\n",
1360 "tnkye.e.uusel..cat.lh.aaa.legabnaei.r...kinderou.y.pler.lksleeg.e.eevtteleaeezzaipddpis.nmntfgfo.csp\n",
1361 "eietd..mpqankffh.yaie.gnt.....use.gallivants..ic.l.uydpuner.uyttdysinadlcrove....ee.tslu.geuijnrcipt\n",
1362 "rbred..peri.usoe.srbayetimikespl.debrutrepnu.n.rkl.mb.npsera.fosm.dimieiscovsrd.vtyr.om...l..fioisiu\n",
1363 "nbisl.e.or.a..rs.eoastrireitliugselttit.....g..e.u.pr..iadmsbnemil.gcrt..siepeclrrapteswovasidfvcgro\n",
1364 "uupcer.o..y.d.gtstulte.ne...rtsicitnamoraincoatk.bfearedkhayyeutycacyc.hwlgrc.oeematr...vended.ei.i.\n",
1365 "trxrm.msinimefe.tani.i.ih..i.....edutingamsnoynac..decay..ceagd.ara.a.celnie.vsndwo...pinup...l.dntd\n",
1366 "sgeosdrenblurbscalda.o.nn.n..cimonoxatkinetic..e....narks.k.rl..pl.r.teaihe.eer.pwryly...tubes.e..g.\n",
1367 "..saesuohdraug..ie.v.m.gig.ycnangiop.tawdrier..w....scallopedsesiwp.atstcl.ddo.astelfael..bumblers..\n",
1368 ".t.krandomises..rr.a..gripestsivitcellocsbawsshapeliest..gnitontoofhylluftsaobwsocilac..located..s..\n"
1369 ]
1370 }
1371 ],
1372 "source": [
1373 "print(show_grid(g))"
1374 ]
1375 },
1376 {
1377 "cell_type": "code",
1378 "execution_count": 40,
1379 "metadata": {},
1380 "outputs": [
1381 {
1382 "ename": "KeyboardInterrupt",
1383 "evalue": "",
1384 "output_type": "error",
1385 "traceback": [
1386 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
1387 "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
1388 "\u001b[0;32m<ipython-input-40-ee86a4426dbb>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mpadding_attempts\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpad_grid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mpm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpresent_many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Attempt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpadding_attempts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'; most common is'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcollections\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmost_common\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcollections\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmost_common\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
1389 "\u001b[0;32m<ipython-input-15-ff8574b12cf0>\u001b[0m in \u001b[0;36mpresent_many\u001b[0;34m(grid, words)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mwordlen\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mwordlens\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mword\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwordlen\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mword\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mwords\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mpresences\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpresences\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
1390 "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
1391 ]
1392 }
1393 ],
1394 "source": [
1395 "padded = False\n",
1396 "padding_attempts = 0\n",
1397 "while not padded and padding_attempts < 10**6:\n",
1398 " clear_output(wait=True)\n",
1399 " padding_attempts += 1\n",
1400 " pg = pad_grid(g)\n",
1401 " pm = present_many(pg, ws)\n",
1402 " print('Attempt', padding_attempts, '; most common is', collections.Counter(p[0] for p in pm).most_common(1))\n",
1403 " if collections.Counter(p[0] for p in pm).most_common(1)[0][1] == 1:\n",
1404 " padded = True\n",
1405 " \n",
1406 "padded, collections.Counter(p[0] for p in pm).most_common(1)"
1407 ]
1408 },
1409 {
1410 "cell_type": "code",
1411 "execution_count": 43,
1412 "metadata": {
1413 "scrolled": true
1414 },
1415 "outputs": [
1416 {
1417 "name": "stdout",
1418 "output_type": "stream",
1419 "text": [
1420 "smuiclacphysicsihcnebrevilingdroskcabllupcsowygnitnacsipblustedpesnipilafeldrigclenquireddetnawnufly\n",
1421 "eqdbmnutmegsvtzdtelbanimretanmelptseikwagewoodpeckerstirwaszbdrrdypicksnzikylhsiroobsuspectingsexevd\n",
1422 "cgnittacdliwffisuoniallivsegasplraftstyevcsgcdemrofsnartrmlaydzescpopxehsfannysdiscriminationdoeypen\n",
1423 "nnytimavwharfrepjstswashbucklerswklqimkeosulxnopratpsitaoorsrtrjtthnsmxrelabelesrssstribiscutsddvbrs\n",
1424 "eidgkdesivedaiajshegdtgrgniyugyshohaabrmedgpantedsobeysodgmraoozdteosaboundgfjsmbttpygjujedorhdvboeh\n",
1425 "tverediwtczdtlwdeiaryehacrierhsrmccosiantnnbestridikysreepegarotedadrpslaropausesubepnrdissoteiailld\n",
1426 "narddypasjitligihpesubsrwewfgciuuhfsntizsgingivitislublefotkcuhschrmsensitisedeugnveleygbutsiyjcflud\n",
1427 "eernefunuaiindrsilnsethiokutttaeiapgodsteknerdhlngemldlrslhtrhobnobsizsvdlocdtrszbnjnbpieoizwillkarf\n",
1428 "shiensetnhaepslnnaietundowigvidtrptsrsayiewreogudoecniebbyofugamwhmtntwsufaulcdsmlptbeondrancoeersak\n",
1429 "onhpnnktstsdovgsdicvevqeypblohdoaseomtcdrbaatgnrgdnaiaejspdtscrsoratzdntmrgenqnomiroixqgslltmsbfduee\n",
1430 "lasxiiasehcnerdjomoidodedsoayvebrawnufhcrtrtsgiaxgdekmkrtfodkinoirfekkaagvsermuroalabsreraehsuxxnoet\n",
1431 "grderahepeeweeusiutdirnohmaccsmardrztienunpdeehbomeyxruyralgeskucnoveltiesseirfdpyebuttocksntqlaodne\n",
1432 "nrrsglsmxdupsdwrgoielalgmccuikisexoaaltwfniaidcbtgednzcpoeoatsqoszdgratefullytisportingsweepersaapys\n",
1433 "iawlbpsleeyhgorhulnnstulleemntlgtnmttpssostidstienstcbfnnhggcstegsugaringinsighthrsniftersmmfwicdeoi\n",
1434 "ntabemghsstenongideckefombnlrarlxynieuplplsznnendirswunfgsiehsuensdelbafetkzinterposexldsurtimreelhu\n",
1435 "oegleoaeiusdrixklisecdiaiprovesoatllsdsayebsawrasieeterrlaesihztixsllihygrellapractisedatcneeavgggpr\n",
1436 "sdebzczioferrsexdiadatergthrivelpdagearetrfhststsavrbyriymsrecharupocketbooktrotxextuvznwkunlkaqggtb\n",
1437 "ayrewatmerseespumonebatlnoisemorhcdrnadaubistpoeehiouxcpogaesnsuuyratchetswishereatjingsepnfepckaose\n",
1438 "eosafgcffsrrhsawretpadaspitgewuheaiggiivrllcaamkvgntrodtbsidtutpjnrgretemarapecnarussaugaylcfrpantet\n",
1439 "rretarcurneicwgnpellagraupmsixcdswniodknelgnaaetinusmlomsgibehfedtslabprowldenimnushiedrkaqndltillss\n",
1440 "ntoimlleatgbtlrcsxsehsesitengamedinkafgnonnxtladtabmvkifuentblwaaroeegniyartropieseitoobsnolemedtpuu\n",
1441 "ubqfilentigrigafassevissimagingslgiryuoriitoarnsahaseigodniiyelwblmupwthguorbkobmilkiaxhfeedingspptr\n",
1442 "nanyydnerxaewaryrriaemackintoshwftrsbnasnhsukntrksragasketrpcsraarliptereinterpretingieycoudeggiwtnp\n",
1443 "msrgnylmnkraslitloeettosplinesobtihfgnlgtktmrxealwassetpiykusurbvgijzeejgpkxclrtssfdnrtonnaccordshoa\n",
1444 "aihikersaebkawarrtssraodcrgckrpyekbruesuorhnpennaobwgmoversabidgriwcsketchesuesartetsicgswollefdebcs\n",
1445 "zleticilliozaenkfuftsrnvzylogeldilsrrrcrinoautnitrlbroeidribuiwaeireakrstmioieiadxesnnlrolocsidazdms\n",
1446 "srsyamajsmedlkssrdloyeagevapwanespcemorhucilkxamhroouevilamsidvarcemgtqggezgfdeaerosyygnideerbnquoit\n",
1447 "reprobatesdiyruovasbsidboddubehksoehnssseevklieepuoaetlairetsigamtorocevinneedmspwtnpfincisesuhctulc\n",
1448 "smvrnttsdldfysbcontrollablelfsraleaveseuslvpsavsgbtrshalvesylsuougibmaesesimcpgopavhshortensrszzazip\n",
1449 "vebaeioliedpmsuesilangisgynainhcazingsyymqoqueryingdoreopenedhsendlessasolbbsqlrlsnikskcubetbrknifed\n",
1450 "jiklruonsflefilbsnwodwohsnittupnitfstdretsenohlcrcvsmphngnimirgnidaetsemohgbbaamongstljykwucustomers\n",
1451 "doionfghfaalsotejhlrgmewhiieelbbgniretnuasuqsuiouoazeggqrhrisnoituloswselppitueaowymrioutrrbfruitspa\n",
1452 "veydjogonywisiutvosplithsejlhpesseieinveighingqymnlerlbukfpineappleeunkagfieensrealiseadelaarjeevell\n",
1453 "rkertuiegvgcbodleoievtwhtiiyiomravrsetransducersafelaatemptspbjhkrudenifiudktdscalesfratreaopinionql\n",
1454 "tddyoveterinaryoenrnedaebapgowjuiniepsalmistyxadtinnlenvdnakiebrashereatmneirdsnaecomfaeiidedpskfzii\n",
1455 "kfpbgdtacoseizlfsrfgimrblebehopnrideraemsnfhropatdcdriuieyjnilvmschkhkweentaoutsmartedwlooaefiekydmb\n",
1456 "fewestegwhcpuviacpfrenisreesbtgcktshueckfttuzbemteecaswlpggdaypipmrniakrqeasedoberofmrrqltnhphqdefpn\n",
1457 "dyesightingateonspalfngsdqfbxcellistottrnscchhdesshlhefleindegaasmeatewnulcsekytmrgyoaoecoiilanlatao\n",
1458 "hddrafobjectkatrsaehgdeertiprrzyalndegmreioascontrritspanloieinwiumlzwaoaiissziicnetuimidictatorialo\n",
1459 "renemidmuiretcabgsnwrnhegnoigimletslrywdenreftmdiectrsygdmgrssvsealplyrobcllugxxibegusnmqebycrpsguap\n",
1460 "npstekcolsopyhbnsthtschngpsteppeseesoadwcaibraesvsrhiireediprikvrcrlpydniapisenbibanaoicarlyagrflsss\n",
1461 "epksewpfsbkymacinimincislpsvsvyifxrpaotoirdfzmtoreoomharntseseltiuazaeeslrxarebiajdahvalaslprnoarbez\n",
1462 "soeykbongothistlektasssiidsregsleaiarlreogaiweevilggwznttagrwniaiddroasiioemsoinsaepnnavtrnadidllucs\n",
1463 "illoloverwhelmednilnicneegeetcndjasdmduvrchpnnrfzlurdloarnasenilesabemtdtulestkxuiepctesaerrigdekiup\n",
1464 "rpriyewmjoqxltmivbalqnrigdnglcniinfdamavaoitsgrskseaeyipikliserpcrtheoryysabushnolreerilpedknniesohw\n",
1465 "oproponentsmetliekacotroinaoltrenlinnsidutbgrelrucqpgetgemdklciportosipuaegamitgeplpyautgefegoniarcu\n",
1466 "ecaudalyokelrsttynoiifilipiklstsrrtftaenvoyeuristichnludtaqbgsewinngnirabrergentuleaugsnofgdfrgdlibd\n",
1467 "hahconfigurationontntzghhtomrbtoteorfsgyguostsefninyoranpsaqtllumsaqodnbecrbdysseoluetatzxpdwhesieee\n",
1468 "tpalsygrarcdeobivcsrscinapbtmanirsfmeuliuqnartodayebracpnneowyuaplncaninevnegxeduynrargueuieatllgngp\n",
1469 "ixfleshyukesedteemeueruptingtahmlhirugmvrccontrastedhbehugniblpsueiayamsidadinrealahrenyyrrntcwantoy\n",
1470 "fefmyoginsnnearnisieripenessjedsmethelnaabsromalgtentrrxnilrkgmjlemigfieryedopiwvttanwiafhnisrsseeth\n",
1471 "nonhumanvcknnsnteayuemsncupolargiitapthigreideewosireipieirnooaespoanrcbqygkemwlfieefhdwsppehwmubdkw\n",
1472 "bywordswjtosiohmetlestnemegagnedlnstcontyanlaprimessnbmshockerhleydesseheotossealraodauaascpraardpga\n",
1473 "outlastedtaocsbbcrxmgjeenilefileeavgotsiulrfordssgtrsettautnessbdebbadieilppfurvpopwylleemnsiuoelksg\n",
1474 "ddetsyrtemntalngnpwesuccocddyplqppdeisifmrlpimplyntzecggndsuitcaseskarksnflomdtnekrahecsuetsawfpnpcn\n",
1475 "iawaitssbskoedamenelphzijeuhauwpieudrvzvennerraytudtcpasbsencactlocnrcaltifsretaehccsrnempollenagtii\n",
1476 "essertsimdaehrsciagdrphststrcocrnvstesidiayejswheosedmerqhhltviuakacooksussocondoretsaocnofktptdnnls\n",
1477 "ssrettabiesarptgciideyhitaeidodohbvcynenmsncoesiqyvgvrcuaxauclbcearhgiyhladhniblebiluncraakussenioli\n",
1478 "retsimdtluweoolrssfaajxsendnszehoqaxoeesgdtpmoppetsgueeuamoseyumcyganhtlaibeodetoormoisterpejltolial\n",
1479 "sbtrsyhbbdtprleinmtddesrtaetjhpilusrlrtdssoqderunettceirlteslhcsneofisxaenssregnifrettubudnodgasbtha\n",
1480 "sfeergalebiamfsnouieiobattlaebebeicbdweejrruostolgpozsorslslvleiodefdrietvdniqtadjectivesswdrfgeaapr\n",
1481 "widrisitultscrbdccninelelipahgnimeqeisldpjierweqianeubcetoiwsbikcusenerqniiceslaysxrpbmcedunupagnrnt\n",
1482 "fcclimocleiasoaegsgignduearteudtutolkjugambolbnsrvyibvoxrerniipmupfdetezmysaatrcmpeatoaarfetmftaeuqn\n",
1483 "okideokoslbcewnrxnrsospsnsszreeifelatrinemsnxnaeieeetbcsiurvgiesolqsrtcjyrlinaujstelsneqcpatceeyypte\n",
1484 "owdmmeldeargisiraeipeatsenyecsnvfriilatticeworkndlrfesgnihsalpslagfosuunsprlvarnucjotkptardslassgpcc\n",
1485 "tryltdndlgeehysamtuhtlcsoitmpscelcascadinghlsiceasiyrseovexeditsnghfshpaslpuadicsoasislliiumtocsguie\n",
1486 "wynifnpseydscetdsofacyyiledfiqelihslanifbstslewrevevrycvygetxrhipnestsetoahdstaupsetxneascaearjmisvd\n",
1487 "euamraessliuraeicccecnttmstneroynlstodopolansonsadetieeoinoeoeouwiegarrubqyaitovtdeposittdaatnarwael\n",
1488 "apmeitrrussrarrazqaaraiosgypgbgagsgieunuteworpwartrnmcbrfdcoddsihrpnbearlusddlltpoesyrrtjsyljalwtghe\n",
1489 "rpisasmtoutgidqlsuilctnlgnabiopsyngnbilacwsiibgepeiogstutfnheescseiimptaweiecoaegesdeuyuyfeynominees\n",
1490 "aictrsiarorerromgdiipoirfiwgnilratsnibuohortcgnisaefzedrtslrreylcknlooelahckasrvregisdraeslatheriwhr\n",
1491 "yekopuspalirtuneenfmresmonbslartueneiloqebeakoihstlhirruqapaptaaonilculirskrsqtnnsntaarttdetcartsbao\n",
1492 "bsenobsrclcyamnmeiphrpleenufdeniapeptllnsvkvslkyamymceufsrmawussraneonasdaiutdylsasetmaeacanoesroefm\n",
1493 "ruoejoioeatwptmrtkcaarqtgestappinggprodosicahfnmolimiydflecugtudihgvocieiunlerugpshietetniksgipdntmn\n",
1494 "flierrooicsrliacagunfirejpwhimsdphaatngrreucasueufnrmnilisihiduinnlibetdnqgerfoceaodidsdewotwokrgals\n",
1495 "latconnmtfoessepaimedcsatdeducesddshsvvaunfxnsrnvgszkugiettgdldtgrqnhqykgdnawnekrnilseisnoopingisgil\n",
1496 "obmibsssylasirralfpameeviecerggeesemrbegecuebvtstoadspynveaelmhdiresonantgtanaugseitiiruolevtizfreao\n",
1497 "uppgdarnsspegnicieersylbatonarpgfhrsodomychaiserelbmuhvgrtnsstseebedliwmoqlarpobncmpryenrapturetertv\n",
1498 "tvawrdzsponccwtfsrnclennutrcainoaapnbhodepbfrolicsaktziuogrosseforpqfdbrazzesbolaopaneseifidocselgee\n",
1499 "vesjeegvojmooeoeslsthukexwudrarnwanxlkestjacvhscgliatesrohcqsdellennekgiqnslueafsalbtkncttclawsrigrn\n",
1500 "ozpbdbycrenekrsindekyasascetredsdodislbrejlrstgocnobscuredhhabsecurerechaliconsfnciacesixcoupledoanl\n",
1501 "tlmeicsihqmaximaltedynnwsdstssldoemtiebeedmdnbnngvgnippohcaeetsmespodtfmesosdnesjaloperpetuatingbosi\n",
1502 "eegggclassroomssniiralitlpsspsewbidtlelpduyedoicsgumgwfswdnmgfotopaetnrtvlsmovrnsfhfsmpilingcppuiafe\n",
1503 "dahhjnprnhwepecnarpeetixyeeredsrtezeredeldmdepkrnmnpqfgsiucsunneaegsueotisaiecreisueyirknittingsbdbr\n",
1504 "rtyeenickinglfygenlxrdigwsievneetfcevthaeeolnaceoiwispsenmedeielgrwblmncertrntdxsibdpsaostokenismdad\n",
1505 "aeedlafgiuigoarnccgezonchnnlktihttfiasllggalwqitcpcencrpttmteldnnutixisbkiilhgeamyseprzkmrhnmldneild\n",
1506 "tvwkibpeatnhwlozifgiigdugtwoafglrtrwizsnwpaiauleaencrorpoaaekiueoissoaihdszanryognhkaaeccceuyegcehad\n",
1507 "ifaitnmsephymsvstaxfstrqhlowziiirdendhiornplpesyecbeboigarxcrldhtslpgrnahswasitsraiortdemysvtjaindne\n",
1508 "berlyinacaepaeateliyortuetlclofnsirrdrooerleystfdcvlvuytireypiiaidamcyrlessdnoluvyzpcsggsidaimraoect\n",
1509 "unloijrerrrcnssacsetuoaaccbpdymciuakfdpreuegatsopasetznlapsnirnmfkzsztynctrgratoeectsoainarepnrmrbet\n",
1510 "tgibpsridceottensigittnrntnalaesfsnnseysworddcgtlrdedoygstrlrnggisimxaoinoscvrcharsapcngmesiamnmkkdu\n",
1511 "tnkyeuejuuselpscatelhdaaarlegabnaeimriohkinderouaydplerylksleegheueevtteleaeezzaipddpismnmntfgfowcsp\n",
1512 "eietdrimpqankffhpyaietgntwtyrbusesgallivantsdyicelxuydpunerjuyttdysinadlcrovejtloeeitsludgeuijnrcipt\n",
1513 "rbredgyperimusoejsrbayetimikesplkdebrutrepnumnbrklwmbanpserahfosmtdimieiscovsrdrvtyraomissluafioisiu\n",
1514 "nbisluelornaaorsteoastrireitliugselttitndxadgsweiufpreiiadmsbnemilqgcrtrnsiepeclrrapteswovasidfvcgro\n",
1515 "uupceraowdyedtgtstulteoneucertsicitnamoraincoatkubfearedkhayyeutycacyclhwlgrcjoeematrvilvendedaeisin\n",
1516 "trxrmgmsinimefestaniridihueiokfkdedutingamsnoynacqndecayswceagdoarakagcelniesvsndwomagpinupjyrlfdntd\n",
1517 "sgeosdrenblurbscaldahomnnoncncimonoxatkineticrseqorhnarksokurlsqplrreteaiheeeerepwrylykpdtubesuerogi\n",
1518 "qmsaesuohdraugzuiecvemsgigtycnangiopatawdrieroawjsonscallopedsesiwpratstclfddoiastelfaelihbumblersru\n",
1519 "itekrandomisessvrraayrgripestsivitcellocsbawsshapeliestmjgnitontoofhylluftsaobwsocilacidlocatedlrsee\n"
1520 ]
1521 }
1522 ],
1523 "source": [
1524 "_, _, pg, _ = read_wordsearch('huge-wordsearch.txt')\n",
1525 "pg = [[c for c in row] for row in pg]\n",
1526 "print(show_grid(pg))"
1527 ]
1528 },
1529 {
1530 "cell_type": "code",
1531 "execution_count": 222,
1532 "metadata": {},
1533 "outputs": [
1534 {
1535 "data": {
1536 "text/plain": [
1537 "249"
1538 ]
1539 },
1540 "execution_count": 222,
1541 "metadata": {},
1542 "output_type": "execute_result"
1543 }
1544 ],
1545 "source": [
1546 "padding_attempts"
1547 ]
1548 },
1549 {
1550 "cell_type": "code",
1551 "execution_count": 56,
1552 "metadata": {},
1553 "outputs": [
1554 {
1555 "data": {
1556 "text/plain": [
1557 "851"
1558 ]
1559 },
1560 "execution_count": 56,
1561 "metadata": {},
1562 "output_type": "execute_result"
1563 }
1564 ],
1565 "source": [
1566 "dws = decoys(pg, ws, ws_words, limit=2000, min_word_len=5)\n",
1567 "len(dws)"
1568 ]
1569 },
1570 {
1571 "cell_type": "code",
1572 "execution_count": 231,
1573 "metadata": {
1574 "scrolled": true
1575 },
1576 "outputs": [
1577 {
1578 "name": "stdout",
1579 "output_type": "stream",
1580 "text": [
1581 "smuiclacphysicsihcnebrevilingdroskcabllupcsowygnitnacsipblustedpesnipilafeldrigclenquireddetnawnufly\n",
1582 "eqdbmnutmegsvtzdtelbanimretanmelptseikwagewoodpeckerstirwaszbdrrdypicksnzikylhsiroobsuspectingsexevd\n",
1583 "cgnittacdliwffisuoniallivsegasplraftstyevcsgcdemrofsnartrmlaydzescpopxehsfannysdiscriminationdoeypen\n",
1584 "nnytimavwharfrepjstswashbucklerswklqimkeosulxnopratpsitaoorsrtrjtthnsmxrelabelesrssstribiscutsddvbrs\n",
1585 "eidgkdesivedaiajshegdtgrgniyugyshohaabrmedgpantedsobeysodgmraoozdteosaboundgfjsmbttpygjujedorhdvboeh\n",
1586 "tverediwtczdtlwdeiaryehacrierhsrmccosiantnnbestridikysreepegarotedadrpslaropausesubepnrdissoteiailld\n",
1587 "narddypasjitligihpesubsrwewfgciuuhfsntizsgingivitislublefotkcuhschrmsensitisedeugnveleygbutsiyjcflud\n",
1588 "eernefunuaiindrsilnsethiokutttaeiapgodsteknerdhlngemldlrslhtrhobnobsizsvdlocdtrszbnjnbpieoizwillkarf\n",
1589 "shiensetnhaepslnnaietundowigvidtrptsrsayiewreogudoecniebbyofugamwhmtntwsufaulcdsmlptbeondrancoeersak\n",
1590 "onhpnnktstsdovgsdicvevqeypblohdoaseomtcdrbaatgnrgdnaiaejspdtscrsoratzdntmrgenqnomiroixqgslltmsbfduee\n",
1591 "lasxiiasehcnerdjomoidodedsoayvebrawnufhcrtrtsgiaxgdekmkrtfodkinoirfekkaagvsermuroalabsreraehsuxxnoet\n",
1592 "grderahepeeweeusiutdirnohmaccsmardrztienunpdeehbomeyxruyralgeskucnoveltiesseirfdpyebuttocksntqlaodne\n",
1593 "nrrsglsmxdupsdwrgoielalgmccuikisexoaaltwfniaidcbtgednzcpoeoatsqoszdgratefullytisportingsweepersaapys\n",
1594 "iawlbpsleeyhgorhulnnstulleemntlgtnmttpssostidstienstcbfnnhggcstegsugaringinsighthrsniftersmmfwicdeoi\n",
1595 "ntabemghsstenongideckefombnlrarlxynieuplplsznnendirswunfgsiehsuensdelbafetkzinterposexldsurtimreelhu\n",
1596 "oegleoaeiusdrixklisecdiaiprovesoatllsdsayebsawrasieeterrlaesihztixsllihygrellapractisedatcneeavgggpr\n",
1597 "sdebzczioferrsexdiadatergthrivelpdagearetrfhststsavrbyriymsrecharupocketbooktrotxextuvznwkunlkaqggtb\n",
1598 "ayrewatmerseespumonebatlnoisemorhcdrnadaubistpoeehiouxcpogaesnsuuyratchetswishereatjingsepnfepckaose\n",
1599 "eosafgcffsrrhsawretpadaspitgewuheaiggiivrllcaamkvgntrodtbsidtutpjnrgretemarapecnarussaugaylcfrpantet\n",
1600 "rretarcurneicwgnpellagraupmsixcdswniodknelgnaaetinusmlomsgibehfedtslabprowldenimnushiedrkaqndltillss\n",
1601 "ntoimlleatgbtlrcsxsehsesitengamedinkafgnonnxtladtabmvkifuentblwaaroeegniyartropieseitoobsnolemedtpuu\n",
1602 "ubqfilentigrigafassevissimagingslgiryuoriitoarnsahaseigodniiyelwblmupwthguorbkobmilkiaxhfeedingspptr\n",
1603 "nanyydnerxaewaryrriaemackintoshwftrsbnasnhsukntrksragasketrpcsraarliptereinterpretingieycoudeggiwtnp\n",
1604 "msrgnylmnkraslitloeettosplinesobtihfgnlgtktmrxealwassetpiykusurbvgijzeejgpkxclrtssfdnrtonnaccordshoa\n",
1605 "aihikersaebkawarrtssraodcrgckrpyekbruesuorhnpennaobwgmoversabidgriwcsketchesuesartetsicgswollefdebcs\n",
1606 "zleticilliozaenkfuftsrnvzylogeldilsrrrcrinoautnitrlbroeidribuiwaeireakrstmioieiadxesnnlrolocsidazdms\n",
1607 "srsyamajsmedlkssrdloyeagevapwanespcemorhucilkxamhroouevilamsidvarcemgtqggezgfdeaerosyygnideerbnquoit\n",
1608 "reprobatesdiyruovasbsidboddubehksoehnssseevklieepuoaetlairetsigamtorocevinneedmspwtnpfincisesuhctulc\n",
1609 "smvrnttsdldfysbcontrollablelfsraleaveseuslvpsavsgbtrshalvesylsuougibmaesesimcpgopavhshortensrszzazip\n",
1610 "vebaeioliedpmsuesilangisgynainhcazingsyymqoqueryingdoreopenedhsendlessasolbbsqlrlsnikskcubetbrknifed\n",
1611 "jiklruonsflefilbsnwodwohsnittupnitfstdretsenohlcrcvsmphngnimirgnidaetsemohgbbaamongstljykwucustomers\n",
1612 "doionfghfaalsotejhlrgmewhiieelbbgniretnuasuqsuiouoazeggqrhrisnoituloswselppitueaowymrioutrrbfruitspa\n",
1613 "veydjogonywisiutvosplithsejlhpesseieinveighingqymnlerlbukfpineappleeunkagfieensrealiseadelaarjeevell\n",
1614 "rkertuiegvgcbodleoievtwhtiiyiomravrsetransducersafelaatemptspbjhkrudenifiudktdscalesfratreaopinionql\n",
1615 "tddyoveterinaryoenrnedaebapgowjuiniepsalmistyxadtinnlenvdnakiebrashereatmneirdsnaecomfaeiidedpskfzii\n",
1616 "kfpbgdtacoseizlfsrfgimrblebehopnrideraemsnfhropatdcdriuieyjnilvmschkhkweentaoutsmartedwlooaefiekydmb\n",
1617 "fewestegwhcpuviacpfrenisreesbtgcktshueckfttuzbemteecaswlpggdaypipmrniakrqeasedoberofmrrqltnhphqdefpn\n",
1618 "dyesightingateonspalfngsdqfbxcellistottrnscchhdesshlhefleindegaasmeatewnulcsekytmrgyoaoecoiilanlatao\n",
1619 "hddrafobjectkatrsaehgdeertiprrzyalndegmreioascontrritspanloieinwiumlzwaoaiissziicnetuimidictatorialo\n",
1620 "renemidmuiretcabgsnwrnhegnoigimletslrywdenreftmdiectrsygdmgrssvsealplyrobcllugxxibegusnmqebycrpsguap\n",
1621 "npstekcolsopyhbnsthtschngpsteppeseesoadwcaibraesvsrhiireediprikvrcrlpydniapisenbibanaoicarlyagrflsss\n",
1622 "epksewpfsbkymacinimincislpsvsvyifxrpaotoirdfzmtoreoomharntseseltiuazaeeslrxarebiajdahvalaslprnoarbez\n",
1623 "soeykbongothistlektasssiidsregsleaiarlreogaiweevilggwznttagrwniaiddroasiioemsoinsaepnnavtrnadidllucs\n",
1624 "illoloverwhelmednilnicneegeetcndjasdmduvrchpnnrfzlurdloarnasenilesabemtdtulestkxuiepctesaerrigdekiup\n",
1625 "rpriyewmjoqxltmivbalqnrigdnglcniinfdamavaoitsgrskseaeyipikliserpcrtheoryysabushnolreerilpedknniesohw\n",
1626 "oproponentsmetliekacotroinaoltrenlinnsidutbgrelrucqpgetgemdklciportosipuaegamitgeplpyautgefegoniarcu\n",
1627 "ecaudalyokelrsttynoiifilipiklstsrrtftaenvoyeuristichnludtaqbgsewinngnirabrergentuleaugsnofgdfrgdlibd\n",
1628 "hahconfigurationontntzghhtomrbtoteorfsgyguostsefninyoranpsaqtllumsaqodnbecrbdysseoluetatzxpdwhesieee\n",
1629 "tpalsygrarcdeobivcsrscinapbtmanirsfmeuliuqnartodayebracpnneowyuaplncaninevnegxeduynrargueuieatllgngp\n",
1630 "ixfleshyukesedteemeueruptingtahmlhirugmvrccontrastedhbehugniblpsueiayamsidadinrealahrenyyrrntcwantoy\n",
1631 "fefmyoginsnnearnisieripenessjedsmethelnaabsromalgtentrrxnilrkgmjlemigfieryedopiwvttanwiafhnisrsseeth\n",
1632 "nonhumanvcknnsnteayuemsncupolargiitapthigreideewosireipieirnooaespoanrcbqygkemwlfieefhdwsppehwmubdkw\n",
1633 "bywordswjtosiohmetlestnemegagnedlnstcontyanlaprimessnbmshockerhleydesseheotossealraodauaascpraardpga\n",
1634 "outlastedtaocsbbcrxmgjeenilefileeavgotsiulrfordssgtrsettautnessbdebbadieilppfurvpopwylleemnsiuoelksg\n",
1635 "ddetsyrtemntalngnpwesuccocddyplqppdeisifmrlpimplyntzecggndsuitcaseskarksnflomdtnekrahecsuetsawfpnpcn\n",
1636 "iawaitssbskoedamenelphzijeuhauwpieudrvzvennerraytudtcpasbsencactlocnrcaltifsretaehccsrnempollenagtii\n",
1637 "essertsimdaehrsciagdrphststrcocrnvstesidiayejswheosedmerqhhltviuakacooksussocondoretsaocnofktptdnnls\n",
1638 "ssrettabiesarptgciideyhitaeidodohbvcynenmsncoesiqyvgvrcuaxauclbcearhgiyhladhniblebiluncraakussenioli\n",
1639 "retsimdtluweoolrssfaajxsendnszehoqaxoeesgdtpmoppetsgueeuamoseyumcyganhtlaibeodetoormoisterpejltolial\n",
1640 "sbtrsyhbbdtprleinmtddesrtaetjhpilusrlrtdssoqderunettceirlteslhcsneofisxaenssregnifrettubudnodgasbtha\n",
1641 "sfeergalebiamfsnouieiobattlaebebeicbdweejrruostolgpozsorslslvleiodefdrietvdniqtadjectivesswdrfgeaapr\n",
1642 "widrisitultscrbdccninelelipahgnimeqeisldpjierweqianeubcetoiwsbikcusenerqniiceslaysxrpbmcedunupagnrnt\n",
1643 "fcclimocleiasoaegsgignduearteudtutolkjugambolbnsrvyibvoxrerniipmupfdetezmysaatrcmpeatoaarfetmftaeuqn\n",
1644 "okideokoslbcewnrxnrsospsnsszreeifelatrinemsnxnaeieeetbcsiurvgiesolqsrtcjyrlinaujstelsneqcpatceeyypte\n",
1645 "owdmmeldeargisiraeipeatsenyecsnvfriilatticeworkndlrfesgnihsalpslagfosuunsprlvarnucjotkptardslassgpcc\n",
1646 "tryltdndlgeehysamtuhtlcsoitmpscelcascadinghlsiceasiyrseovexeditsnghfshpaslpuadicsoasislliiumtocsguie\n",
1647 "wynifnpseydscetdsofacyyiledfiqelihslanifbstslewrevevrycvygetxrhipnestsetoahdstaupsetxneascaearjmisvd\n",
1648 "euamraessliuraeicccecnttmstneroynlstodopolansonsadetieeoinoeoeouwiegarrubqyaitovtdeposittdaatnarwael\n",
1649 "apmeitrrussrarrazqaaraiosgypgbgagsgieunuteworpwartrnmcbrfdcoddsihrpnbearlusddlltpoesyrrtjsyljalwtghe\n",
1650 "rpisasmtoutgidqlsuilctnlgnabiopsyngnbilacwsiibgepeiogstutfnheescseiimptaweiecoaegesdeuyuyfeynominees\n",
1651 "aictrsiarorerromgdiipoirfiwgnilratsnibuohortcgnisaefzedrtslrreylcknlooelahckasrvregisdraeslatheriwhr\n",
1652 "yekopuspalirtuneenfmresmonbslartueneiloqebeakoihstlhirruqapaptaaonilculirskrsqtnnsntaarttdetcartsbao\n",
1653 "bsenobsrclcyamnmeiphrpleenufdeniapeptllnsvkvslkyamymceufsrmawussraneonasdaiutdylsasetmaeacanoesroefm\n",
1654 "ruoejoioeatwptmrtkcaarqtgestappinggprodosicahfnmolimiydflecugtudihgvocieiunlerugpshietetniksgipdntmn\n",
1655 "flierrooicsrliacagunfirejpwhimsdphaatngrreucasueufnrmnilisihiduinnlibetdnqgerfoceaodidsdewotwokrgals\n",
1656 "latconnmtfoessepaimedcsatdeducesddshsvvaunfxnsrnvgszkugiettgdldtgrqnhqykgdnawnekrnilseisnoopingisgil\n",
1657 "obmibsssylasirralfpameeviecerggeesemrbegecuebvtstoadspynveaelmhdiresonantgtanaugseitiiruolevtizfreao\n",
1658 "uppgdarnsspegnicieersylbatonarpgfhrsodomychaiserelbmuhvgrtnsstseebedliwmoqlarpobncmpryenrapturetertv\n",
1659 "tvawrdzsponccwtfsrnclennutrcainoaapnbhodepbfrolicsaktziuogrosseforpqfdbrazzesbolaopaneseifidocselgee\n",
1660 "vesjeegvojmooeoeslsthukexwudrarnwanxlkestjacvhscgliatesrohcqsdellennekgiqnslueafsalbtkncttclawsrigrn\n",
1661 "ozpbdbycrenekrsindekyasascetredsdodislbrejlrstgocnobscuredhhabsecurerechaliconsfnciacesixcoupledoanl\n",
1662 "tlmeicsihqmaximaltedynnwsdstssldoemtiebeedmdnbnngvgnippohcaeetsmespodtfmesosdnesjaloperpetuatingbosi\n",
1663 "eegggclassroomssniiralitlpsspsewbidtlelpduyedoicsgumgwfswdnmgfotopaetnrtvlsmovrnsfhfsmpilingcppuiafe\n",
1664 "dahhjnprnhwepecnarpeetixyeeredsrtezeredeldmdepkrnmnpqfgsiucsunneaegsueotisaiecreisueyirknittingsbdbr\n",
1665 "rtyeenickinglfygenlxrdigwsievneetfcevthaeeolnaceoiwispsenmedeielgrwblmncertrntdxsibdpsaostokenismdad\n",
1666 "aeedlafgiuigoarnccgezonchnnlktihttfiasllggalwqitcpcencrpttmteldnnutixisbkiilhgeamyseprzkmrhnmldneild\n",
1667 "tvwkibpeatnhwlozifgiigdugtwoafglrtrwizsnwpaiauleaencrorpoaaekiueoissoaihdszanryognhkaaeccceuyegcehad\n",
1668 "ifaitnmsephymsvstaxfstrqhlowziiirdendhiornplpesyecbeboigarxcrldhtslpgrnahswasitsraiortdemysvtjaindne\n",
1669 "berlyinacaepaeateliyortuetlclofnsirrdrooerleystfdcvlvuytireypiiaidamcyrlessdnoluvyzpcsggsidaimraoect\n",
1670 "unloijrerrrcnssacsetuoaaccbpdymciuakfdpreuegatsopasetznlapsnirnmfkzsztynctrgratoeectsoainarepnrmrbet\n",
1671 "tgibpsridceottensigittnrntnalaesfsnnseysworddcgtlrdedoygstrlrnggisimxaoinoscvrcharsapcngmesiamnmkkdu\n",
1672 "tnkyeuejuuselpscatelhdaaarlegabnaeimriohkinderouaydplerylksleegheueevtteleaeezzaipddpismnmntfgfowcsp\n",
1673 "eietdrimpqankffhpyaietgntwtyrbusesgallivantsdyicelxuydpunerjuyttdysinadlcrovejtloeeitsludgeuijnrcipt\n",
1674 "rbredgyperimusoejsrbayetimikesplkdebrutrepnumnbrklwmbanpserahfosmtdimieiscovsrdrvtyraomissluafioisiu\n",
1675 "nbisluelornaaorsteoastrireitliugselttitndxadgsweiufpreiiadmsbnemilqgcrtrnsiepeclrrapteswovasidfvcgro\n",
1676 "uupceraowdyedtgtstulteoneucertsicitnamoraincoatkubfearedkhayyeutycacyclhwlgrcjoeematrvilvendedaeisin\n",
1677 "trxrmgmsinimefestaniridihueiokfkdedutingamsnoynacqndecayswceagdoarakagcelniesvsndwomagpinupjyrlfdntd\n",
1678 "sgeosdrenblurbscaldahomnnoncncimonoxatkineticrseqorhnarksokurlsqplrreteaiheeeerepwrylykpdtubesuerogi\n",
1679 "qmsaesuohdraugzuiecvemsgigtycnangiopatawdrieroawjsonscallopedsesiwpratstclfddoiastelfaelihbumblersru\n",
1680 "itekrandomisessvrraayrgripestsivitcellocsbawsshapeliestmjgnitontoofhylluftsaobwsocilacidlocatedlrsee\n"
1681 ]
1682 }
1683 ],
1684 "source": [
1685 "print(show_grid(pg))"
1686 ]
1687 },
1688 {
1689 "cell_type": "code",
1690 "execution_count": 57,
1691 "metadata": {},
1692 "outputs": [
1693 {
1694 "data": {
1695 "text/plain": [
1696 "2000"
1697 ]
1698 },
1699 "execution_count": 57,
1700 "metadata": {},
1701 "output_type": "execute_result"
1702 }
1703 ],
1704 "source": [
1705 "len(dws) + len(ws)"
1706 ]
1707 },
1708 {
1709 "cell_type": "code",
1710 "execution_count": 58,
1711 "metadata": {},
1712 "outputs": [
1713 {
1714 "data": {
1715 "text/plain": [
1716 "2000"
1717 ]
1718 },
1719 "execution_count": 58,
1720 "metadata": {},
1721 "output_type": "execute_result"
1722 }
1723 ],
1724 "source": [
1725 "len(set(dws + ws))"
1726 ]
1727 },
1728 {
1729 "cell_type": "code",
1730 "execution_count": 59,
1731 "metadata": {},
1732 "outputs": [
1733 {
1734 "data": {
1735 "text/plain": [
1736 "[]"
1737 ]
1738 },
1739 "execution_count": 59,
1740 "metadata": {},
1741 "output_type": "execute_result"
1742 }
1743 ],
1744 "source": [
1745 "[(a, b) for a in (dws + ws) for b in (dws + ws) if a != b if a in b]"
1746 ]
1747 },
1748 {
1749 "cell_type": "code",
1750 "execution_count": 60,
1751 "metadata": {
1752 "collapsed": true
1753 },
1754 "outputs": [],
1755 "source": [
1756 "with open('huge-wordsearch.txt', 'w') as f:\n",
1757 " f.write('{}x{}\\n'.format(len(pg[0]), len(pg)))\n",
1758 " f.write(show_grid(pg))\n",
1759 " f.write('\\n')\n",
1760 " f.write(lcat(sorted(ws + dws)))"
1761 ]
1762 },
1763 {
1764 "cell_type": "code",
1765 "execution_count": 49,
1766 "metadata": {},
1767 "outputs": [
1768 {
1769 "ename": "KeyboardInterrupt",
1770 "evalue": "",
1771 "output_type": "error",
1772 "traceback": [
1773 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
1774 "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
1775 "\u001b[0;32m<ipython-input-49-fb03040cf2cc>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mpm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpresent_many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mpold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mws\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpresent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpold\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
1776 "\u001b[0;32m<ipython-input-49-fb03040cf2cc>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mpm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpresent_many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mpold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mw\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mws\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpresent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpold\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
1777 "\u001b[0;32m<ipython-input-14-f0d9284571d1>\u001b[0m in \u001b[0;36mpresent\u001b[0;34m(grid, word)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mDirection\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mword\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mDirection\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
1778 "\u001b[0;32m<ipython-input-8-a5adda74be28>\u001b[0m in \u001b[0;36mgslice\u001b[0;34m(grid, r, c, l, d)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
1779 "\u001b[0;32m<ipython-input-7-e0e67252b972>\u001b[0m in \u001b[0;36mindices\u001b[0;34m(grid, r, c, l, d)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mdr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdelta\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0minds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mdr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mdc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m return [(i, j) for i, j in inds\n",
1780 "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
1781 ]
1782 }
1783 ],
1784 "source": [
1785 "pm = present_many(g, ws)\n",
1786 "pold = [w for w in ws if present(g, w)[0]]\n",
1787 "len(pm), len(pold)"
1788 ]
1789 },
1790 {
1791 "cell_type": "code",
1792 "execution_count": null,
1793 "metadata": {},
1794 "outputs": [],
1795 "source": [
1796 "ppm = present_many(pg, ws)\n",
1797 "ppold = [w for w in ws if present(pg, w)[0]]\n",
1798 "len(ppm), len(ppold)"
1799 ]
1800 },
1801 {
1802 "cell_type": "code",
1803 "execution_count": 236,
1804 "metadata": {
1805 "scrolled": true
1806 },
1807 "outputs": [
1808 {
1809 "name": "stdout",
1810 "output_type": "stream",
1811 "text": [
1812 "smuiclacphysics.hcnebrevilingd..skcabllup.s...gnitnacs..blusted.....pilafeldrig..enquireddetnawnu...\n",
1813 "e....nutmegs.t..telbanimret...e..tseikwagewoodpeckerstirwas.b.r...picksn...ylhsiroobsuspectingsexevd\n",
1814 "cgnittacdliw..isuoniallivsegas.lrafts.y.vcs..demrofsnart.mla...e.c....e..fannysdiscrimination.oe..e.\n",
1815 "nnytima.wharfrep.stswashbucklersw....m.eos...noprat....ao.rs....t.h..m.relabele..sss...b.sc.ts..vb.s\n",
1816 "eid..desivedaia.shegdtg.gniyugys.o..a.rme.gpantedsobeysodgm.a....t.osabound...s.bttp...uje.orhd.boe.\n",
1817 "tverediw...dtlw.eiar.ehacrierhsrmccosiant.nbestridi..sreepegarotedadr.slaropauses..e..rdis.oteia.lld\n",
1818 "nardd.p...itli.i.pesu.srwe...ciuuhfsnti.sgingivitislubl.fotkcuhs..rmsensitisedeu...eleygbutsiyjcf.u.\n",
1819 "eerne.u..aiin.r.i.nset.ioku..taeia.gods.e.n..dh.n.emld.r.lht.hobnobsi.s..l.c.trs...jnb.ieoizw.llka.f\n",
1820 "shiense.nhae.s.n.aietun.owig.idtrp.srsayi.w..ogu.oecnie..yo.u...whmt.t..u.a.lcds...tb.ondran.oeersa.\n",
1821 ".nhpnnktsts...g.d.cve.qe.pblohdoaseomtc.r.a.tgnrgdnaiae.spd.sc.sora...nt.r.en.no..ro...g.l..msbfdue.\n",
1822 ".asxiiasehcnerdj.moido.edsoayvebr.w.ufh.rtr.sgiaxgdekm.rtfo.k.noir.....ag.se..ur.al..sreraehsu.xnoet\n",
1823 "gr.erah.peeweeu.i.tdir..h.acc.mard..tie.u.pdeehbo.eyx.u.ralge.kucnoveltiesseirfdp..buttocksn..laodne\n",
1824 "nr.sgls..d..sdwrg.iela...c.uikise.o.altwf.i.idcbtged...poeoatsqo...gratefully..sportingsweepersaa..s\n",
1825 "iaw.bp...e.hgor.ulnnstullee.ntl.t.mttps.os..d.tienstc...nhggcst.gsugaringinsight..snifters.....cde.i\n",
1826 "nta..m..ssteno..i.eckef..b...ar..y.ieu.lpls.n.endirswu..gsiehs..n.delbaf....interpose..dsurt..r.el.u\n",
1827 "oeg..oae.usdr..kl..ecd.aiproveso..llsdsayeb.a.ra.iee.er.l.esih.ti.sllihygrellapractisedatcneea..gg.r\n",
1828 "sdeb.cziofe.r.e.d..da..rgthrive.p.agearetr.hs.stsavr..riy.srec.ar.pocketbooktrotxe.....nw.unlk..gg.b\n",
1829 "a.re.a.m.rs.espumoneb.t..o.semorhc.rnadau.istp.eehio..cpoga.sn.uuyratchetswisher.....n.se..fepc.aos.\n",
1830 "e.saf...fsrrh.a.retpada...t.....e.iggiiv.llcaam.vgnt.o.t.sidtu.pj.r.retemarapecnarussau.a.l.frpante.\n",
1831 "rretarcurne.c.g.pellagra...s...d.wni.dk.elgnaae.inusm..msgibehfedtsl..prowldenimn.shiedrka...l.il.ss\n",
1832 "n..i..leatgbt.rc..s..sesitengamedinkafgnonn.tladta.m....uentbl.aa.oeegniyartrop.eseitoobsnoleme.tpuu\n",
1833 "ub.f.lent.gri.afassevissimagingslgiryuoriit...nsahaseigodniiyelwb..upwthguorb.obmil....hfeedings..tr\n",
1834 ".a.yydne..aew.ryrri.emackintoshw.trsbnasnh.u..trksr.gasketrpc.raar..ptereinterpretingie....deggiwtnp\n",
1835 ".s..nyl...raslitloeett.splinesobtih.gnlgtkt.r.ealwasset....usu.bvgi..eej......rtss.dnrtonnaccords.oa\n",
1836 ".ihikers..bkawa.rtssrao...gc.r.yek..ues..rhn.ennaob.gmovers.bid.riwcsketches.esar.etsi.gswollefdebcs\n",
1837 ".leticilli.zaen..uftsrnv..log..dils.rrc..noau.nitrlbr.eidrib.iwa.irea..st...ieiadxe.n.lrolocsid....s\n",
1838 "sr...m....edl.s...loyeage.ap...e.pc....h..ilk.am.roouevilamsidv.r.e.gt..ge.gfdeaer.s.ygnideerbnquoit\n",
1839 "reprobatesdiyruovasbs.d.oddu..hks..h.s..e..kliee.uoae.lairetsigamt.r..e..nneedmsp.t.p.incisesuhctulc\n",
1840 "s.vr.t.sdld..s.controllablel.s.aleavese..l..s..s.btrshalvesylsuougibma.s.sim.pgo.avhshortensr.zzazip\n",
1841 ".ebae.oliedpmsuesilangisg..a..hc.zingsyy..oqueryingdoreopened..endless...l.bs.lrlsnikskcub.t..knifed\n",
1842 "jiklruons.lefilbsnwodwohsn.ttupnit..tdretsenohl..cvsm...gnimirgnidaetsemoh..baamongst..y.wucustomers\n",
1843 "doionfgh.a.lsotej.....e.h.iee...gniretnuas..s..o.oa.e.g.r...snoitulos.selppitue..w...io.trrbfruits..\n",
1844 ".eydj.g.n..i.iutvosplithsejlhp.s.eieinveighing..mnl.rlbu..pineapple....a.f.e.nsrealiseadel.ar.eevell\n",
1845 "r.ertu.e..gc..dleoi....htiiyi.m.avr..transducers.fe.aatempts.b.....d.n.f.ud.t.scales.r.tr.aopinion.l\n",
1846 ".d.yoveterinaryoenrn..a.bapg.wjuin..psalmist.x...innlenvd...iebrashereat.ne...snaeco..aeiide.ps...ii\n",
1847 "..pb.dtacosei.l.sr.gim.b.eb.ho.nrideraems....opa.dcdri.ie..n.lv.sc.k.kweent.outsmartedwl.oaef.ek..mb\n",
1848 "feweste....p.v.a.p..enisreesbtg..t.h.e.k.tt..bem.eecas.lpggday.ipmrn.akrqeasedoberofmrr.l.nhp..de.pn\n",
1849 "dy.sighting...o.spalfngsd..b.cellistott.nscc.hdesshlhe.leinde.aas.ea.ewnulcsekytmrg.oa..co..la...tao\n",
1850 ".ddr..object...r.aehg.ee..ipr......degmreioascontrrits.an.oieinw.umlzwaoa.iss..i.netu.midictatorialo\n",
1851 ".e.em..muiretcab.sn.rnh.gnoigimletslry.denreftmdie.trsygdm.rssvsealplyrobcll.gx.i.egusnm..b.c.ps..ap\n",
1852 ".pstekcolsopyh..s...schngpsteppes.esoadwcaib.aesvsrhiiree.iprikvrc.l.ydniapisenb.banaoicar.yagr...ss\n",
1853 "ep.sew......macinimin.islp..s....xrpaotoirdf.mto.eoomharntse.elti.a.a.eslrxarebiajdahvalaslprnoarbez\n",
1854 "so.ykbongothistlektass.iidsreg..e.ia.lreogaiweevilgg..n.tagrw.ia.d.r..s.ioemsoinsa.pnnavtr.adidllucs\n",
1855 "il.oloverwhelmednilni.neegee.cnd.as.mduvrch.n.r..lurd.oarnasenilesab..t.tul.stkxuie.ctesae.rigd.....\n",
1856 "rp..y.......l..ivbal.nrigdn.l.ni.n.damava..t.g...seaeyi.ik..se...rtheoryysab.shnolreeril.edknniesohw\n",
1857 "oproponents.etli.kacotr.in.o.t.en.innsidu...relruc.pgetge.d.lciportosi...ega.itgeplpyautge.egon.ar..\n",
1858 "ecaudalyokelrst.ynoiif.l.piklstsrrtf.aenvoyeuristichnludta.b.se.i.ngnirabrer.entuleaugsno.gd.rgdlibd\n",
1859 "h..configurationontnt.g...omr.toteo.fsg.g..stsefni.yora.psa.t.l.msa.....e.rbd.sseol.e.at.x.dwhesieee\n",
1860 "tpalsy.r..c.e..ivcsrscinap.tma.irsfm.uliuqnartoday..racp.neo..u.plncaninev.eg.eduynr.rg.e.ieat.lgngp\n",
1861 "..fleshyuk.s.dteeme.eruptingtah.lhir.gm.r.contrastedhbe.ugni..p.uei.yamsidad.nreal..r.ny.rrntc.antoy\n",
1862 "....yogins..earnis..ripeness.edsmethe.na.bsromalgte.trr.ni..k.m.lemigfieryed..iwvtta.wia.hnis.ss.eth\n",
1863 "nonhuman..knnsnte...e...cupolargiitapt.igreideew.s.re.pie....oaespo.nrcb.y.ke.wlfiee.hdws.p...mu.d..\n",
1864 "bywords...osiohme..estnemegagnedlnstcon.ya...primessn.mshockerhleyd..sehe.t.ssealra.daua.s....ar....\n",
1865 "outlastedt.ocsb.c.x....enilefileeavgotsi.lrfordssgt..ettautnessbdebbadieil.p.ur.po.w.lle......oe.k.g\n",
1866 "ddetsyrte.n..l.gnp.esuccocddypl.ppdeisi..rlpimplyn..ecg..dsuitcases.a.ksnfl.mdtnekrahecs.etsawfpn.cn\n",
1867 "iawaitss.s..e.a.e..lp....euhauwpi.udrv.ve..er.a..udt..as.se...ctlocn.c.ltifsretaehcc.rnempollenag.ii\n",
1868 "essertsimdaehrsci.gdr...tstrcocrn.stesidi..ejs...o.e..erq..lt.i.akaco.ksussocondoretsaocno....tdnnls\n",
1869 "s.rettab.es.rptgc.ide..itaeidodohb.cynen.sn.o....y..vrcua..uclb.earhgiyhla.hn..lebil..c..ak..senioli\n",
1870 "retsim.tlu.eoo.rssfaa.xsendns.ehoqa.oeesgdtpmoppets.ueeu.moseyu.cygan.tlaib..detoormoisterpe.l.olial\n",
1871 "......hbbdtpr..inmt.desrtaetjhpilu.rlrtdsso.derunettceirltesl.csneofis.aenssregnifrettub...od.asbtha\n",
1872 "sfeergalebia.f.noui.iobattlae.ebei.bdwe..r..os...gpoz.orslsl.le.odefdr..tvdn...adjectivess.dr.geaapr\n",
1873 "....isitultscrbdccn.n.lelipa.gnime..is.dp....we..ane.b..toi..bikc.sener..ii.eslays.rp..c.du..pagnr.t\n",
1874 "f..limocleiasoaegsgignduear..udtut.l...gambol.nsrv.ib.o.re.ni..mupfdete..ysa.t....ea.oa..fetm.taeu.n\n",
1875 "o.ideokoslb.ewnr.nrso.psnss.reeifelatrinems....ei..etb.s..rvg...ol..rtc.y.lin.u..t.lsne.cp.tceeyypte\n",
1876 "owd.mel.ear.isir.eipeatsenye.snvfr..latticeworkndlrfesgnihsalpslagf.suunsprlv...u..otk.tardslassgpcc\n",
1877 "t.yltd.dl.e.hysam.uhtl.so.tm.scelcascadinghl..c.asiyrse.vexed.tsng.fshpaslpua..c.oasislliiumtocsguie\n",
1878 "wynifnpseydscetdso.acyyi.e..i.elihslanifbstsle.r.vevrycv.....rhi.ne.tsetoahdstaupset..eascae.rj.isvd\n",
1879 "euamrae.sliuraeicccecnttmstner.yn.st....olansonsade.ieeoi...oeo..i.ga.rubqyaito..deposittdaat.a.wael\n",
1880 "apmeitr.ussrarra..aaraiosgy...g.g.gie...tewor.wart.n.cbrfd.odds.hrpnb.ar.usddlltpoesyrr.js.l...wt.he\n",
1881 "rpisasmtoutgid.l..ilctnl.nabiopsy.gnbi..cwsii.gepei.g..u.fn.ee.cseiimptaweiecoae..s.euyu...ynominees\n",
1882 ".ictrsiarorerr..gdiipoi.fiwgnilratsnibu.hortcgn.saef.e.rtslrre.lcknlooelahcka.rvre.isdraeslather...r\n",
1883 "yekopuspalirtu.eenf.re.m.nbslartueneiloqebeakoihstlhi.ru...ap.aaonilculirskrs..nnsntaarttdetcartsbao\n",
1884 ".s.n.bsrclcyamnmei.h.pl..nu.deniapeptllns.kvslky.mymce.fs.mawussrane.nasdaiut.ylsasetmae.canoes.oe.m\n",
1885 "...e.oio.at.ptmrt.c..r...estappinggp.odos.cahfnm..imi.dfl.c.gtudihgv.cieiunlerugpshietetniksgipdnt..\n",
1886 "flierroo.cs.liac.gunfire.pwhimsd..aa..grr.ucasue...rmn.lis.hidu.n..i.etdnqgerfoceaodidsdewotwokrgals\n",
1887 "latconnm.f.e..epaimedc...deducesddshs..aunfx..rn....kugie.tgdl..g..n..y.g.nawn.krnilse.snoopingisgil\n",
1888 "obmibsss..asir..l..a.eeviecerggee.em....ecue..tstoadspynveael....resonantgtan.ugseiti.ruolev...freao\n",
1889 "u..gdarnsspegniciee.sylbatonarpgfhrsodomychaiserelbmuh.grtnsstseebedliw.o.la.p..ncmpr.enrapturetertv\n",
1890 "t...rd...oncc.t.srnclennut.cainoaap...od..bfrolics.k....o.rosseforp...brazzesb.laopa.eseifidoc.elgee\n",
1891 "v...ee..o..ooe.eslsth.ke...drarnwan.l.es..a...sc.liatesrohc.sdellennekgi..s.u.af.albtkn...clawsrigrn\n",
1892 "o..bdbyc....krsindekyasa..etredsdodi.l.re.l..tgo.nobscuredhh..securere..al.c.nsfn.iace.i.coupledoanl\n",
1893 "t.mei.si..maximaltedynn.sdstss.doem.iebe.dm.n.nng.gnippohca....m....dt..eso.dnes.a.operpetuatingbo.i\n",
1894 "eegggclassroomss...ral.t.pssp.ewbidtlelpd.yedoic.g.....s.dnm..otopaetn.t.lsmov..sfh.s.piling....i..e\n",
1895 "dahh.n...h..pecnarpeeti.yeeredsrte.ere.e..mdepkrn.np....iucsun..ae...eotisaie..eis.ey.rknittings..br\n",
1896 "rt.eenickinglfy...l.rdig..ie.neet.cev.ha.eo.naceo.wispsenme.eie.gr..lmncertrntdxs.bdpsao.tokenismda.\n",
1897 "...dla.g..i.oar.cc.e.onchnn.ktihttfi.s.lgg.lwqitcp.en.rpttmt.ldnn.ti.i.bkii.hgeamyseprzk.r..mld.e.l.\n",
1898 ".vwkibp.a.n.wlo.ifg..g.ugtw.afglrtr.i..nwpa.auleae.crorpoaaek.ueo.ssoai.ds.a.ryognhkaaec..euye.ce.ad\n",
1899 "..ai.nmseph.msvsta..st.qh.ow.iiirden..iornp.pes.ec.eboigarxcrld.tslp.r.ahsw.sitsra.ortde..svt.a.ndne\n",
1900 "b.rl.inacae.aeatel.yortuetl.l.fn.irr.rooe..e.s..dcv.vuytireypii.i.a.c.rlessdnoluvy.pcsggsidaim.aoect\n",
1901 "u.loi.rerrr.nssacs.tuoaac.bp.y..iuakfdpr..egatsopasetznlapsni.nmf.zs.tynctrgrato..c.so.in.repnr.rbet\n",
1902 "tgibps.idceott.nsi.ittnrntnalaesfsnnseysword.c..lrdedoygst.lrnggisi.xaoinoscvrcharsa.cngmesiamn.kkdu\n",
1903 "tnkye.e.uusel..cat.lh.aaa.legabnaei.r...kinderou.y.pler.lksleeg.e.eevtteleaeezzaipddpis.nmntfgfo.csp\n",
1904 "eietd..mpqankffh.yaie.gnt.....use.gallivants..ic.l.uydpuner.uyttdysinadlcrove....ee.tslu.geuijnrcipt\n",
1905 "rbred..peri.usoe.srbayetimikespl.debrutrepnu.n.rkl.mb.npsera.fosm.dimieiscovsrd.vtyr.om...l..fioisiu\n",
1906 "nbisl.e.or.a..rs.eoastrireitliugselttit.....g..e.u.pr..iadmsbnemil.gcrt..siepeclrrapteswovasidfvcgro\n",
1907 "uupcer.o..y.d.gtstulte.ne...rtsicitnamoraincoatk.bfearedkhayyeutycacyc.hwlgrc.oeematr...vended.ei.i.\n",
1908 "trxrm.msinimefe.tani.i.ih..i.....edutingamsnoynac..decay..ceagd.ara.a.celnie.vsndwo...pinup...l.dntd\n",
1909 "sgeosdrenblurbscalda.o.nn.n..cimonoxatkinetic..e....narks.k.rl..pl.r.teaihe.eer.pwryly...tubes.e..g.\n",
1910 "..saesuohdraug..ie.v.m.gig.ycnangiop.tawdrier..w....scallopedsesiwp.atstcl.ddo.astelfael..bumblers..\n",
1911 ".t.krandomises..rr.a..gripestsivitcellocsbawsshapeliest..gnitontoofhylluftsaobwsocilac..located..s..\n"
1912 ]
1913 }
1914 ],
1915 "source": [
1916 "print(show_grid(g))"
1917 ]
1918 },
1919 {
1920 "cell_type": "code",
1921 "execution_count": null,
1922 "metadata": {
1923 "collapsed": true
1924 },
1925 "outputs": [],
1926 "source": []
1927 }
1928 ],
1929 "metadata": {
1930 "kernelspec": {
1931 "display_name": "Python 3",
1932 "language": "python",
1933 "name": "python3"
1934 },
1935 "language_info": {
1936 "codemirror_mode": {
1937 "name": "ipython",
1938 "version": 3
1939 },
1940 "file_extension": ".py",
1941 "mimetype": "text/x-python",
1942 "name": "python",
1943 "nbconvert_exporter": "python",
1944 "pygments_lexer": "ipython3",
1945 "version": "3.5.2+"
1946 }
1947 },
1948 "nbformat": 4,
1949 "nbformat_minor": 1
1950 }