Removing files from data analysis directory
[ou-summer-of-code-2017.git] / 09-resolving-the-bill / interleaving.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Interleaved strings\n",
8 "\n",
9 "Given two strings a and b and a target c, could c be formed form some interleaving/merge of a and b?\n",
10 "\n",
11 "For example,\n",
12 "Given:\n",
13 "s1 = \"aabcc\",\n",
14 "s2 = \"dbbca\",\n",
15 "\n",
16 "When s3 = \"aadbbcbcac\", return true.\n",
17 "When s3 = \"aadbbbaccc\", return false."
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {
24 "collapsed": true
25 },
26 "outputs": [],
27 "source": [
28 "import random\n",
29 "import string"
30 ]
31 },
32 {
33 "cell_type": "code",
34 "execution_count": 47,
35 "metadata": {
36 "collapsed": true
37 },
38 "outputs": [],
39 "source": [
40 "import sys\n",
41 "sys.setrecursionlimit(10**6)"
42 ]
43 },
44 {
45 "cell_type": "code",
46 "execution_count": 3,
47 "metadata": {
48 "collapsed": true
49 },
50 "outputs": [],
51 "source": [
52 "s1 = \"aabcc\"\n",
53 "s2 = \"dbbca\"\n",
54 "\n",
55 "s3t = \"aadbbcbcac\"\n",
56 "s3f = \"aadbbbaccc\""
57 ]
58 },
59 {
60 "cell_type": "code",
61 "execution_count": 4,
62 "metadata": {},
63 "outputs": [
64 {
65 "data": {
66 "text/plain": [
67 "[(0, ''), (1, 'a'), (2, 'aa'), (3, 'aab'), (4, 'aabc'), (5, 'aabcc')]"
68 ]
69 },
70 "execution_count": 4,
71 "metadata": {},
72 "output_type": "execute_result"
73 }
74 ],
75 "source": [
76 "[(i, s1[:i]) for i in range(len(s1)+1)]"
77 ]
78 },
79 {
80 "cell_type": "markdown",
81 "metadata": {},
82 "source": [
83 "`dp_table[i, j]` is True if first `i` + `j` characters of `s3` can be formed from interleaving of first `i` characters of `s1` and first `j` characters of `s2`."
84 ]
85 },
86 {
87 "cell_type": "code",
88 "execution_count": 5,
89 "metadata": {},
90 "outputs": [
91 {
92 "data": {
93 "text/plain": [
94 "[[True, False, False, False, False, False],\n",
95 " [False, False, False, False, False, False],\n",
96 " [False, False, False, False, False, False],\n",
97 " [False, False, False, False, False, False],\n",
98 " [False, False, False, False, False, False],\n",
99 " [False, False, False, False, False, False]]"
100 ]
101 },
102 "execution_count": 5,
103 "metadata": {},
104 "output_type": "execute_result"
105 }
106 ],
107 "source": [
108 "dp_table = [[False] * (len(s1) + 1) for _ in range(len(s2) + 1)]\n",
109 "dp_table[0][0] = True\n",
110 "dp_table"
111 ]
112 },
113 {
114 "cell_type": "code",
115 "execution_count": 6,
116 "metadata": {
117 "scrolled": true
118 },
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "{(0, 0): False,\n",
124 " (0, 1): False,\n",
125 " (0, 2): False,\n",
126 " (0, 3): False,\n",
127 " (0, 4): False,\n",
128 " (0, 5): False,\n",
129 " (1, 0): False,\n",
130 " (1, 1): False,\n",
131 " (1, 2): False,\n",
132 " (1, 3): False,\n",
133 " (1, 4): False,\n",
134 " (1, 5): False,\n",
135 " (2, 0): False,\n",
136 " (2, 1): False,\n",
137 " (2, 2): False,\n",
138 " (2, 3): False,\n",
139 " (2, 4): False,\n",
140 " (2, 5): False,\n",
141 " (3, 0): False,\n",
142 " (3, 1): False,\n",
143 " (3, 2): False,\n",
144 " (3, 3): False,\n",
145 " (3, 4): False,\n",
146 " (3, 5): False,\n",
147 " (4, 0): False,\n",
148 " (4, 1): False,\n",
149 " (4, 2): False,\n",
150 " (4, 3): False,\n",
151 " (4, 4): False,\n",
152 " (4, 5): False,\n",
153 " (5, 0): False,\n",
154 " (5, 1): False,\n",
155 " (5, 2): False,\n",
156 " (5, 3): False,\n",
157 " (5, 4): False,\n",
158 " (5, 5): False}"
159 ]
160 },
161 "execution_count": 6,
162 "metadata": {},
163 "output_type": "execute_result"
164 }
165 ],
166 "source": [
167 "dp_table = {(i, j): False\n",
168 " for i in range(len(s1)+1)\n",
169 " for j in range(len(s2)+1)}\n",
170 "dp_table"
171 ]
172 },
173 {
174 "cell_type": "code",
175 "execution_count": 7,
176 "metadata": {
177 "collapsed": true
178 },
179 "outputs": [],
180 "source": [
181 "def show_table(table):\n",
182 " return '\\n'.join(\n",
183 " ' '.join(str(table[i, j])[0] for j in sorted(set([k[1] for k in table])))\n",
184 " for i in sorted(set([k[0] for k in table]))) "
185 ]
186 },
187 {
188 "cell_type": "code",
189 "execution_count": 8,
190 "metadata": {
191 "collapsed": true
192 },
193 "outputs": [],
194 "source": [
195 "def show_table(table):\n",
196 " return '\\n'.join(\n",
197 " ' '.join('T' if table[i, j] else '.' for j in sorted(set([k[1] for k in table])))\n",
198 " for i in sorted(set([k[0] for k in table]))) "
199 ]
200 },
201 {
202 "cell_type": "code",
203 "execution_count": 9,
204 "metadata": {},
205 "outputs": [
206 {
207 "name": "stdout",
208 "output_type": "stream",
209 "text": [
210 ". . . . . .\n",
211 ". . . . . .\n",
212 ". . . . . .\n",
213 ". . . . . .\n",
214 ". . . . . .\n",
215 ". . . . . .\n"
216 ]
217 }
218 ],
219 "source": [
220 "print(show_table(dp_table))"
221 ]
222 },
223 {
224 "cell_type": "code",
225 "execution_count": 10,
226 "metadata": {},
227 "outputs": [
228 {
229 "name": "stdout",
230 "output_type": "stream",
231 "text": [
232 "aabcc dbbca aadbbcbcac\n",
233 "aa 0 0 ! ! ! True\n",
234 "s2 0 1 ! d a False\n",
235 "s2 0 2 ! b a False\n",
236 "s2 0 3 ! b d False\n",
237 "s2 0 4 ! c b False\n",
238 "s2 0 5 ! a b False\n",
239 "s1 1 0 a ! a True\n",
240 "xx 1 1 a d a False\n",
241 "xx 1 2 a b d False\n",
242 "xx 1 3 a b b False\n",
243 "xx 1 4 a c b False\n",
244 "xx 1 5 a a c False\n",
245 "s1 2 0 a ! a True\n",
246 "s2 2 1 a d d True\n",
247 "s2 2 2 a b b True\n",
248 "s2 2 3 a b b True\n",
249 "s2 2 4 a c c True\n",
250 "xx 2 5 a a b False\n",
251 "s1 3 0 b ! d False\n",
252 "s1 3 1 b d b True\n",
253 "s2 3 2 b b b True\n",
254 "s1 3 2 b b b True\n",
255 "xx 3 3 b b c False\n",
256 "s1 3 4 b c b True\n",
257 "xx 3 5 b a c False\n",
258 "s1 4 0 c ! b False\n",
259 "xx 4 1 c d b False\n",
260 "s1 4 2 c b c True\n",
261 "s2 4 3 c b b True\n",
262 "s2 4 4 c c c True\n",
263 "s1 4 4 c c c True\n",
264 "s2 4 5 c a a True\n",
265 "s1 5 0 c ! b False\n",
266 "xx 5 1 c d c False\n",
267 "xx 5 2 c b b False\n",
268 "s1 5 3 c b c True\n",
269 "xx 5 4 c c a False\n",
270 "s1 5 5 c a c True\n",
271 "T . . . . .\n",
272 "T . . . . .\n",
273 "T T T T T .\n",
274 ". T T . T .\n",
275 ". . T T T T\n",
276 ". . . T . T\n"
277 ]
278 },
279 {
280 "data": {
281 "text/plain": [
282 "{(1, 0): (0, 0, 'a', 's1'),\n",
283 " (2, 0): (1, 0, 'a', 's1'),\n",
284 " (2, 1): (2, 0, 'd', 's2'),\n",
285 " (2, 2): (2, 1, 'b', 's2'),\n",
286 " (2, 3): (2, 2, 'b', 's2'),\n",
287 " (2, 4): (2, 3, 'c', 's2'),\n",
288 " (3, 1): (2, 1, 'b', 's1'),\n",
289 " (3, 2): (2, 2, 'b', 's1'),\n",
290 " (3, 4): (2, 4, 'b', 's1'),\n",
291 " (4, 2): (3, 2, 'c', 's1'),\n",
292 " (4, 3): (4, 2, 'b', 's2'),\n",
293 " (4, 4): (3, 4, 'c', 's1'),\n",
294 " (4, 5): (4, 4, 'a', 's2'),\n",
295 " (5, 3): (4, 3, 'c', 's1'),\n",
296 " (5, 5): (4, 5, 'c', 's1')}"
297 ]
298 },
299 "execution_count": 10,
300 "metadata": {},
301 "output_type": "execute_result"
302 }
303 ],
304 "source": [
305 "s3 = s3t\n",
306 "\n",
307 "print(s1, s2, s3)\n",
308 "\n",
309 "dp_table = {(i, j): False\n",
310 " for i in range(len(s1)+1)\n",
311 " for j in range(len(s2)+1)}\n",
312 "\n",
313 "backpointers = {}\n",
314 "\n",
315 "for i in range(len(s1)+1):\n",
316 " for j in range(len(s2)+1):\n",
317 " if i == 0 and j == 0:\n",
318 " dp_table[i, j] = True\n",
319 " print('aa', i, j, '!', '!', '!', dp_table[i, j])\n",
320 " elif i == 0:\n",
321 " # extend by character from s2\n",
322 " if dp_table[i, j-1] and s2[j-1] == s3[i+j-1]:\n",
323 " dp_table[i, j] = True\n",
324 " backpointers[i, j] = (i, j-1, s2[j-1], 's2')\n",
325 " print('s2', i, j, '!', s2[j-1], s3[i+j-1], dp_table[i, j])\n",
326 " elif j == 0:\n",
327 " # extend by character from s1\n",
328 " if dp_table[i-1, j] and s1[i-1] == s3[i+j-1]:\n",
329 " dp_table[i, j] = True\n",
330 " backpointers[i, j] = (i-1, j, s1[i-1], 's1')\n",
331 " print('s1', i, j, s1[i-1], '!', s3[i+j-1], dp_table[i, j])\n",
332 " else:\n",
333 " # extend by character from s2\n",
334 " if dp_table[i, j-1] and s2[j-1] == s3[i+j-1]:\n",
335 " dp_table[i, j] = True\n",
336 " backpointers[i, j] = (i, j-1, s2[j-1], 's2')\n",
337 " print('s2', i, j, s1[i-1], s2[j-1], s3[i+j-1], dp_table[i, j]) \n",
338 " # extend by character from s1\n",
339 " if dp_table[i-1, j] and s1[i-1] == s3[i+j-1]:\n",
340 " dp_table[i, j] = True\n",
341 " backpointers[i, j] = (i-1, j, s1[i-1], 's1') \n",
342 " print('s1', i, j, s1[i-1], s2[j-1], s3[i+j-1], dp_table[i, j])\n",
343 " if not dp_table[i, j]:\n",
344 " print('xx', i, j, s1[i-1], s2[j-1], s3[i+j-1], dp_table[i, j])\n",
345 "\n",
346 "print(show_table(dp_table))\n",
347 "backpointers"
348 ]
349 },
350 {
351 "cell_type": "code",
352 "execution_count": 11,
353 "metadata": {
354 "collapsed": true
355 },
356 "outputs": [],
357 "source": [
358 "def is_interleave(seq1, seq2, seq3, return_backpointers=False, return_table=False, debug=False):\n",
359 " \"\"\"Return true if seq3 is some interleaved merge of seq1 and seq2.\n",
360 " If return_backpointers, also return the set of backpointers to\n",
361 " reconstruct the interleaving\"\"\"\n",
362 " \n",
363 " # dp_table[i, j] is True if first i+j characters of seq is made up of \n",
364 " # an interleaving of the first i characters of seq1 and the \n",
365 " # first j characters of seq2\n",
366 " \n",
367 " if len(seq1) + len(seq2) != len(seq3):\n",
368 " if return_backpointers or return_table:\n",
369 " retval = [False]\n",
370 " if return_backpointers:\n",
371 " retval += [{}]\n",
372 " if return_table:\n",
373 " retval += [{}]\n",
374 " return tuple(retval)\n",
375 " else:\n",
376 " return False\n",
377 " \n",
378 " dp_table = {(i, j): False\n",
379 " for i in range(len(seq1)+1)\n",
380 " for j in range(len(seq2)+1)}\n",
381 "\n",
382 " backpointers = {}\n",
383 "\n",
384 " for i in range(len(seq1)+1):\n",
385 " for j in range(len(seq2)+1):\n",
386 " if i == 0 and j == 0:\n",
387 " dp_table[i, j] = True\n",
388 " if debug: print('xxxx', i, j, '!', '!', '!', dp_table[i, j])\n",
389 " elif i == 0:\n",
390 " # extend by character from seq2\n",
391 " if dp_table[i, j-1] and seq2[j-1] == seq3[i+j-1]:\n",
392 " dp_table[i, j] = True\n",
393 " backpointers[i, j] = (i, j-1, seq2[j-1], 'seq2')\n",
394 " if debug: print('seq2', i, j, '!', seq2[j-1], seq3[i+j-1], dp_table[i, j])\n",
395 " elif j == 0:\n",
396 " # extend by character from seq1\n",
397 " if dp_table[i-1, j] and seq1[i-1] == seq3[i+j-1]:\n",
398 " dp_table[i, j] = True\n",
399 " backpointers[i, j] = (i-1, j, seq1[i-1], 'seq1')\n",
400 " if debug: print('seq1', i, j, seq1[i-1], '!', seq3[i+j-1], dp_table[i, j])\n",
401 " else:\n",
402 " # extend by character from seq2\n",
403 " if dp_table[i, j-1] and seq2[j-1] == seq3[i+j-1]:\n",
404 " dp_table[i, j] = True\n",
405 " backpointers[i, j] = (i, j-1, seq2[j-1], 'seq2')\n",
406 " if debug: print('seq2', i, j, seq1[i-1], seq2[j-1], seq3[i+j-1], dp_table[i, j]) \n",
407 " # extend by character from seq1\n",
408 " if dp_table[i-1, j] and seq1[i-1] == seq3[i+j-1]:\n",
409 " dp_table[i, j] = True\n",
410 " backpointers[i, j] = (i-1, j, seq1[i-1], 'seq1') \n",
411 " if debug: print('seq1', i, j, seq1[i-1], seq2[j-1], seq3[i+j-1], dp_table[i, j])\n",
412 " if not dp_table[i, j]:\n",
413 " if debug: print('xxxx', i, j, seq1[i-1], seq2[j-1], seq3[i+j-1], dp_table[i, j])\n",
414 "\n",
415 " if return_backpointers or return_table:\n",
416 " retval = [dp_table[len(seq1), len(seq2)]]\n",
417 " if return_backpointers:\n",
418 " retval += [backpointers]\n",
419 " if return_table:\n",
420 " retval += [dp_table]\n",
421 " return tuple(retval)\n",
422 " else:\n",
423 " return dp_table[len(seq1), len(seq2)]"
424 ]
425 },
426 {
427 "cell_type": "code",
428 "execution_count": 12,
429 "metadata": {},
430 "outputs": [
431 {
432 "data": {
433 "text/plain": [
434 "True"
435 ]
436 },
437 "execution_count": 12,
438 "metadata": {},
439 "output_type": "execute_result"
440 }
441 ],
442 "source": [
443 "is_interleave(s1, s2, s3t)"
444 ]
445 },
446 {
447 "cell_type": "code",
448 "execution_count": 13,
449 "metadata": {},
450 "outputs": [
451 {
452 "data": {
453 "text/plain": [
454 "(True,\n",
455 " {(1, 0): (0, 0, 'a', 'seq1'),\n",
456 " (2, 0): (1, 0, 'a', 'seq1'),\n",
457 " (2, 1): (2, 0, 'd', 'seq2'),\n",
458 " (2, 2): (2, 1, 'b', 'seq2'),\n",
459 " (2, 3): (2, 2, 'b', 'seq2'),\n",
460 " (2, 4): (2, 3, 'c', 'seq2'),\n",
461 " (3, 1): (2, 1, 'b', 'seq1'),\n",
462 " (3, 2): (2, 2, 'b', 'seq1'),\n",
463 " (3, 4): (2, 4, 'b', 'seq1'),\n",
464 " (4, 2): (3, 2, 'c', 'seq1'),\n",
465 " (4, 3): (4, 2, 'b', 'seq2'),\n",
466 " (4, 4): (3, 4, 'c', 'seq1'),\n",
467 " (4, 5): (4, 4, 'a', 'seq2'),\n",
468 " (5, 3): (4, 3, 'c', 'seq1'),\n",
469 " (5, 5): (4, 5, 'c', 'seq1')})"
470 ]
471 },
472 "execution_count": 13,
473 "metadata": {},
474 "output_type": "execute_result"
475 }
476 ],
477 "source": [
478 "is_interleave(s1, s2, s3t, return_backpointers=True)"
479 ]
480 },
481 {
482 "cell_type": "code",
483 "execution_count": 14,
484 "metadata": {
485 "scrolled": true
486 },
487 "outputs": [
488 {
489 "data": {
490 "text/plain": [
491 "(True,\n",
492 " {(1, 0): (0, 0, 'a', 'seq1'),\n",
493 " (2, 0): (1, 0, 'a', 'seq1'),\n",
494 " (2, 1): (2, 0, 'd', 'seq2'),\n",
495 " (2, 2): (2, 1, 'b', 'seq2'),\n",
496 " (2, 3): (2, 2, 'b', 'seq2'),\n",
497 " (2, 4): (2, 3, 'c', 'seq2'),\n",
498 " (3, 1): (2, 1, 'b', 'seq1'),\n",
499 " (3, 2): (2, 2, 'b', 'seq1'),\n",
500 " (3, 4): (2, 4, 'b', 'seq1'),\n",
501 " (4, 2): (3, 2, 'c', 'seq1'),\n",
502 " (4, 3): (4, 2, 'b', 'seq2'),\n",
503 " (4, 4): (3, 4, 'c', 'seq1'),\n",
504 " (4, 5): (4, 4, 'a', 'seq2'),\n",
505 " (5, 3): (4, 3, 'c', 'seq1'),\n",
506 " (5, 5): (4, 5, 'c', 'seq1')},\n",
507 " {(0, 0): True,\n",
508 " (0, 1): False,\n",
509 " (0, 2): False,\n",
510 " (0, 3): False,\n",
511 " (0, 4): False,\n",
512 " (0, 5): False,\n",
513 " (1, 0): True,\n",
514 " (1, 1): False,\n",
515 " (1, 2): False,\n",
516 " (1, 3): False,\n",
517 " (1, 4): False,\n",
518 " (1, 5): False,\n",
519 " (2, 0): True,\n",
520 " (2, 1): True,\n",
521 " (2, 2): True,\n",
522 " (2, 3): True,\n",
523 " (2, 4): True,\n",
524 " (2, 5): False,\n",
525 " (3, 0): False,\n",
526 " (3, 1): True,\n",
527 " (3, 2): True,\n",
528 " (3, 3): False,\n",
529 " (3, 4): True,\n",
530 " (3, 5): False,\n",
531 " (4, 0): False,\n",
532 " (4, 1): False,\n",
533 " (4, 2): True,\n",
534 " (4, 3): True,\n",
535 " (4, 4): True,\n",
536 " (4, 5): True,\n",
537 " (5, 0): False,\n",
538 " (5, 1): False,\n",
539 " (5, 2): False,\n",
540 " (5, 3): True,\n",
541 " (5, 4): False,\n",
542 " (5, 5): True})"
543 ]
544 },
545 "execution_count": 14,
546 "metadata": {},
547 "output_type": "execute_result"
548 }
549 ],
550 "source": [
551 "is_interleave(s1, s2, s3t, return_backpointers=True, return_table=True)"
552 ]
553 },
554 {
555 "cell_type": "code",
556 "execution_count": 15,
557 "metadata": {},
558 "outputs": [
559 {
560 "data": {
561 "text/plain": [
562 "False"
563 ]
564 },
565 "execution_count": 15,
566 "metadata": {},
567 "output_type": "execute_result"
568 }
569 ],
570 "source": [
571 "is_interleave(s1, s2, s3f)"
572 ]
573 },
574 {
575 "cell_type": "code",
576 "execution_count": 16,
577 "metadata": {},
578 "outputs": [
579 {
580 "name": "stdout",
581 "output_type": "stream",
582 "text": [
583 "xxxx 0 0 ! ! ! True\n",
584 "seq2 0 1 ! b a False\n",
585 "seq2 0 2 ! b a False\n",
586 "seq2 0 3 ! b a False\n",
587 "seq1 1 0 a ! a True\n",
588 "xxxx 1 1 a b a False\n",
589 "xxxx 1 2 a b a False\n",
590 "xxxx 1 3 a b b False\n",
591 "seq1 2 0 a ! a True\n",
592 "xxxx 2 1 a b a False\n",
593 "xxxx 2 2 a b b False\n",
594 "xxxx 2 3 a b a False\n",
595 "seq1 3 0 a ! a True\n",
596 "seq2 3 1 a b b True\n",
597 "xxxx 3 2 a b a False\n",
598 "xxxx 3 3 a b b False\n",
599 "seq1 4 0 a ! b False\n",
600 "seq1 4 1 a b a True\n",
601 "seq2 4 2 a b b True\n",
602 "seq2 4 3 a b b True\n"
603 ]
604 },
605 {
606 "data": {
607 "text/plain": [
608 "(True,\n",
609 " {(1, 0): (0, 0, 'a', 'seq1'),\n",
610 " (2, 0): (1, 0, 'a', 'seq1'),\n",
611 " (3, 0): (2, 0, 'a', 'seq1'),\n",
612 " (3, 1): (3, 0, 'b', 'seq2'),\n",
613 " (4, 1): (3, 1, 'a', 'seq1'),\n",
614 " (4, 2): (4, 1, 'b', 'seq2'),\n",
615 " (4, 3): (4, 2, 'b', 'seq2')})"
616 ]
617 },
618 "execution_count": 16,
619 "metadata": {},
620 "output_type": "execute_result"
621 }
622 ],
623 "source": [
624 "is_interleave('aaaa', 'bbb', 'aaababb', return_backpointers=True, debug=True)"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 17,
630 "metadata": {
631 "collapsed": true
632 },
633 "outputs": [],
634 "source": [
635 "def show_backtrace(bps):\n",
636 " i = max([0] + [k[0] for k in bps])\n",
637 " j = max([0] + [k[1] for k in bps])\n",
638 " chars = ''\n",
639 " if (i, j) in bps:\n",
640 " while i != 0 or j != 0:\n",
641 " if bps[i, j][3] == 'seq1':\n",
642 " chars += bps[i, j][2].upper()\n",
643 " else:\n",
644 " chars += bps[i, j][2]\n",
645 " i, j = bps[i, j][0], bps[i, j][1] \n",
646 " return ''.join(list(reversed(chars)))\n",
647 " else:\n",
648 " return ''"
649 ]
650 },
651 {
652 "cell_type": "code",
653 "execution_count": 18,
654 "metadata": {
655 "collapsed": true
656 },
657 "outputs": [],
658 "source": [
659 "def make_string(length, alphabet=None):\n",
660 " if not alphabet:\n",
661 " alphabet = 'abcdefgh'\n",
662 " return ''.join(random.choice(alphabet) for _ in range(length)) "
663 ]
664 },
665 {
666 "cell_type": "code",
667 "execution_count": 19,
668 "metadata": {},
669 "outputs": [
670 {
671 "data": {
672 "text/plain": [
673 "'fcafghacdbdhegdbdfbbbghecebceaecbhbfgaedaggbbfefcd'"
674 ]
675 },
676 "execution_count": 19,
677 "metadata": {},
678 "output_type": "execute_result"
679 }
680 ],
681 "source": [
682 "make_string(50)"
683 ]
684 },
685 {
686 "cell_type": "code",
687 "execution_count": 20,
688 "metadata": {
689 "collapsed": true
690 },
691 "outputs": [],
692 "source": [
693 "def interleave(s1, s2, wander_limit=10, debug=False):\n",
694 " i1 = i2 = wander = 0\n",
695 " interleaved = []\n",
696 " while i1 <= len(s1) and i2 <= len(s2):\n",
697 " if i1 == len(s1):\n",
698 " if debug: print(i1, i2, wander, 'remaining s2', s2[i2:])\n",
699 " interleaved += s2[i2:]\n",
700 " i2 = len(s2) + 1\n",
701 " elif i2 == len(s2):\n",
702 " if debug: print(i1, i2, wander, 'remaining s1', s1[i1:])\n",
703 " interleaved += s1[i1:]\n",
704 " i1 = len(s1) + 1\n",
705 " else:\n",
706 " if wander == wander_limit:\n",
707 " step = -1\n",
708 " elif wander == -wander_limit:\n",
709 " step = +1\n",
710 " else:\n",
711 " step = random.choice([+1, -1])\n",
712 " if step == +1:\n",
713 " if debug: print(i1, i2, wander, 'adding', s1[i1])\n",
714 " interleaved += s1[i1]\n",
715 " i1 += 1\n",
716 " wander += 1\n",
717 " else:\n",
718 " if debug: print(i1, i2, wander, 'adding', s2[i2])\n",
719 " interleaved += s2[i2]\n",
720 " i2 += 1\n",
721 " wander -= 1\n",
722 " return ''.join(interleaved)\n",
723 " "
724 ]
725 },
726 {
727 "cell_type": "code",
728 "execution_count": 21,
729 "metadata": {},
730 "outputs": [
731 {
732 "name": "stdout",
733 "output_type": "stream",
734 "text": [
735 "0 0 0 adding g\n",
736 "1 0 1 adding f\n",
737 "2 0 2 adding z\n",
738 "2 1 1 adding e\n",
739 "3 1 2 adding y\n",
740 "3 2 1 adding g\n",
741 "4 2 2 adding f\n",
742 "5 2 3 adding a\n",
743 "6 2 4 adding z\n",
744 "6 3 3 adding v\n",
745 "6 4 2 adding y\n",
746 "6 5 1 adding u\n",
747 "6 6 0 adding z\n",
748 "6 7 -1 adding h\n",
749 "7 7 0 adding v\n",
750 "7 8 -1 adding g\n",
751 "8 8 0 adding d\n",
752 "9 8 1 adding u\n",
753 "9 9 0 adding z\n",
754 "9 10 -1 adding a\n",
755 "10 10 0 adding z\n",
756 "10 11 -1 adding y\n",
757 "10 12 -2 adding w\n",
758 "10 13 -3 adding a\n",
759 "11 13 -2 adding f\n",
760 "12 13 -1 adding g\n",
761 "13 13 0 adding g\n",
762 "14 13 1 adding f\n",
763 "15 13 2 adding h\n",
764 "16 13 3 adding x\n",
765 "16 14 2 adding w\n",
766 "16 15 1 adding a\n",
767 "17 15 2 adding e\n",
768 "18 15 3 adding w\n",
769 "18 16 2 adding d\n",
770 "19 16 3 adding x\n",
771 "19 17 2 adding u\n",
772 "19 18 1 adding z\n",
773 "19 19 0 adding x\n",
774 "19 20 -1 remaining s1 g\n"
775 ]
776 },
777 {
778 "data": {
779 "text/plain": [
780 "('gfegfahgdaafggfhaedg',\n",
781 " 'zyzvyuzvuzzywxwwxuzx',\n",
782 " 'gfzeygfazvyuzhvgduzazywafggfhxwaewdxuzxg',\n",
783 " 40)"
784 ]
785 },
786 "execution_count": 21,
787 "metadata": {},
788 "output_type": "execute_result"
789 }
790 ],
791 "source": [
792 "s1 = make_string(20)\n",
793 "s2 = make_string(20, alphabet='uvwxyz')\n",
794 "il = interleave(s1, s2, wander_limit=5, debug=True)\n",
795 "s1, s2, il, len(il)"
796 ]
797 },
798 {
799 "cell_type": "code",
800 "execution_count": 22,
801 "metadata": {},
802 "outputs": [
803 {
804 "name": "stdout",
805 "output_type": "stream",
806 "text": [
807 "xxxx 0 0 ! ! ! True\n",
808 "seq2 0 1 ! g g True\n",
809 "seq2 0 2 ! f f True\n",
810 "seq2 0 3 ! e z False\n",
811 "seq2 0 4 ! g e False\n",
812 "seq2 0 5 ! f y False\n",
813 "seq2 0 6 ! a g False\n",
814 "seq2 0 7 ! h f False\n",
815 "seq2 0 8 ! g a False\n",
816 "seq2 0 9 ! d z False\n",
817 "seq2 0 10 ! a v False\n",
818 "seq2 0 11 ! a y False\n",
819 "seq2 0 12 ! f u False\n",
820 "seq2 0 13 ! g z False\n",
821 "seq2 0 14 ! g h False\n",
822 "seq2 0 15 ! f v False\n",
823 "seq2 0 16 ! h g False\n",
824 "seq2 0 17 ! a d False\n",
825 "seq2 0 18 ! e u False\n",
826 "seq2 0 19 ! d z False\n",
827 "seq2 0 20 ! g a False\n",
828 "seq1 1 0 z ! g False\n",
829 "xxxx 1 1 z g f False\n",
830 "seq1 1 2 z f z True\n",
831 "seq2 1 3 z e e True\n",
832 "xxxx 1 4 z g y False\n",
833 "xxxx 1 5 z f g False\n",
834 "xxxx 1 6 z a f False\n",
835 "xxxx 1 7 z h a False\n",
836 "xxxx 1 8 z g z False\n",
837 "xxxx 1 9 z d v False\n",
838 "xxxx 1 10 z a y False\n",
839 "xxxx 1 11 z a u False\n",
840 "xxxx 1 12 z f z False\n",
841 "xxxx 1 13 z g h False\n",
842 "xxxx 1 14 z g v False\n",
843 "xxxx 1 15 z f g False\n",
844 "xxxx 1 16 z h d False\n",
845 "xxxx 1 17 z a u False\n",
846 "xxxx 1 18 z e z False\n",
847 "xxxx 1 19 z d a False\n",
848 "xxxx 1 20 z g z False\n",
849 "seq1 2 0 y ! f False\n",
850 "xxxx 2 1 y g z False\n",
851 "xxxx 2 2 y f e False\n",
852 "seq1 2 3 y e y True\n",
853 "seq2 2 4 y g g True\n",
854 "seq2 2 5 y f f True\n",
855 "seq2 2 6 y a a True\n",
856 "xxxx 2 7 y h z False\n",
857 "xxxx 2 8 y g v False\n",
858 "xxxx 2 9 y d y False\n",
859 "xxxx 2 10 y a u False\n",
860 "xxxx 2 11 y a z False\n",
861 "xxxx 2 12 y f h False\n",
862 "xxxx 2 13 y g v False\n",
863 "xxxx 2 14 y g g False\n",
864 "xxxx 2 15 y f d False\n",
865 "xxxx 2 16 y h u False\n",
866 "xxxx 2 17 y a z False\n",
867 "xxxx 2 18 y e a False\n",
868 "xxxx 2 19 y d z False\n",
869 "xxxx 2 20 y g y False\n",
870 "seq1 3 0 z ! z False\n",
871 "xxxx 3 1 z g e False\n",
872 "xxxx 3 2 z f y False\n",
873 "xxxx 3 3 z e g False\n",
874 "xxxx 3 4 z g f False\n",
875 "xxxx 3 5 z f a False\n",
876 "seq1 3 6 z a z True\n",
877 "xxxx 3 7 z h v False\n",
878 "xxxx 3 8 z g y False\n",
879 "xxxx 3 9 z d u False\n",
880 "xxxx 3 10 z a z False\n",
881 "xxxx 3 11 z a h False\n",
882 "xxxx 3 12 z f v False\n",
883 "xxxx 3 13 z g g False\n",
884 "xxxx 3 14 z g d False\n",
885 "xxxx 3 15 z f u False\n",
886 "xxxx 3 16 z h z False\n",
887 "xxxx 3 17 z a a False\n",
888 "xxxx 3 18 z e z False\n",
889 "xxxx 3 19 z d y False\n",
890 "xxxx 3 20 z g w False\n",
891 "seq1 4 0 v ! e False\n",
892 "xxxx 4 1 v g y False\n",
893 "xxxx 4 2 v f g False\n",
894 "xxxx 4 3 v e f False\n",
895 "xxxx 4 4 v g a False\n",
896 "xxxx 4 5 v f z False\n",
897 "seq1 4 6 v a v True\n",
898 "xxxx 4 7 v h y False\n",
899 "xxxx 4 8 v g u False\n",
900 "xxxx 4 9 v d z False\n",
901 "xxxx 4 10 v a h False\n",
902 "xxxx 4 11 v a v False\n",
903 "xxxx 4 12 v f g False\n",
904 "xxxx 4 13 v g d False\n",
905 "xxxx 4 14 v g u False\n",
906 "xxxx 4 15 v f z False\n",
907 "xxxx 4 16 v h a False\n",
908 "xxxx 4 17 v a z False\n",
909 "xxxx 4 18 v e y False\n",
910 "xxxx 4 19 v d w False\n",
911 "xxxx 4 20 v g a False\n",
912 "seq1 5 0 y ! y False\n",
913 "xxxx 5 1 y g g False\n",
914 "xxxx 5 2 y f f False\n",
915 "xxxx 5 3 y e a False\n",
916 "xxxx 5 4 y g z False\n",
917 "xxxx 5 5 y f v False\n",
918 "seq1 5 6 y a y True\n",
919 "xxxx 5 7 y h u False\n",
920 "xxxx 5 8 y g z False\n",
921 "xxxx 5 9 y d h False\n",
922 "xxxx 5 10 y a v False\n",
923 "xxxx 5 11 y a g False\n",
924 "xxxx 5 12 y f d False\n",
925 "xxxx 5 13 y g u False\n",
926 "xxxx 5 14 y g z False\n",
927 "xxxx 5 15 y f a False\n",
928 "xxxx 5 16 y h z False\n",
929 "xxxx 5 17 y a y False\n",
930 "xxxx 5 18 y e w False\n",
931 "xxxx 5 19 y d a False\n",
932 "xxxx 5 20 y g f False\n",
933 "seq1 6 0 u ! g False\n",
934 "xxxx 6 1 u g f False\n",
935 "xxxx 6 2 u f a False\n",
936 "xxxx 6 3 u e z False\n",
937 "xxxx 6 4 u g v False\n",
938 "xxxx 6 5 u f y False\n",
939 "seq1 6 6 u a u True\n",
940 "xxxx 6 7 u h z False\n",
941 "xxxx 6 8 u g h False\n",
942 "xxxx 6 9 u d v False\n",
943 "xxxx 6 10 u a g False\n",
944 "xxxx 6 11 u a d False\n",
945 "xxxx 6 12 u f u False\n",
946 "xxxx 6 13 u g z False\n",
947 "xxxx 6 14 u g a False\n",
948 "xxxx 6 15 u f z False\n",
949 "xxxx 6 16 u h y False\n",
950 "xxxx 6 17 u a w False\n",
951 "xxxx 6 18 u e a False\n",
952 "xxxx 6 19 u d f False\n",
953 "xxxx 6 20 u g g False\n",
954 "seq1 7 0 z ! f False\n",
955 "xxxx 7 1 z g a False\n",
956 "xxxx 7 2 z f z False\n",
957 "xxxx 7 3 z e v False\n",
958 "xxxx 7 4 z g y False\n",
959 "xxxx 7 5 z f u False\n",
960 "seq1 7 6 z a z True\n",
961 "seq2 7 7 z h h True\n",
962 "xxxx 7 8 z g v False\n",
963 "xxxx 7 9 z d g False\n",
964 "xxxx 7 10 z a d False\n",
965 "xxxx 7 11 z a u False\n",
966 "xxxx 7 12 z f z False\n",
967 "xxxx 7 13 z g a False\n",
968 "xxxx 7 14 z g z False\n",
969 "xxxx 7 15 z f y False\n",
970 "xxxx 7 16 z h w False\n",
971 "xxxx 7 17 z a a False\n",
972 "xxxx 7 18 z e f False\n",
973 "xxxx 7 19 z d g False\n",
974 "xxxx 7 20 z g g False\n",
975 "seq1 8 0 v ! a False\n",
976 "xxxx 8 1 v g z False\n",
977 "xxxx 8 2 v f v False\n",
978 "xxxx 8 3 v e y False\n",
979 "xxxx 8 4 v g u False\n",
980 "xxxx 8 5 v f z False\n",
981 "xxxx 8 6 v a h False\n",
982 "seq1 8 7 v h v True\n",
983 "seq2 8 8 v g g True\n",
984 "seq2 8 9 v d d True\n",
985 "xxxx 8 10 v a u False\n",
986 "xxxx 8 11 v a z False\n",
987 "xxxx 8 12 v f a False\n",
988 "xxxx 8 13 v g z False\n",
989 "xxxx 8 14 v g y False\n",
990 "xxxx 8 15 v f w False\n",
991 "xxxx 8 16 v h a False\n",
992 "xxxx 8 17 v a f False\n",
993 "xxxx 8 18 v e g False\n",
994 "xxxx 8 19 v d g False\n",
995 "xxxx 8 20 v g f False\n",
996 "seq1 9 0 u ! z False\n",
997 "xxxx 9 1 u g v False\n",
998 "xxxx 9 2 u f y False\n",
999 "xxxx 9 3 u e u False\n",
1000 "xxxx 9 4 u g z False\n",
1001 "xxxx 9 5 u f h False\n",
1002 "xxxx 9 6 u a v False\n",
1003 "xxxx 9 7 u h g False\n",
1004 "xxxx 9 8 u g d False\n",
1005 "seq1 9 9 u d u True\n",
1006 "xxxx 9 10 u a z False\n",
1007 "xxxx 9 11 u a a False\n",
1008 "xxxx 9 12 u f z False\n",
1009 "xxxx 9 13 u g y False\n",
1010 "xxxx 9 14 u g w False\n",
1011 "xxxx 9 15 u f a False\n",
1012 "xxxx 9 16 u h f False\n",
1013 "xxxx 9 17 u a g False\n",
1014 "xxxx 9 18 u e g False\n",
1015 "xxxx 9 19 u d f False\n",
1016 "xxxx 9 20 u g h False\n",
1017 "seq1 10 0 z ! v False\n",
1018 "xxxx 10 1 z g y False\n",
1019 "xxxx 10 2 z f u False\n",
1020 "xxxx 10 3 z e z False\n",
1021 "xxxx 10 4 z g h False\n",
1022 "xxxx 10 5 z f v False\n",
1023 "xxxx 10 6 z a g False\n",
1024 "xxxx 10 7 z h d False\n",
1025 "xxxx 10 8 z g u False\n",
1026 "seq1 10 9 z d z True\n",
1027 "seq2 10 10 z a a True\n",
1028 "xxxx 10 11 z a z False\n",
1029 "xxxx 10 12 z f y False\n",
1030 "xxxx 10 13 z g w False\n",
1031 "xxxx 10 14 z g a False\n",
1032 "xxxx 10 15 z f f False\n",
1033 "xxxx 10 16 z h g False\n",
1034 "xxxx 10 17 z a g False\n",
1035 "xxxx 10 18 z e f False\n",
1036 "xxxx 10 19 z d h False\n",
1037 "xxxx 10 20 z g x False\n",
1038 "seq1 11 0 z ! y False\n",
1039 "xxxx 11 1 z g u False\n",
1040 "xxxx 11 2 z f z False\n",
1041 "xxxx 11 3 z e h False\n",
1042 "xxxx 11 4 z g v False\n",
1043 "xxxx 11 5 z f g False\n",
1044 "xxxx 11 6 z a d False\n",
1045 "xxxx 11 7 z h u False\n",
1046 "xxxx 11 8 z g z False\n",
1047 "xxxx 11 9 z d a False\n",
1048 "seq1 11 10 z a z True\n",
1049 "xxxx 11 11 z a y False\n",
1050 "xxxx 11 12 z f w False\n",
1051 "xxxx 11 13 z g a False\n",
1052 "xxxx 11 14 z g f False\n",
1053 "xxxx 11 15 z f g False\n",
1054 "xxxx 11 16 z h g False\n",
1055 "xxxx 11 17 z a f False\n",
1056 "xxxx 11 18 z e h False\n",
1057 "xxxx 11 19 z d x False\n",
1058 "xxxx 11 20 z g w False\n",
1059 "seq1 12 0 y ! u False\n",
1060 "xxxx 12 1 y g z False\n",
1061 "xxxx 12 2 y f h False\n",
1062 "xxxx 12 3 y e v False\n",
1063 "xxxx 12 4 y g g False\n",
1064 "xxxx 12 5 y f d False\n",
1065 "xxxx 12 6 y a u False\n",
1066 "xxxx 12 7 y h z False\n",
1067 "xxxx 12 8 y g a False\n",
1068 "xxxx 12 9 y d z False\n",
1069 "seq1 12 10 y a y True\n",
1070 "xxxx 12 11 y a w False\n",
1071 "xxxx 12 12 y f a False\n",
1072 "xxxx 12 13 y g f False\n",
1073 "xxxx 12 14 y g g False\n",
1074 "xxxx 12 15 y f g False\n",
1075 "xxxx 12 16 y h f False\n",
1076 "xxxx 12 17 y a h False\n",
1077 "xxxx 12 18 y e x False\n",
1078 "xxxx 12 19 y d w False\n",
1079 "xxxx 12 20 y g a False\n",
1080 "seq1 13 0 w ! z False\n",
1081 "xxxx 13 1 w g h False\n",
1082 "xxxx 13 2 w f v False\n",
1083 "xxxx 13 3 w e g False\n",
1084 "xxxx 13 4 w g d False\n",
1085 "xxxx 13 5 w f u False\n",
1086 "xxxx 13 6 w a z False\n",
1087 "xxxx 13 7 w h a False\n",
1088 "xxxx 13 8 w g z False\n",
1089 "xxxx 13 9 w d y False\n",
1090 "seq1 13 10 w a w True\n",
1091 "seq2 13 11 w a a True\n",
1092 "seq2 13 12 w f f True\n",
1093 "seq2 13 13 w g g True\n",
1094 "seq2 13 14 w g g True\n",
1095 "seq2 13 15 w f f True\n",
1096 "seq2 13 16 w h h True\n",
1097 "xxxx 13 17 w a x False\n",
1098 "xxxx 13 18 w e w False\n",
1099 "xxxx 13 19 w d a False\n",
1100 "xxxx 13 20 w g e False\n",
1101 "seq1 14 0 x ! h False\n",
1102 "xxxx 14 1 x g v False\n",
1103 "xxxx 14 2 x f g False\n",
1104 "xxxx 14 3 x e d False\n",
1105 "xxxx 14 4 x g u False\n",
1106 "xxxx 14 5 x f z False\n",
1107 "xxxx 14 6 x a a False\n",
1108 "xxxx 14 7 x h z False\n",
1109 "xxxx 14 8 x g y False\n",
1110 "xxxx 14 9 x d w False\n",
1111 "xxxx 14 10 x a a False\n",
1112 "xxxx 14 11 x a f False\n",
1113 "xxxx 14 12 x f g False\n",
1114 "xxxx 14 13 x g g False\n",
1115 "xxxx 14 14 x g f False\n",
1116 "xxxx 14 15 x f h False\n",
1117 "seq1 14 16 x h x True\n",
1118 "xxxx 14 17 x a w False\n",
1119 "xxxx 14 18 x e a False\n",
1120 "xxxx 14 19 x d e False\n",
1121 "xxxx 14 20 x g w False\n",
1122 "seq1 15 0 w ! v False\n",
1123 "xxxx 15 1 w g g False\n",
1124 "xxxx 15 2 w f d False\n",
1125 "xxxx 15 3 w e u False\n",
1126 "xxxx 15 4 w g z False\n",
1127 "xxxx 15 5 w f a False\n",
1128 "xxxx 15 6 w a z False\n",
1129 "xxxx 15 7 w h y False\n",
1130 "xxxx 15 8 w g w False\n",
1131 "xxxx 15 9 w d a False\n",
1132 "xxxx 15 10 w a f False\n",
1133 "xxxx 15 11 w a g False\n",
1134 "xxxx 15 12 w f g False\n",
1135 "xxxx 15 13 w g f False\n",
1136 "xxxx 15 14 w g h False\n",
1137 "xxxx 15 15 w f x False\n",
1138 "seq1 15 16 w h w True\n",
1139 "seq2 15 17 w a a True\n",
1140 "seq2 15 18 w e e True\n",
1141 "xxxx 15 19 w d w False\n",
1142 "xxxx 15 20 w g d False\n",
1143 "seq1 16 0 w ! g False\n",
1144 "xxxx 16 1 w g d False\n",
1145 "xxxx 16 2 w f u False\n",
1146 "xxxx 16 3 w e z False\n",
1147 "xxxx 16 4 w g a False\n",
1148 "xxxx 16 5 w f z False\n",
1149 "xxxx 16 6 w a y False\n",
1150 "xxxx 16 7 w h w False\n",
1151 "xxxx 16 8 w g a False\n",
1152 "xxxx 16 9 w d f False\n",
1153 "xxxx 16 10 w a g False\n",
1154 "xxxx 16 11 w a g False\n",
1155 "xxxx 16 12 w f f False\n",
1156 "xxxx 16 13 w g h False\n",
1157 "xxxx 16 14 w g x False\n",
1158 "xxxx 16 15 w f w False\n",
1159 "xxxx 16 16 w h a False\n",
1160 "xxxx 16 17 w a e False\n",
1161 "seq1 16 18 w e w True\n",
1162 "seq2 16 19 w d d True\n",
1163 "xxxx 16 20 w g x False\n",
1164 "seq1 17 0 x ! d False\n",
1165 "xxxx 17 1 x g u False\n",
1166 "xxxx 17 2 x f z False\n",
1167 "xxxx 17 3 x e a False\n",
1168 "xxxx 17 4 x g z False\n",
1169 "xxxx 17 5 x f y False\n",
1170 "xxxx 17 6 x a w False\n",
1171 "xxxx 17 7 x h a False\n",
1172 "xxxx 17 8 x g f False\n",
1173 "xxxx 17 9 x d g False\n",
1174 "xxxx 17 10 x a g False\n",
1175 "xxxx 17 11 x a f False\n",
1176 "xxxx 17 12 x f h False\n",
1177 "xxxx 17 13 x g x False\n",
1178 "xxxx 17 14 x g w False\n",
1179 "xxxx 17 15 x f a False\n",
1180 "xxxx 17 16 x h e False\n",
1181 "xxxx 17 17 x a w False\n",
1182 "xxxx 17 18 x e d False\n",
1183 "seq1 17 19 x d x True\n",
1184 "xxxx 17 20 x g u False\n",
1185 "seq1 18 0 u ! u False\n",
1186 "xxxx 18 1 u g z False\n",
1187 "xxxx 18 2 u f a False\n",
1188 "xxxx 18 3 u e z False\n",
1189 "xxxx 18 4 u g y False\n",
1190 "xxxx 18 5 u f w False\n",
1191 "xxxx 18 6 u a a False\n",
1192 "xxxx 18 7 u h f False\n",
1193 "xxxx 18 8 u g g False\n",
1194 "xxxx 18 9 u d g False\n",
1195 "xxxx 18 10 u a f False\n",
1196 "xxxx 18 11 u a h False\n",
1197 "xxxx 18 12 u f x False\n",
1198 "xxxx 18 13 u g w False\n",
1199 "xxxx 18 14 u g a False\n",
1200 "xxxx 18 15 u f e False\n",
1201 "xxxx 18 16 u h w False\n",
1202 "xxxx 18 17 u a d False\n",
1203 "xxxx 18 18 u e x False\n",
1204 "seq1 18 19 u d u True\n",
1205 "xxxx 18 20 u g z False\n",
1206 "seq1 19 0 z ! z False\n",
1207 "xxxx 19 1 z g a False\n",
1208 "xxxx 19 2 z f z False\n",
1209 "xxxx 19 3 z e y False\n",
1210 "xxxx 19 4 z g w False\n",
1211 "xxxx 19 5 z f a False\n",
1212 "xxxx 19 6 z a f False\n",
1213 "xxxx 19 7 z h g False\n",
1214 "xxxx 19 8 z g g False\n",
1215 "xxxx 19 9 z d f False\n",
1216 "xxxx 19 10 z a h False\n",
1217 "xxxx 19 11 z a x False\n",
1218 "xxxx 19 12 z f w False\n",
1219 "xxxx 19 13 z g a False\n",
1220 "xxxx 19 14 z g e False\n",
1221 "xxxx 19 15 z f w False\n",
1222 "xxxx 19 16 z h d False\n",
1223 "xxxx 19 17 z a x False\n",
1224 "xxxx 19 18 z e u False\n",
1225 "seq1 19 19 z d z True\n",
1226 "xxxx 19 20 z g x False\n",
1227 "seq1 20 0 x ! a False\n",
1228 "xxxx 20 1 x g z False\n",
1229 "xxxx 20 2 x f y False\n",
1230 "xxxx 20 3 x e w False\n",
1231 "xxxx 20 4 x g a False\n",
1232 "xxxx 20 5 x f f False\n",
1233 "xxxx 20 6 x a g False\n",
1234 "xxxx 20 7 x h g False\n",
1235 "xxxx 20 8 x g f False\n",
1236 "xxxx 20 9 x d h False\n",
1237 "xxxx 20 10 x a x False\n",
1238 "xxxx 20 11 x a w False\n",
1239 "xxxx 20 12 x f a False\n",
1240 "xxxx 20 13 x g e False\n",
1241 "xxxx 20 14 x g w False\n",
1242 "xxxx 20 15 x f d False\n",
1243 "xxxx 20 16 x h x False\n",
1244 "xxxx 20 17 x a u False\n",
1245 "xxxx 20 18 x e z False\n",
1246 "seq1 20 19 x d x True\n",
1247 "seq2 20 20 x g g True\n",
1248 "T T T . . . . . . . . . . . . . . . . . .\n",
1249 ". . T T . . . . . . . . . . . . . . . . .\n",
1250 ". . . T T T T . . . . . . . . . . . . . .\n",
1251 ". . . . . . T . . . . . . . . . . . . . .\n",
1252 ". . . . . . T . . . . . . . . . . . . . .\n",
1253 ". . . . . . T . . . . . . . . . . . . . .\n",
1254 ". . . . . . T . . . . . . . . . . . . . .\n",
1255 ". . . . . . T T . . . . . . . . . . . . .\n",
1256 ". . . . . . . T T T . . . . . . . . . . .\n",
1257 ". . . . . . . . . T . . . . . . . . . . .\n",
1258 ". . . . . . . . . T T . . . . . . . . . .\n",
1259 ". . . . . . . . . . T . . . . . . . . . .\n",
1260 ". . . . . . . . . . T . . . . . . . . . .\n",
1261 ". . . . . . . . . . T T T T T T T . . . .\n",
1262 ". . . . . . . . . . . . . . . . T . . . .\n",
1263 ". . . . . . . . . . . . . . . . T T T . .\n",
1264 ". . . . . . . . . . . . . . . . . . T T .\n",
1265 ". . . . . . . . . . . . . . . . . . . T .\n",
1266 ". . . . . . . . . . . . . . . . . . . T .\n",
1267 ". . . . . . . . . . . . . . . . . . . T .\n",
1268 ". . . . . . . . . . . . . . . . . . . T T\n"
1269 ]
1270 }
1271 ],
1272 "source": [
1273 "v, bp, t = is_interleave(s2, s1, il, return_backpointers=True, return_table=True, debug=True)\n",
1274 "print(show_table(t))"
1275 ]
1276 },
1277 {
1278 "cell_type": "code",
1279 "execution_count": 23,
1280 "metadata": {},
1281 "outputs": [
1282 {
1283 "data": {
1284 "text/plain": [
1285 "'gfZeYgfaZVYUZhVgdUZaZYWafggfhXWaeWdXUZXg'"
1286 ]
1287 },
1288 "execution_count": 23,
1289 "metadata": {},
1290 "output_type": "execute_result"
1291 }
1292 ],
1293 "source": [
1294 "show_backtrace(bp)"
1295 ]
1296 },
1297 {
1298 "cell_type": "code",
1299 "execution_count": 24,
1300 "metadata": {},
1301 "outputs": [
1302 {
1303 "name": "stdout",
1304 "output_type": "stream",
1305 "text": [
1306 "T T T . . . . . . . . . . . . . . . . . .\n",
1307 ". . T T . . . . . . . . . . . . . . . . .\n",
1308 ". . . T T T T . . . . . . . . . . . . . .\n",
1309 ". . . . . . T . . . . . . . . . . . . . .\n",
1310 ". . . . . . T . . . . . . . . . . . . . .\n",
1311 ". . . . . . T . . . . . . . . . . . . . .\n",
1312 ". . . . . . T . . . . . . . . . . . . . .\n",
1313 ". . . . . . T T . . . . . . . . . . . . .\n",
1314 ". . . . . . . T T T . . . . . . . . . . .\n",
1315 ". . . . . . . . . T . . . . . . . . . . .\n",
1316 ". . . . . . . . . T T . . . . . . . . . .\n",
1317 ". . . . . . . . . . T . . . . . . . . . .\n",
1318 ". . . . . . . . . . T . . . . . . . . . .\n",
1319 ". . . . . . . . . . T T T T T T T . . . .\n",
1320 ". . . . . . . . . . . . . . . . T . . . .\n",
1321 ". . . . . . . . . . . . . . . . T T T . .\n",
1322 ". . . . . . . . . . . . . . . . . . T T .\n",
1323 ". . . . . . . . . . . . . . . . . . . T .\n",
1324 ". . . . . . . . . . . . . . . . . . . T .\n",
1325 ". . . . . . . . . . . . . . . . . . . T .\n",
1326 ". . . . . . . . . . . . . . . . . . . T T\n",
1327 "gfZeYgfaZVYUZhVgdUZaZYWafggfhXWaeWdXUZXg\n"
1328 ]
1329 },
1330 {
1331 "data": {
1332 "text/plain": [
1333 "True"
1334 ]
1335 },
1336 "execution_count": 24,
1337 "metadata": {},
1338 "output_type": "execute_result"
1339 }
1340 ],
1341 "source": [
1342 "v, bp, t = is_interleave(s2, s1, il, return_backpointers=True, return_table=True)\n",
1343 "print(show_table(t))\n",
1344 "print(show_backtrace(bp))\n",
1345 "v"
1346 ]
1347 },
1348 {
1349 "cell_type": "code",
1350 "execution_count": 25,
1351 "metadata": {},
1352 "outputs": [
1353 {
1354 "data": {
1355 "text/plain": [
1356 "('chcceahdchbdeahgacbfbfebfefacfebhhcdfgfgggfeahaadd',\n",
1357 " 'fbhafageadeedbcdfffaabefeeffaffgebdbchcgfcgggecbgh',\n",
1358 " 'chccfbehaahfdcagheabdedeaehgdabccbfdbfebffeffafacfaebefeebfhhcdfafffgebdgfgggbfchceahgaafdcgdggecbgh',\n",
1359 " 100)"
1360 ]
1361 },
1362 "execution_count": 25,
1363 "metadata": {},
1364 "output_type": "execute_result"
1365 }
1366 ],
1367 "source": [
1368 "s1 = make_string(50)\n",
1369 "s2 = make_string(50)\n",
1370 "il = interleave(s1, s2)\n",
1371 "s1, s2, il, len(il)"
1372 ]
1373 },
1374 {
1375 "cell_type": "code",
1376 "execution_count": 26,
1377 "metadata": {},
1378 "outputs": [
1379 {
1380 "name": "stdout",
1381 "output_type": "stream",
1382 "text": [
1383 "T T T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1384 ". . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1385 ". . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1386 ". . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1387 ". . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1388 ". . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1389 ". . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1390 ". . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1391 ". . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1392 ". . . . . . . . . . T T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1393 ". . . . . . . . . . . T . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1394 ". . . . . . . . . . . T T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1395 ". . . . . . . . . . . . T . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1396 ". . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1397 ". . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1398 ". . . . . . . . . . . . . . . . . T T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1399 ". . . . . . . . . . . . . . . . . . . . T T T T T T . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1400 ". . . . . . . . . . . . . . . . . . . . . T . . T T T T . . . . . . . . . . . . . . . . . . . . . . .\n",
1401 ". . . . . . . . . . . . . . . . . . . . . . . . T . T T T . . . . . . . . . . . . . . . . . . . . . .\n",
1402 ". . . . . . . . . . . . . . . . . . . . . . . . . . T . T . . . . . . . . . . . . . . . . . . . . . .\n",
1403 ". . . . . . . . . . . . . . . . . . . . . . . . . . T T T T T . . . . . . . . . . . . . . . . . . . .\n",
1404 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T . . T T T . . . . . . . . . . . . . . . . . .\n",
1405 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . .\n",
1406 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . .\n",
1407 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . .\n",
1408 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . .\n",
1409 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . .\n",
1410 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T T T . . . . . . . . . . . . .\n",
1411 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . .\n",
1412 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . .\n",
1413 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . .\n",
1414 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T . . . . . . . . . . . .\n",
1415 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . .\n",
1416 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . .\n",
1417 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . .\n",
1418 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T T T . . . . . . . .\n",
1419 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . .\n",
1420 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . .\n",
1421 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . .\n",
1422 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T . . . .\n",
1423 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T . .\n",
1424 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T .\n",
1425 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T .\n",
1426 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T\n",
1427 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1428 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1429 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1430 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1431 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1432 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1433 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T\n",
1434 "chccFBeHaAhFdcAGhEAbdeDEaEhgDaBcCbfDbfebfFefFaFAcfAeBEFEEbFhhcdFAfFFGEBDgfgggBfCHCeahGaaFdCGdGGECBGH\n"
1435 ]
1436 },
1437 {
1438 "data": {
1439 "text/plain": [
1440 "True"
1441 ]
1442 },
1443 "execution_count": 26,
1444 "metadata": {},
1445 "output_type": "execute_result"
1446 }
1447 ],
1448 "source": [
1449 "v, bp, t = is_interleave(s2, s1, il, return_backpointers=True, return_table=True)\n",
1450 "print(show_table(t))\n",
1451 "print(show_backtrace(bp))\n",
1452 "v"
1453 ]
1454 },
1455 {
1456 "cell_type": "code",
1457 "execution_count": 27,
1458 "metadata": {},
1459 "outputs": [
1460 {
1461 "name": "stdout",
1462 "output_type": "stream",
1463 "text": [
1464 "1000 loops, best of 3: 1.31 ms per loop\n"
1465 ]
1466 }
1467 ],
1468 "source": [
1469 "%%timeit\n",
1470 "is_interleave(s2, s1, il)"
1471 ]
1472 },
1473 {
1474 "cell_type": "code",
1475 "execution_count": 28,
1476 "metadata": {},
1477 "outputs": [
1478 {
1479 "name": "stdout",
1480 "output_type": "stream",
1481 "text": [
1482 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1483 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1484 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1485 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1486 "T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1487 ". . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1488 ". . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1489 ". . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1490 ". . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1491 ". . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1492 ". . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1493 ". . . . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1494 ". . . . . . . . . T . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1495 ". . . . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1496 ". . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1497 ". . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1498 ". . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1499 ". . . . . . . . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1500 ". . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1501 ". . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1502 ". . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1503 ". . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1504 ". . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1505 ". . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1506 ". . . . . . . . . . . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1507 ". . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1508 ". . . . . . . . . . . . . . . . . T T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1509 ". . . . . . . . . . . . . . . . . T T . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1510 ". . . . . . . . . . . . . . . . . . T T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1511 ". . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1512 ". . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1513 ". . . . . . . . . . . . . . . . . . . . . T T T T T T . . . . . . . . . . . . . . . . . . . . . . . .\n",
1514 ". . . . . . . . . . . . . . . . . . . . . T . . . . T T . . . . . . . . . . . . . . . . . . . . . . .\n",
1515 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . .\n",
1516 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . .\n",
1517 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . . . . . . . . . .\n",
1518 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T T . . . . . . . . . . . . . . . . . . .\n",
1519 ". . . . . . . . . . . . . . . . . . . . . . . . . . . T . T T T T T T T . . . . . . . . . . . . . . .\n",
1520 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . T . . . . . . . . . . . . . . .\n",
1521 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . .\n",
1522 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . .\n",
1523 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . . . . . .\n",
1524 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . . . . . .\n",
1525 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T . . . . . . . . . . .\n",
1526 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . .\n",
1527 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . . .\n",
1528 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . . .\n",
1529 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T . . . . . . . . . .\n",
1530 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T . . . . . . . . .\n",
1531 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T . . . . . . .\n",
1532 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T T T T T T T T\n",
1533 "CHCCfbEhaAHfDCagHeaBdeDEAeHGdAbcCBFdBFEBfFEffaFACFaEbefeeBfHHCDfaffFgebdGFGGGbFchcEAHgAAfDcgDggecbgh\n"
1534 ]
1535 },
1536 {
1537 "data": {
1538 "text/plain": [
1539 "True"
1540 ]
1541 },
1542 "execution_count": 28,
1543 "metadata": {},
1544 "output_type": "execute_result"
1545 }
1546 ],
1547 "source": [
1548 "v, bp, t = is_interleave(s1, s2, il, return_backpointers=True, return_table=True)\n",
1549 "print(show_table(t))\n",
1550 "print(show_backtrace(bp))\n",
1551 "v"
1552 ]
1553 },
1554 {
1555 "cell_type": "code",
1556 "execution_count": 29,
1557 "metadata": {},
1558 "outputs": [
1559 {
1560 "data": {
1561 "text/plain": [
1562 "True"
1563 ]
1564 },
1565 "execution_count": 29,
1566 "metadata": {},
1567 "output_type": "execute_result"
1568 }
1569 ],
1570 "source": [
1571 "show_backtrace(bp).lower() == il"
1572 ]
1573 },
1574 {
1575 "cell_type": "code",
1576 "execution_count": 30,
1577 "metadata": {},
1578 "outputs": [
1579 {
1580 "data": {
1581 "text/plain": [
1582 "('cbchedabcadedhfafahdaacbhhhedfhgceafghceehaefaebcc', False, False)"
1583 ]
1584 },
1585 "execution_count": 30,
1586 "metadata": {},
1587 "output_type": "execute_result"
1588 }
1589 ],
1590 "source": [
1591 "s3 = make_string(50)\n",
1592 "s3, is_interleave(s1, s3, il), is_interleave(s2, s3, il)"
1593 ]
1594 },
1595 {
1596 "cell_type": "code",
1597 "execution_count": 31,
1598 "metadata": {},
1599 "outputs": [
1600 {
1601 "name": "stdout",
1602 "output_type": "stream",
1603 "text": [
1604 "T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1605 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1606 "T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1607 "T T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1608 "T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1609 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1610 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1611 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1612 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1613 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1614 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1615 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1616 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1617 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1618 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1619 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1620 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1621 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1622 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1623 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1624 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1625 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1626 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1627 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1628 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1629 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1630 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1631 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1632 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1633 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1634 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1635 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1636 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1637 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1638 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1639 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1640 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1641 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1642 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1643 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1644 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1645 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1646 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1647 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1648 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1649 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1650 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1651 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1652 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1653 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1654 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
1655 "\n"
1656 ]
1657 },
1658 {
1659 "data": {
1660 "text/plain": [
1661 "False"
1662 ]
1663 },
1664 "execution_count": 31,
1665 "metadata": {},
1666 "output_type": "execute_result"
1667 }
1668 ],
1669 "source": [
1670 "v, bp, t = is_interleave(s1, s3, il, return_backpointers=True, return_table=True)\n",
1671 "print(show_table(t))\n",
1672 "print(show_backtrace(bp))\n",
1673 "v"
1674 ]
1675 },
1676 {
1677 "cell_type": "code",
1678 "execution_count": 32,
1679 "metadata": {
1680 "collapsed": true
1681 },
1682 "outputs": [],
1683 "source": [
1684 "def is_interleave_recursive(s1, s2, s3):\n",
1685 " if not s1:\n",
1686 " return s2 == s3\n",
1687 " elif not s2:\n",
1688 " return s1 == s3\n",
1689 " elif len(s1) + len(s2) != len(s3):\n",
1690 " return False\n",
1691 " else:\n",
1692 " if s1[-1] == s3[-1] and s2[-1] == s3[-1]:\n",
1693 " return (is_interleave_recursive(s1[:-1], s2, s3[:-1]) \n",
1694 " or \n",
1695 " is_interleave_recursive(s1, s2[:-1], s3[:-1]) )\n",
1696 " elif s1[-1] == s3[-1]:\n",
1697 " return is_interleave_recursive(s1[:-1], s2, s3[:-1])\n",
1698 " elif s2[-1] == s3[-1]:\n",
1699 " return is_interleave_recursive(s1, s2[:-1], s3[:-1])\n",
1700 " else:\n",
1701 " return False"
1702 ]
1703 },
1704 {
1705 "cell_type": "code",
1706 "execution_count": 33,
1707 "metadata": {
1708 "collapsed": true
1709 },
1710 "outputs": [],
1711 "source": [
1712 "import uuid"
1713 ]
1714 },
1715 {
1716 "cell_type": "code",
1717 "execution_count": 34,
1718 "metadata": {
1719 "collapsed": true
1720 },
1721 "outputs": [],
1722 "source": [
1723 "def is_subseq_recursive_dot(s1, s2):\n",
1724 " node_id = uuid.uuid4().hex\n",
1725 " node_string = 'n{} [label=\"{}\\\\n{}\"];'.format(node_id, s1, s2)\n",
1726 "# print(s1, s2, node_string)\n",
1727 " if not s1:\n",
1728 " return node_id, ['n{} [label=\"-\\\\n{}\\\\nTrue\"];'.format(node_id, s2)]\n",
1729 " elif len(s1) > len(s2):\n",
1730 " return node_id, ['n{} [label=\"{}\\\\n{}\\\\nFalse\"];'.format(node_id, s1, s2)]\n",
1731 " else:\n",
1732 " if s1[-1] == s2[-1]:\n",
1733 " node1_id, node1_graph = is_subseq_recursive_dot(s1[:-1], s2[:-1])\n",
1734 " node2_id, node2_graph = is_subseq_recursive_dot(s1, s2[:-1])\n",
1735 " return node_id, ([node_string, \n",
1736 " 'n{} -> n{};'.format(node_id, node1_id), \n",
1737 " 'n{} -> n{};'.format(node_id, node2_id)] + \n",
1738 " node1_graph + node2_graph)\n",
1739 " else:\n",
1740 " node1_id, node1_graph = is_subseq_recursive_dot(s1, s2[:-1])\n",
1741 " return node_id, ([node_string, \n",
1742 " 'n{} -> n{};'.format(node_id, node1_id)] + \n",
1743 " node1_graph)"
1744 ]
1745 },
1746 {
1747 "cell_type": "code",
1748 "execution_count": 35,
1749 "metadata": {
1750 "collapsed": true
1751 },
1752 "outputs": [],
1753 "source": [
1754 "def is_interleave_recursive_dot(s1, s2, s3):\n",
1755 " \n",
1756 "# print(s1, s2, s3)\n",
1757 " node_id = uuid.uuid4().hex\n",
1758 " node_string = 'n{} [label=\"{}\\\\n{}\\\\n{}\"];'.format(node_id, s1, s2, s3)\n",
1759 "\n",
1760 " if not s1:\n",
1761 " if s2 == s3:\n",
1762 " return node_id, ['n{} [label=\"-\\\\n{}\\\\n{}\\\\nTrue\"];'.format(node_id, s2, s3)]\n",
1763 " else:\n",
1764 " return node_id, ['n{} [label=\"-\\\\n{}\\\\n{}\\\\nFalse\"];'.format(node_id, s2, s3)]\n",
1765 " elif not s2:\n",
1766 " if s1 == s3:\n",
1767 " return node_id, ['n{} [label=\"{}\\\\n-\\\\n{}\\\\nTrue\"];'.format(node_id, s1, s3)]\n",
1768 " else:\n",
1769 " return node_id, ['n{} [label=\"{}\\\\n-\\\\n{}\\\\nFalse\"];'.format(node_id, s1, s3)]\n",
1770 " else:\n",
1771 " if s1[-1] == s2[-1] and s1[-1] == s3[-1]:\n",
1772 " node1_id, node1_graph = is_interleave_recursive_dot(s1[:-1], s2, s3[:-1])\n",
1773 " node2_id, node2_graph = is_interleave_recursive_dot(s1, s2[:-1], s3[:-1])\n",
1774 " return node_id, ([node_string, \n",
1775 " 'n{} -> n{};'.format(node_id, node1_id), \n",
1776 " 'n{} -> n{};'.format(node_id, node2_id)] + \n",
1777 " node1_graph + node2_graph)\n",
1778 " elif s1[-1] == s3[-1]:\n",
1779 " node1_id, node1_graph = is_interleave_recursive_dot(s1[:-1], s2, s3[:-1])\n",
1780 " return node_id, ([node_string, \n",
1781 " 'n{} -> n{};'.format(node_id, node1_id)] + \n",
1782 " node1_graph)\n",
1783 " elif s2[-1] == s3[-1]:\n",
1784 " node1_id, node1_graph = is_interleave_recursive_dot(s1, s2[:-1], s3[:-1])\n",
1785 " return node_id, ([node_string, \n",
1786 " 'n{} -> n{};'.format(node_id, node1_id)] + \n",
1787 " node1_graph)\n",
1788 " else:\n",
1789 " return node_id, ['n{} [label=\"{}\\\\n{}\\\\n{}\\\\nFalse\"];'.format(node_id, s1, s2, s3)]"
1790 ]
1791 },
1792 {
1793 "cell_type": "code",
1794 "execution_count": 36,
1795 "metadata": {
1796 "collapsed": true
1797 },
1798 "outputs": [],
1799 "source": [
1800 "s1 = \"aabcc\"\n",
1801 "s2 = \"dbbca\"\n",
1802 "\n",
1803 "s3t = \"aadbbcbcac\"\n",
1804 "s3f = \"aadbbbaccc\""
1805 ]
1806 },
1807 {
1808 "cell_type": "code",
1809 "execution_count": 37,
1810 "metadata": {},
1811 "outputs": [
1812 {
1813 "name": "stdout",
1814 "output_type": "stream",
1815 "text": [
1816 "T . . . . .\n",
1817 "T . . . . .\n",
1818 "T T T T T .\n",
1819 ". T T . T .\n",
1820 ". . T T T T\n",
1821 ". . . T . T\n",
1822 "AAdbbcBCaC\n"
1823 ]
1824 }
1825 ],
1826 "source": [
1827 "v, bp, t = is_interleave(s1, s2, s3t, return_backpointers=True, return_table=True)\n",
1828 "print(show_table(t))\n",
1829 "print(show_backtrace(bp))"
1830 ]
1831 },
1832 {
1833 "cell_type": "code",
1834 "execution_count": 38,
1835 "metadata": {
1836 "collapsed": true
1837 },
1838 "outputs": [],
1839 "source": [
1840 "def show_table_md(table, s1, s2, s3):\n",
1841 " header = '| |' + '|'.join('{}<br />{}'.format('<br />'.join(str(s2[:i])), i) for i in range(len(s2) + 1)) + '|'\n",
1842 " separator = '|:---:' * (len(s2) + 2) + '|'\n",
1843 " rows = []\n",
1844 " columns = sorted(set(k[1] for k in table))\n",
1845 " for r in range(len(s1) + 1):\n",
1846 " row = '|**{}<br />{}**|'.format(r, s1[:r])\n",
1847 " row += '|'.join('{}<br />T'.format(s3[:(r+c)]) if table[r, c] else '{}<br />.'.format(s3[:(r+c)]) for c in columns)\n",
1848 " row += '|'\n",
1849 " rows += [row]\n",
1850 " return '\\n'.join([header] + [separator] + rows)"
1851 ]
1852 },
1853 {
1854 "cell_type": "code",
1855 "execution_count": 39,
1856 "metadata": {},
1857 "outputs": [
1858 {
1859 "name": "stdout",
1860 "output_type": "stream",
1861 "text": [
1862 "| |<br />0|d<br />1|d<br />b<br />2|d<br />b<br />b<br />3|d<br />b<br />b<br />c<br />4|d<br />b<br />b<br />c<br />a<br />5|\n",
1863 "|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n",
1864 "|**0<br />**|<br />T|a<br />.|aa<br />.|aad<br />.|aadb<br />.|aadbb<br />.|\n",
1865 "|**1<br />a**|a<br />T|aa<br />.|aad<br />.|aadb<br />.|aadbb<br />.|aadbbc<br />.|\n",
1866 "|**2<br />aa**|aa<br />T|aad<br />T|aadb<br />T|aadbb<br />T|aadbbc<br />T|aadbbcb<br />.|\n",
1867 "|**3<br />aab**|aad<br />.|aadb<br />T|aadbb<br />T|aadbbc<br />.|aadbbcb<br />T|aadbbcbc<br />.|\n",
1868 "|**4<br />aabc**|aadb<br />.|aadbb<br />.|aadbbc<br />T|aadbbcb<br />T|aadbbcbc<br />T|aadbbcbca<br />T|\n",
1869 "|**5<br />aabcc**|aadbb<br />.|aadbbc<br />.|aadbbcb<br />.|aadbbcbc<br />T|aadbbcbca<br />.|aadbbcbcac<br />T|\n"
1870 ]
1871 }
1872 ],
1873 "source": [
1874 "print(show_table_md(t, s1, s2, s3t))"
1875 ]
1876 },
1877 {
1878 "cell_type": "markdown",
1879 "metadata": {},
1880 "source": [
1881 "| |<br />0|d<br />1|d<br />b<br />2|d<br />b<br />b<br />3|d<br />b<br />b<br />c<br />4|d<br />b<br />b<br />c<br />a<br />5|\n",
1882 "|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n",
1883 "|**0<br />**|<br />T|a<br />.|aa<br />.|aad<br />.|aadb<br />.|aadbb<br />.|\n",
1884 "|**1<br />a**|a<br />T|aa<br />.|aad<br />.|aadb<br />.|aadbb<br />.|aadbbc<br />.|\n",
1885 "|**2<br />aa**|aa<br />T|aad<br />T|aadb<br />T|aadbb<br />T|aadbbc<br />T|aadbbcb<br />.|\n",
1886 "|**3<br />aab**|aad<br />.|aadb<br />T|aadbb<br />T|aadbbc<br />.|aadbbcb<br />T|aadbbcbc<br />.|\n",
1887 "|**4<br />aabc**|aadb<br />.|aadbb<br />.|aadbbc<br />T|aadbbcb<br />T|aadbbcbc<br />T|aadbbcbca<br />T|\n",
1888 "|**5<br />aabcc**|aadbb<br />.|aadbbc<br />.|aadbbcb<br />.|aadbbcbc<br />T|aadbbcbca<br />.|aadbbcbcac<br />T|"
1889 ]
1890 },
1891 {
1892 "cell_type": "code",
1893 "execution_count": 40,
1894 "metadata": {},
1895 "outputs": [
1896 {
1897 "name": "stdout",
1898 "output_type": "stream",
1899 "text": [
1900 "T T T T\n",
1901 "T . T .\n",
1902 ". . T T\n",
1903 ". . . T\n",
1904 "abACaB\n"
1905 ]
1906 }
1907 ],
1908 "source": [
1909 "e1 = 'acb'\n",
1910 "e2 = 'aba'\n",
1911 "e3 = 'abacab'\n",
1912 "v, bp, et = is_interleave(e1, e2, e3, return_backpointers=True, return_table=True)\n",
1913 "print(show_table(et))\n",
1914 "print(show_backtrace(bp))"
1915 ]
1916 },
1917 {
1918 "cell_type": "code",
1919 "execution_count": 41,
1920 "metadata": {},
1921 "outputs": [
1922 {
1923 "name": "stdout",
1924 "output_type": "stream",
1925 "text": [
1926 "| |<br />0|a<br />1|a<br />b<br />2|a<br />b<br />a<br />3|\n",
1927 "|:---:|:---:|:---:|:---:|:---:|\n",
1928 "|**0<br />**|<br />T|a<br />T|ab<br />T|aba<br />T|\n",
1929 "|**1<br />a**|a<br />T|ab<br />.|aba<br />T|abac<br />.|\n",
1930 "|**2<br />ac**|ab<br />.|aba<br />.|abac<br />T|abaca<br />T|\n",
1931 "|**3<br />acb**|aba<br />.|abac<br />.|abaca<br />.|abacab<br />T|\n"
1932 ]
1933 }
1934 ],
1935 "source": [
1936 "print(show_table_md(et, e1, e2, e3))"
1937 ]
1938 },
1939 {
1940 "cell_type": "markdown",
1941 "metadata": {},
1942 "source": [
1943 "| |<br />0|a<br />1|a<br />b<br />2|a<br />b<br />a<br />3|\n",
1944 "|:---:|:---:|:---:|:---:|:---:|\n",
1945 "|**0<br />**|<br />T|a<br />T|ab<br />T|aba<br />T|\n",
1946 "|**1<br />a**|a<br />T|ab<br />.|aba<br />T|abac<br />.|\n",
1947 "|**2<br />ac**|ab<br />.|aba<br />.|abac<br />T|abaca<br />T|\n",
1948 "|**3<br />acb**|aba<br />.|abac<br />.|abaca<br />.|abacab<br />T|"
1949 ]
1950 },
1951 {
1952 "cell_type": "code",
1953 "execution_count": 42,
1954 "metadata": {
1955 "scrolled": true
1956 },
1957 "outputs": [
1958 {
1959 "name": "stdout",
1960 "output_type": "stream",
1961 "text": [
1962 "ndf96f65c85de45ba814c3aebe4afed65 [label=\"aabcc\\ndbbca\\naadbbcbcac\"];\n",
1963 "ndf96f65c85de45ba814c3aebe4afed65 -> n0e6e480c9d664ba2af7e041445763b66;\n",
1964 "n0e6e480c9d664ba2af7e041445763b66 [label=\"aabc\\ndbbca\\naadbbcbca\"];\n",
1965 "n0e6e480c9d664ba2af7e041445763b66 -> nc7f25932eaf1431cb98430f8b1644221;\n",
1966 "nc7f25932eaf1431cb98430f8b1644221 [label=\"aabc\\ndbbc\\naadbbcbc\"];\n",
1967 "nc7f25932eaf1431cb98430f8b1644221 -> ncd2942f9e99443619c6ce1d72a10da75;\n",
1968 "nc7f25932eaf1431cb98430f8b1644221 -> n0e76b3b46aba4a8abdbd569a0762170a;\n",
1969 "ncd2942f9e99443619c6ce1d72a10da75 [label=\"aab\\ndbbc\\naadbbcb\"];\n",
1970 "ncd2942f9e99443619c6ce1d72a10da75 -> n4762ffa7e0c6426792438c6f84c9d2f9;\n",
1971 "n4762ffa7e0c6426792438c6f84c9d2f9 [label=\"aa\\ndbbc\\naadbbc\"];\n",
1972 "n4762ffa7e0c6426792438c6f84c9d2f9 -> n9434633af1674b45ae72a987932bcacc;\n",
1973 "n9434633af1674b45ae72a987932bcacc [label=\"aa\\ndbb\\naadbb\"];\n",
1974 "n9434633af1674b45ae72a987932bcacc -> n72dd6ed85e8d43d39b1c6b240f672815;\n",
1975 "n72dd6ed85e8d43d39b1c6b240f672815 [label=\"aa\\ndb\\naadb\"];\n",
1976 "n72dd6ed85e8d43d39b1c6b240f672815 -> nf904e4ea330a48028602500e910001ba;\n",
1977 "nf904e4ea330a48028602500e910001ba [label=\"aa\\nd\\naad\"];\n",
1978 "nf904e4ea330a48028602500e910001ba -> nc2246b72d95748f5984f7a9a922afafa;\n",
1979 "nc2246b72d95748f5984f7a9a922afafa [label=\"aa\\n-\\naa\\nTrue\"];\n",
1980 "n0e76b3b46aba4a8abdbd569a0762170a [label=\"aabc\\ndbb\\naadbbcb\"];\n",
1981 "n0e76b3b46aba4a8abdbd569a0762170a -> nde239312af534c47988db27094dc5e3b;\n",
1982 "nde239312af534c47988db27094dc5e3b [label=\"aabc\\ndb\\naadbbc\"];\n",
1983 "nde239312af534c47988db27094dc5e3b -> n0571e43544db4baea762dd9382a90eab;\n",
1984 "n0571e43544db4baea762dd9382a90eab [label=\"aab\\ndb\\naadbb\"];\n",
1985 "n0571e43544db4baea762dd9382a90eab -> nd24f1944051440d6b94710a3b971c134;\n",
1986 "n0571e43544db4baea762dd9382a90eab -> n671eff7dd1f945a28e7bcd0647d7d40d;\n",
1987 "nd24f1944051440d6b94710a3b971c134 [label=\"aa\\ndb\\naadb\"];\n",
1988 "nd24f1944051440d6b94710a3b971c134 -> n26480b1bcee847adaeb205f2e844a4e5;\n",
1989 "n26480b1bcee847adaeb205f2e844a4e5 [label=\"aa\\nd\\naad\"];\n",
1990 "n26480b1bcee847adaeb205f2e844a4e5 -> n162a36ef08174bafa51dbf89a58965df;\n",
1991 "n162a36ef08174bafa51dbf89a58965df [label=\"aa\\n-\\naa\\nTrue\"];\n",
1992 "n671eff7dd1f945a28e7bcd0647d7d40d [label=\"aab\\nd\\naadb\"];\n",
1993 "n671eff7dd1f945a28e7bcd0647d7d40d -> n8d9c2dc78a9047d4a243d316e87dd782;\n",
1994 "n8d9c2dc78a9047d4a243d316e87dd782 [label=\"aa\\nd\\naad\"];\n",
1995 "n8d9c2dc78a9047d4a243d316e87dd782 -> n6d893e899f6f4f77a30c3be1eeef25d0;\n",
1996 "n6d893e899f6f4f77a30c3be1eeef25d0 [label=\"aa\\n-\\naa\\nTrue\"];\n"
1997 ]
1998 }
1999 ],
2000 "source": [
2001 "root, graph = is_interleave_recursive_dot(s1, s2, s3t)\n",
2002 "print('\\n'.join(graph))"
2003 ]
2004 },
2005 {
2006 "cell_type": "code",
2007 "execution_count": 43,
2008 "metadata": {
2009 "scrolled": true
2010 },
2011 "outputs": [
2012 {
2013 "name": "stdout",
2014 "output_type": "stream",
2015 "text": [
2016 "n8ab105a57ff44daa8fa8c0bd8275721c [label=\"aaa\\naaa\\naaaaaa\"];\n",
2017 "n8ab105a57ff44daa8fa8c0bd8275721c -> ndd3ec050e4d441ba9f5eca4140804aa2;\n",
2018 "n8ab105a57ff44daa8fa8c0bd8275721c -> n5fe9af06410d4e3796f3e5b09724befb;\n",
2019 "ndd3ec050e4d441ba9f5eca4140804aa2 [label=\"aa\\naaa\\naaaaa\"];\n",
2020 "ndd3ec050e4d441ba9f5eca4140804aa2 -> n4da003b54dd94728a1aa1890f1a9250a;\n",
2021 "ndd3ec050e4d441ba9f5eca4140804aa2 -> ncb2a3fd92dc6414a99dc115990760e7c;\n",
2022 "n4da003b54dd94728a1aa1890f1a9250a [label=\"a\\naaa\\naaaa\"];\n",
2023 "n4da003b54dd94728a1aa1890f1a9250a -> n699e6ec8bba74ec394a68d5c2d306c30;\n",
2024 "n4da003b54dd94728a1aa1890f1a9250a -> n71376b3b5e614617ba68dccf8d9677cc;\n",
2025 "n699e6ec8bba74ec394a68d5c2d306c30 [label=\"-\\naaa\\naaa\\nTrue\"];\n",
2026 "n71376b3b5e614617ba68dccf8d9677cc [label=\"a\\naa\\naaa\"];\n",
2027 "n71376b3b5e614617ba68dccf8d9677cc -> nb876b970b38f4ba2937a69ba491f308c;\n",
2028 "n71376b3b5e614617ba68dccf8d9677cc -> nfb2ebec95c5c46c6b160c511031f5417;\n",
2029 "nb876b970b38f4ba2937a69ba491f308c [label=\"-\\naa\\naa\\nTrue\"];\n",
2030 "nfb2ebec95c5c46c6b160c511031f5417 [label=\"a\\na\\naa\"];\n",
2031 "nfb2ebec95c5c46c6b160c511031f5417 -> ndcf30cbbd8f646adb30c01e8fbc8aaaf;\n",
2032 "nfb2ebec95c5c46c6b160c511031f5417 -> n9bb6593bab3c47e59f83df2767b67a3a;\n",
2033 "ndcf30cbbd8f646adb30c01e8fbc8aaaf [label=\"-\\na\\na\\nTrue\"];\n",
2034 "n9bb6593bab3c47e59f83df2767b67a3a [label=\"a\\n-\\na\\nTrue\"];\n",
2035 "ncb2a3fd92dc6414a99dc115990760e7c [label=\"aa\\naa\\naaaa\"];\n",
2036 "ncb2a3fd92dc6414a99dc115990760e7c -> n937d754714994223bc97015534e1806e;\n",
2037 "ncb2a3fd92dc6414a99dc115990760e7c -> n553eac2d6c4542448a5c82b781e963b1;\n",
2038 "n937d754714994223bc97015534e1806e [label=\"a\\naa\\naaa\"];\n",
2039 "n937d754714994223bc97015534e1806e -> n08a6688eb7df48f8834787728a0e36a2;\n",
2040 "n937d754714994223bc97015534e1806e -> n063d395576474c5b82d810b2b70e7e3c;\n",
2041 "n08a6688eb7df48f8834787728a0e36a2 [label=\"-\\naa\\naa\\nTrue\"];\n",
2042 "n063d395576474c5b82d810b2b70e7e3c [label=\"a\\na\\naa\"];\n",
2043 "n063d395576474c5b82d810b2b70e7e3c -> n04b9f6aea46c458da227558ab02a0b4c;\n",
2044 "n063d395576474c5b82d810b2b70e7e3c -> nc067208a5ab64f8c9904d58b738b81e4;\n",
2045 "n04b9f6aea46c458da227558ab02a0b4c [label=\"-\\na\\na\\nTrue\"];\n",
2046 "nc067208a5ab64f8c9904d58b738b81e4 [label=\"a\\n-\\na\\nTrue\"];\n",
2047 "n553eac2d6c4542448a5c82b781e963b1 [label=\"aa\\na\\naaa\"];\n",
2048 "n553eac2d6c4542448a5c82b781e963b1 -> n5d50905c46ce4dc8bcb59fb62984fa54;\n",
2049 "n553eac2d6c4542448a5c82b781e963b1 -> n6768e9ad78804e65b1bde9cb655f2a60;\n",
2050 "n5d50905c46ce4dc8bcb59fb62984fa54 [label=\"a\\na\\naa\"];\n",
2051 "n5d50905c46ce4dc8bcb59fb62984fa54 -> n22bc48dd2aa84e79a387252cc28f3a92;\n",
2052 "n5d50905c46ce4dc8bcb59fb62984fa54 -> n853ef88a20ee48a4bccf390498c96f5d;\n",
2053 "n22bc48dd2aa84e79a387252cc28f3a92 [label=\"-\\na\\na\\nTrue\"];\n",
2054 "n853ef88a20ee48a4bccf390498c96f5d [label=\"a\\n-\\na\\nTrue\"];\n",
2055 "n6768e9ad78804e65b1bde9cb655f2a60 [label=\"aa\\n-\\naa\\nTrue\"];\n",
2056 "n5fe9af06410d4e3796f3e5b09724befb [label=\"aaa\\naa\\naaaaa\"];\n",
2057 "n5fe9af06410d4e3796f3e5b09724befb -> ne6b19fc7e02b4981a1edc20c7fe0cce0;\n",
2058 "n5fe9af06410d4e3796f3e5b09724befb -> ne0c07d6d54f045a5b4bf9eb10bd8d810;\n",
2059 "ne6b19fc7e02b4981a1edc20c7fe0cce0 [label=\"aa\\naa\\naaaa\"];\n",
2060 "ne6b19fc7e02b4981a1edc20c7fe0cce0 -> n9d2cfd4e9cf2473bbd05a8a7e2a96714;\n",
2061 "ne6b19fc7e02b4981a1edc20c7fe0cce0 -> n3d4e61bc032c4f8387c269d8ac49cc3f;\n",
2062 "n9d2cfd4e9cf2473bbd05a8a7e2a96714 [label=\"a\\naa\\naaa\"];\n",
2063 "n9d2cfd4e9cf2473bbd05a8a7e2a96714 -> n214f88e71d504eaba78b46c5a5bbe31d;\n",
2064 "n9d2cfd4e9cf2473bbd05a8a7e2a96714 -> n2890559b11cb49c9aa083a76a7b68ce4;\n",
2065 "n214f88e71d504eaba78b46c5a5bbe31d [label=\"-\\naa\\naa\\nTrue\"];\n",
2066 "n2890559b11cb49c9aa083a76a7b68ce4 [label=\"a\\na\\naa\"];\n",
2067 "n2890559b11cb49c9aa083a76a7b68ce4 -> n5d37f312b10341d09e2faa4fb4f40e3c;\n",
2068 "n2890559b11cb49c9aa083a76a7b68ce4 -> nd73fc499c4214ddbbe7155f97c9ff394;\n",
2069 "n5d37f312b10341d09e2faa4fb4f40e3c [label=\"-\\na\\na\\nTrue\"];\n",
2070 "nd73fc499c4214ddbbe7155f97c9ff394 [label=\"a\\n-\\na\\nTrue\"];\n",
2071 "n3d4e61bc032c4f8387c269d8ac49cc3f [label=\"aa\\na\\naaa\"];\n",
2072 "n3d4e61bc032c4f8387c269d8ac49cc3f -> nfac20fc8bb7441f891ac0380259f3b76;\n",
2073 "n3d4e61bc032c4f8387c269d8ac49cc3f -> n9d9c86dc313f48b69d9c2693ee32e7ab;\n",
2074 "nfac20fc8bb7441f891ac0380259f3b76 [label=\"a\\na\\naa\"];\n",
2075 "nfac20fc8bb7441f891ac0380259f3b76 -> n14489559bae24e99b2d816716ceef683;\n",
2076 "nfac20fc8bb7441f891ac0380259f3b76 -> n44c425cd261c4c19971a47901723f942;\n",
2077 "n14489559bae24e99b2d816716ceef683 [label=\"-\\na\\na\\nTrue\"];\n",
2078 "n44c425cd261c4c19971a47901723f942 [label=\"a\\n-\\na\\nTrue\"];\n",
2079 "n9d9c86dc313f48b69d9c2693ee32e7ab [label=\"aa\\n-\\naa\\nTrue\"];\n",
2080 "ne0c07d6d54f045a5b4bf9eb10bd8d810 [label=\"aaa\\na\\naaaa\"];\n",
2081 "ne0c07d6d54f045a5b4bf9eb10bd8d810 -> n8d8289489db44271b99f22c572668eaa;\n",
2082 "ne0c07d6d54f045a5b4bf9eb10bd8d810 -> n4eda0dd1e0e34c8c9a81beba5c70fe5f;\n",
2083 "n8d8289489db44271b99f22c572668eaa [label=\"aa\\na\\naaa\"];\n",
2084 "n8d8289489db44271b99f22c572668eaa -> n156514e9dbcb44a8a6b4d96f1ec3e48f;\n",
2085 "n8d8289489db44271b99f22c572668eaa -> n3ba7c5a0cc3b405aa6ca7899ee85a518;\n",
2086 "n156514e9dbcb44a8a6b4d96f1ec3e48f [label=\"a\\na\\naa\"];\n",
2087 "n156514e9dbcb44a8a6b4d96f1ec3e48f -> n3b99ff94eb914661bafe9ba4c0c997e2;\n",
2088 "n156514e9dbcb44a8a6b4d96f1ec3e48f -> n91eac98d4ed74a1f99fd48ca60111d2c;\n",
2089 "n3b99ff94eb914661bafe9ba4c0c997e2 [label=\"-\\na\\na\\nTrue\"];\n",
2090 "n91eac98d4ed74a1f99fd48ca60111d2c [label=\"a\\n-\\na\\nTrue\"];\n",
2091 "n3ba7c5a0cc3b405aa6ca7899ee85a518 [label=\"aa\\n-\\naa\\nTrue\"];\n",
2092 "n4eda0dd1e0e34c8c9a81beba5c70fe5f [label=\"aaa\\n-\\naaa\\nTrue\"];\n"
2093 ]
2094 }
2095 ],
2096 "source": [
2097 "root, graph = is_interleave_recursive_dot('aaa', 'aaa', 'aaaaaa')\n",
2098 "print('\\n'.join(graph))"
2099 ]
2100 },
2101 {
2102 "cell_type": "code",
2103 "execution_count": 44,
2104 "metadata": {
2105 "scrolled": true
2106 },
2107 "outputs": [
2108 {
2109 "name": "stdout",
2110 "output_type": "stream",
2111 "text": [
2112 "n5d63e71661ed4a8ead31b5c5f9c1949b [label=\"acb\\naba\\nabacab\"];\n",
2113 "n5d63e71661ed4a8ead31b5c5f9c1949b -> n11bd1802979b4332bdf9cf6cc3b2a51c;\n",
2114 "n11bd1802979b4332bdf9cf6cc3b2a51c [label=\"ac\\naba\\nabaca\"];\n",
2115 "n11bd1802979b4332bdf9cf6cc3b2a51c -> n8a082af1ba074b84b7410b97554be94f;\n",
2116 "n8a082af1ba074b84b7410b97554be94f [label=\"ac\\nab\\nabac\"];\n",
2117 "n8a082af1ba074b84b7410b97554be94f -> n6ec78858d88046c8b8531a63f38825b3;\n",
2118 "n6ec78858d88046c8b8531a63f38825b3 [label=\"a\\nab\\naba\"];\n",
2119 "n6ec78858d88046c8b8531a63f38825b3 -> na563514a3f194725be7160850c3c8369;\n",
2120 "na563514a3f194725be7160850c3c8369 [label=\"-\\nab\\nab\\nTrue\"];\n"
2121 ]
2122 }
2123 ],
2124 "source": [
2125 "root, graph = is_interleave_recursive_dot(e1, e2, e3)\n",
2126 "print('\\n'.join(graph))"
2127 ]
2128 },
2129 {
2130 "cell_type": "code",
2131 "execution_count": 45,
2132 "metadata": {
2133 "collapsed": true
2134 },
2135 "outputs": [],
2136 "source": [
2137 "s1 = make_string(500)\n",
2138 "s2 = make_string(500)\n",
2139 "s3 = make_string(500)\n",
2140 "s12 = interleave(s1, s2)\n",
2141 "s23 = interleave(s2, s3)"
2142 ]
2143 },
2144 {
2145 "cell_type": "code",
2146 "execution_count": 48,
2147 "metadata": {},
2148 "outputs": [
2149 {
2150 "data": {
2151 "text/plain": [
2152 "True"
2153 ]
2154 },
2155 "execution_count": 48,
2156 "metadata": {},
2157 "output_type": "execute_result"
2158 }
2159 ],
2160 "source": [
2161 "is_interleave_recursive(s1, s2, s12)"
2162 ]
2163 },
2164 {
2165 "cell_type": "code",
2166 "execution_count": 49,
2167 "metadata": {},
2168 "outputs": [
2169 {
2170 "data": {
2171 "text/plain": [
2172 "False"
2173 ]
2174 },
2175 "execution_count": 49,
2176 "metadata": {},
2177 "output_type": "execute_result"
2178 }
2179 ],
2180 "source": [
2181 "is_interleave_recursive(s1, s2, s23)"
2182 ]
2183 },
2184 {
2185 "cell_type": "markdown",
2186 "metadata": {},
2187 "source": [
2188 "## Example"
2189 ]
2190 },
2191 {
2192 "cell_type": "code",
2193 "execution_count": 50,
2194 "metadata": {
2195 "collapsed": true
2196 },
2197 "outputs": [],
2198 "source": [
2199 "def show_annotated_table(table, bps):\n",
2200 " return '\\n'.join(' '.join('*' if (i, j) == (0, 0) else bps[i, j][2] if table[i, j] else '.' for j in sorted(set([k[1] for k in table])))\n",
2201 " for i in sorted(set([k[0] for k in table])))"
2202 ]
2203 },
2204 {
2205 "cell_type": "code",
2206 "execution_count": 51,
2207 "metadata": {
2208 "collapsed": true
2209 },
2210 "outputs": [],
2211 "source": [
2212 "def show_backtrace_star(bps):\n",
2213 " i = max([0] + [k[0] for k in bps])\n",
2214 " j = max([0] + [k[1] for k in bps])\n",
2215 " chars = ''\n",
2216 " stars = ''\n",
2217 " if (i, j) in bps:\n",
2218 " while i != 0 or j != 0:\n",
2219 " chars += bps[i, j][2]\n",
2220 " if bps[i, j][3] == 'seq1':\n",
2221 " stars += '*'\n",
2222 " else:\n",
2223 " stars += ' '\n",
2224 " i, j = bps[i, j][0], bps[i, j][1] \n",
2225 " return ''.join(list(reversed(chars))) + '\\n' + ''.join(list(reversed(stars)))\n",
2226 " else:\n",
2227 " return ''"
2228 ]
2229 },
2230 {
2231 "cell_type": "code",
2232 "execution_count": 52,
2233 "metadata": {},
2234 "outputs": [
2235 {
2236 "name": "stdout",
2237 "output_type": "stream",
2238 "text": [
2239 "0: ddadbdcbdc\n",
2240 "1: bbcbbabdab\n",
2241 "2: dcddddbbdb\n",
2242 "3: cccbbbcbabadbddcabda\n",
2243 "4: ddcdddadddbbbddbcbdc\n",
2244 "5: dcccdddcbdbadbdbdcda\n",
2245 "6: ddadbbcbbbdacbbdcdab\n"
2246 ]
2247 },
2248 {
2249 "data": {
2250 "text/plain": [
2251 "['ddadbbcbbbdacbbdcdab']"
2252 ]
2253 },
2254 "execution_count": 52,
2255 "metadata": {},
2256 "output_type": "execute_result"
2257 }
2258 ],
2259 "source": [
2260 "s1 = make_string(10, alphabet='abcd')\n",
2261 "s2 = make_string(10, alphabet='abcd')\n",
2262 "s3 = make_string(10, alphabet='abcd')\n",
2263 "s4 = make_string(10, alphabet='abcd')\n",
2264 "il = interleave(s1, s2)\n",
2265 "bs = [s3, il, interleave(s3, s4), interleave(s2, s4), interleave(s1, s3)]\n",
2266 "random.shuffle(bs)\n",
2267 "bs = [s1, s2] + bs\n",
2268 "tg = [l for l in bs if is_interleave(s1, s2, l)]\n",
2269 "print('\\n'.join(['{}: {}'.format(i, s) for i, s in enumerate(bs)]))\n",
2270 "tg"
2271 ]
2272 },
2273 {
2274 "cell_type": "code",
2275 "execution_count": 53,
2276 "metadata": {},
2277 "outputs": [
2278 {
2279 "name": "stdout",
2280 "output_type": "stream",
2281 "text": [
2282 "* . . . . . . . . . .\n",
2283 "d . . . . . . . . . .\n",
2284 "d . . . . . . . . . .\n",
2285 "a . . . . . . . . . .\n",
2286 "d b b c b b . . . . .\n",
2287 "b b . b b b . . . . .\n",
2288 ". . . . . d a . . . .\n",
2289 ". . . . . . c b . . .\n",
2290 ". . . . . . b b d . .\n",
2291 ". . . . . . . d . . .\n",
2292 ". . . . . . . c d a b\n",
2293 "DDADbbcbbBDaCbBDCdab\n",
2294 "ddadbbcbbbdacbbdcdab\n",
2295 "**** ** * *** \n"
2296 ]
2297 },
2298 {
2299 "data": {
2300 "text/plain": [
2301 "True"
2302 ]
2303 },
2304 "execution_count": 53,
2305 "metadata": {},
2306 "output_type": "execute_result"
2307 }
2308 ],
2309 "source": [
2310 "v, bp, t = is_interleave(s1, s2, il, return_backpointers=True, return_table=True)\n",
2311 "print(show_annotated_table(t, bp))\n",
2312 "print(show_backtrace(bp))\n",
2313 "print(show_backtrace_star(bp))\n",
2314 "v"
2315 ]
2316 },
2317 {
2318 "cell_type": "code",
2319 "execution_count": 54,
2320 "metadata": {},
2321 "outputs": [
2322 {
2323 "name": "stdout",
2324 "output_type": "stream",
2325 "text": [
2326 "ddcdddadddbbbddbcbdc\n",
2327 " * ** * * * ****\n"
2328 ]
2329 },
2330 {
2331 "data": {
2332 "text/plain": [
2333 "4"
2334 ]
2335 },
2336 "execution_count": 54,
2337 "metadata": {},
2338 "output_type": "execute_result"
2339 }
2340 ],
2341 "source": [
2342 "ind = [i for i, b in enumerate(bs) if is_interleave(s1, s3, b)][0]\n",
2343 "v, bp = is_interleave(s1, s3, bs[ind], return_backpointers=True)\n",
2344 "print(show_backtrace_star(bp))\n",
2345 "ind"
2346 ]
2347 },
2348 {
2349 "cell_type": "code",
2350 "execution_count": 55,
2351 "metadata": {},
2352 "outputs": [
2353 {
2354 "name": "stdout",
2355 "output_type": "stream",
2356 "text": [
2357 "* d d a d b . . . . .\n",
2358 ". . . . b b . . . . .\n",
2359 ". . . . b . . . . . .\n",
2360 ". . . . c b . . . . .\n",
2361 ". . . . b b . . . . .\n",
2362 ". . . . b b d . . . .\n",
2363 ". . . . . . a c b . .\n",
2364 ". . . . . . . b b d c\n",
2365 ". . . . . . . . d . d\n",
2366 ". . . . . . . . . . a\n",
2367 ". . . . . . . . . . b\n",
2368 "ddadBBCbBBdAcbBdcDAB\n",
2369 "ddadbbcbbbdacbbdcdab\n",
2370 " *** ** * * ***\n"
2371 ]
2372 },
2373 {
2374 "data": {
2375 "text/plain": [
2376 "True"
2377 ]
2378 },
2379 "execution_count": 55,
2380 "metadata": {},
2381 "output_type": "execute_result"
2382 }
2383 ],
2384 "source": [
2385 "v, bp, t = is_interleave(s2, s1, il, return_backpointers=True, return_table=True)\n",
2386 "print(show_annotated_table(t, bp))\n",
2387 "print(show_backtrace(bp))\n",
2388 "print(show_backtrace_star(bp))\n",
2389 "v"
2390 ]
2391 },
2392 {
2393 "cell_type": "code",
2394 "execution_count": 56,
2395 "metadata": {},
2396 "outputs": [
2397 {
2398 "name": "stdout",
2399 "output_type": "stream",
2400 "text": [
2401 "* d . . . . . . . . .\n",
2402 "d d . . . . . . . . .\n",
2403 "d . . . . . . . . . .\n",
2404 "a d . . . . . . . . .\n",
2405 "d . . . . . . . . . .\n",
2406 "b . . . . . . . . . .\n",
2407 ". . . . . . . . . . .\n",
2408 ". . . . . . . . . . .\n",
2409 ". . . . . . . . . . .\n",
2410 ". . . . . . . . . . .\n",
2411 ". . . . . . . . . . .\n",
2412 "\n",
2413 "\n"
2414 ]
2415 },
2416 {
2417 "data": {
2418 "text/plain": [
2419 "False"
2420 ]
2421 },
2422 "execution_count": 56,
2423 "metadata": {},
2424 "output_type": "execute_result"
2425 }
2426 ],
2427 "source": [
2428 "v, bp, t = is_interleave(s1, s3, il, return_backpointers=True, return_table=True)\n",
2429 "print(show_annotated_table(t, bp))\n",
2430 "print(show_backtrace(bp))\n",
2431 "print(show_backtrace_star(bp))\n",
2432 "v"
2433 ]
2434 },
2435 {
2436 "cell_type": "code",
2437 "execution_count": 57,
2438 "metadata": {},
2439 "outputs": [
2440 {
2441 "name": "stdout",
2442 "output_type": "stream",
2443 "text": [
2444 "* d . . . . . . . . .\n",
2445 ". . . . . . . . . . .\n",
2446 ". . . . . . . . . . .\n",
2447 ". . . . . . . . . . .\n",
2448 ". . . . . . . . . . .\n",
2449 ". . . . . . . . . . .\n",
2450 ". . . . . . . . . . .\n",
2451 ". . . . . . . . . . .\n",
2452 ". . . . . . . . . . .\n",
2453 ". . . . . . . . . . .\n",
2454 ". . . . . . . . . . .\n",
2455 "d\n",
2456 "d\n",
2457 " \n"
2458 ]
2459 },
2460 {
2461 "data": {
2462 "text/plain": [
2463 "False"
2464 ]
2465 },
2466 "execution_count": 57,
2467 "metadata": {},
2468 "output_type": "execute_result"
2469 }
2470 ],
2471 "source": [
2472 "v, bp, t = is_interleave(s2, s3, il, return_backpointers=True, return_table=True)\n",
2473 "print(show_annotated_table(t, bp))\n",
2474 "print(show_backtrace(bp))\n",
2475 "print(show_backtrace_star(bp))\n",
2476 "v"
2477 ]
2478 },
2479 {
2480 "cell_type": "markdown",
2481 "metadata": {
2482 "collapsed": true
2483 },
2484 "source": [
2485 "# Make puzzle data\n",
2486 "\n",
2487 "## Note to self\n",
2488 "Include some distractors in the test set, such that:\n",
2489 "* subsequence(my_bill, distractor) is true\n",
2490 "* subsequence(friend_bill, distractor) is true\n",
2491 "* interleave(my_bill, friend_bill, distractor) is false\n",
2492 "\n",
2493 "(i.e. characters are shared between my_bill and friend_bill)\n",
2494 "\n",
2495 "Students are taking a greedy approach to subsequence, and saying the interleave is true if both bills are subsequences of the distractor.\n",
2496 "\n",
2497 "i.e. \"aaa\" and \"aab\" are both subsequences of \"aaabbb\", but cannot be interleaved to form \"aaabbb\".\n"
2498 ]
2499 },
2500 {
2501 "cell_type": "code",
2502 "execution_count": 58,
2503 "metadata": {
2504 "collapsed": true
2505 },
2506 "outputs": [],
2507 "source": [
2508 "my_bill = make_string(200)\n",
2509 "friend_bill = make_string(200)\n",
2510 "other_bills = [make_string(200) for _ in range(98)]\n",
2511 "\n",
2512 "target_interleaved = interleave(my_bill, friend_bill)\n",
2513 "mine_interleaved = [interleave(my_bill, o) for o in random.sample(other_bills, 21)]\n",
2514 "friend_interleaved = [interleave(friend_bill, o) for o in random.sample(other_bills, 13)]\n",
2515 "other_interleaved = []\n",
2516 "for _ in range(103):\n",
2517 " s1, s2 = random.sample(other_bills, 2)\n",
2518 " other_interleaved += [interleave(s1, s2)]"
2519 ]
2520 },
2521 {
2522 "cell_type": "code",
2523 "execution_count": 59,
2524 "metadata": {
2525 "collapsed": true
2526 },
2527 "outputs": [],
2528 "source": [
2529 "all_targets = [target_interleaved] + mine_interleaved + friend_interleaved + other_interleaved"
2530 ]
2531 },
2532 {
2533 "cell_type": "code",
2534 "execution_count": 60,
2535 "metadata": {},
2536 "outputs": [
2537 {
2538 "name": "stdout",
2539 "output_type": "stream",
2540 "text": [
2541 "CPU times: user 3.2 s, sys: 96 ms, total: 3.3 s\n",
2542 "Wall time: 3.3 s\n"
2543 ]
2544 },
2545 {
2546 "data": {
2547 "text/plain": [
2548 "[0]"
2549 ]
2550 },
2551 "execution_count": 60,
2552 "metadata": {},
2553 "output_type": "execute_result"
2554 }
2555 ],
2556 "source": [
2557 "%time [i for i, s12 in enumerate(all_targets) if is_interleave(my_bill, friend_bill, s12)]"
2558 ]
2559 },
2560 {
2561 "cell_type": "code",
2562 "execution_count": 61,
2563 "metadata": {},
2564 "outputs": [
2565 {
2566 "name": "stdout",
2567 "output_type": "stream",
2568 "text": [
2569 "CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
2570 "Wall time: 570 µs\n"
2571 ]
2572 },
2573 {
2574 "data": {
2575 "text/plain": [
2576 "[0]"
2577 ]
2578 },
2579 "execution_count": 61,
2580 "metadata": {},
2581 "output_type": "execute_result"
2582 }
2583 ],
2584 "source": [
2585 "%time [i for i, s12 in enumerate(all_targets) if is_interleave_recursive(my_bill, friend_bill, s12)]"
2586 ]
2587 },
2588 {
2589 "cell_type": "code",
2590 "execution_count": 62,
2591 "metadata": {
2592 "collapsed": true
2593 },
2594 "outputs": [],
2595 "source": [
2596 "bill_set = all_targets + random.sample(other_bills, 8)\n",
2597 "random.shuffle(bill_set)\n",
2598 "bill_set = [my_bill, friend_bill] + bill_set\n",
2599 "\n",
2600 "# with open('09-bills.txt', 'w') as f:\n",
2601 "# for i, b in enumerate(bill_set):\n",
2602 "# f.write('{}: {}\\n'.format(i, b))"
2603 ]
2604 },
2605 {
2606 "cell_type": "code",
2607 "execution_count": 63,
2608 "metadata": {
2609 "collapsed": true
2610 },
2611 "outputs": [],
2612 "source": [
2613 "def is_subseq_greedy(s1, s2):\n",
2614 " i = j = 0\n",
2615 " while i < len(s1) and j < len(s2):\n",
2616 " if s1[i] == s2[j]:\n",
2617 " i += 1\n",
2618 " j += 1\n",
2619 " return i == len(s1)"
2620 ]
2621 },
2622 {
2623 "cell_type": "code",
2624 "execution_count": 64,
2625 "metadata": {
2626 "collapsed": true
2627 },
2628 "outputs": [],
2629 "source": [
2630 "def subseq_partition(s1, s2):\n",
2631 " i = j = 0\n",
2632 " remainder = ''\n",
2633 " while i < len(s1) and j < len(s2):\n",
2634 " if s1[i] == s2[j]:\n",
2635 " i += 1\n",
2636 " else:\n",
2637 " remainder += s2[j]\n",
2638 " j += 1\n",
2639 " return i == len(s1), remainder"
2640 ]
2641 },
2642 {
2643 "cell_type": "code",
2644 "execution_count": 65,
2645 "metadata": {},
2646 "outputs": [
2647 {
2648 "data": {
2649 "text/plain": [
2650 "(40, 40, 20, 20)"
2651 ]
2652 },
2653 "execution_count": 65,
2654 "metadata": {},
2655 "output_type": "execute_result"
2656 }
2657 ],
2658 "source": [
2659 "common = make_string(10)\n",
2660 "padding = make_string(10)\n",
2661 "middle = interleave(common, padding)\n",
2662 "\n",
2663 "pre1 = make_string(5)\n",
2664 "suf1 = make_string(5)\n",
2665 "\n",
2666 "pre2 = make_string(5)\n",
2667 "suf2 = make_string(5)\n",
2668 "\n",
2669 "pre = interleave(pre1, pre2)\n",
2670 "suf = interleave(suf1, suf2)\n",
2671 "\n",
2672 "distractor = pre + middle + suf\n",
2673 "\n",
2674 "sub1 = pre1 + common + suf1\n",
2675 "sub2 = pre2 + common + suf2\n",
2676 "\n",
2677 "valid = interleave(sub1, sub2)\n",
2678 "\n",
2679 "len(distractor), len(valid), len(sub1), len(sub2)"
2680 ]
2681 },
2682 {
2683 "cell_type": "code",
2684 "execution_count": 66,
2685 "metadata": {},
2686 "outputs": [
2687 {
2688 "data": {
2689 "text/plain": [
2690 "(True, True)"
2691 ]
2692 },
2693 "execution_count": 66,
2694 "metadata": {},
2695 "output_type": "execute_result"
2696 }
2697 ],
2698 "source": [
2699 "is_subseq_greedy(sub1, distractor), is_subseq_greedy(sub2, distractor)"
2700 ]
2701 },
2702 {
2703 "cell_type": "code",
2704 "execution_count": 67,
2705 "metadata": {},
2706 "outputs": [
2707 {
2708 "data": {
2709 "text/plain": [
2710 "(True, True)"
2711 ]
2712 },
2713 "execution_count": 67,
2714 "metadata": {},
2715 "output_type": "execute_result"
2716 }
2717 ],
2718 "source": [
2719 "is_subseq_greedy(sub1, valid), is_subseq_greedy(sub2, valid)"
2720 ]
2721 },
2722 {
2723 "cell_type": "code",
2724 "execution_count": 68,
2725 "metadata": {},
2726 "outputs": [
2727 {
2728 "data": {
2729 "text/plain": [
2730 "(False, True)"
2731 ]
2732 },
2733 "execution_count": 68,
2734 "metadata": {},
2735 "output_type": "execute_result"
2736 }
2737 ],
2738 "source": [
2739 "is_interleave(sub1, sub2, distractor), is_interleave(sub1, sub2, valid)"
2740 ]
2741 },
2742 {
2743 "cell_type": "code",
2744 "execution_count": 69,
2745 "metadata": {},
2746 "outputs": [
2747 {
2748 "data": {
2749 "text/plain": [
2750 "('hbgbfhdaghfbcagbhhgh',\n",
2751 " 'eccfdhdaghfbcaggbaae',\n",
2752 " 'ehccbfgbdfhfefdbagefagehfgbcaggbbhahgaeh',\n",
2753 " 'hecbgbfhdagchffbdhcagdbhaghhfgbchaggbaae')"
2754 ]
2755 },
2756 "execution_count": 69,
2757 "metadata": {},
2758 "output_type": "execute_result"
2759 }
2760 ],
2761 "source": [
2762 "sub1, sub2, distractor, valid"
2763 ]
2764 },
2765 {
2766 "cell_type": "code",
2767 "execution_count": 70,
2768 "metadata": {},
2769 "outputs": [
2770 {
2771 "data": {
2772 "text/plain": [
2773 "False"
2774 ]
2775 },
2776 "execution_count": 70,
2777 "metadata": {},
2778 "output_type": "execute_result"
2779 }
2780 ],
2781 "source": [
2782 "a, b = subseq_partition(sub1, distractor)\n",
2783 "b == sub2"
2784 ]
2785 },
2786 {
2787 "cell_type": "code",
2788 "execution_count": 71,
2789 "metadata": {},
2790 "outputs": [
2791 {
2792 "data": {
2793 "text/plain": [
2794 "('eccfdhdaghfbc', 'eccfdhdaghfbcaggbaae')"
2795 ]
2796 },
2797 "execution_count": 71,
2798 "metadata": {},
2799 "output_type": "execute_result"
2800 }
2801 ],
2802 "source": [
2803 "a, b = subseq_partition(sub1, valid)\n",
2804 "b, sub2"
2805 ]
2806 },
2807 {
2808 "cell_type": "code",
2809 "execution_count": null,
2810 "metadata": {
2811 "collapsed": true
2812 },
2813 "outputs": [],
2814 "source": []
2815 }
2816 ],
2817 "metadata": {
2818 "kernelspec": {
2819 "display_name": "Python 3",
2820 "language": "python",
2821 "name": "python3"
2822 },
2823 "language_info": {
2824 "codemirror_mode": {
2825 "name": "ipython",
2826 "version": 3
2827 },
2828 "file_extension": ".py",
2829 "mimetype": "text/x-python",
2830 "name": "python",
2831 "nbconvert_exporter": "python",
2832 "pygments_lexer": "ipython3",
2833 "version": "3.5.2+"
2834 }
2835 },
2836 "nbformat": 4,
2837 "nbformat_minor": 1
2838 }