Fixed typo
[advent-of-code-15.git] / advent07.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {
7 "collapsed": true
8 },
9 "outputs": [],
10 "source": [
11 "pi7 = \"\"\"lf AND lq -> ls\n",
12 "iu RSHIFT 1 -> jn\n",
13 "bo OR bu -> bv\n",
14 "gj RSHIFT 1 -> hc\n",
15 "et RSHIFT 2 -> eu\n",
16 "bv AND bx -> by\n",
17 "is OR it -> iu\n",
18 "b OR n -> o\n",
19 "gf OR ge -> gg\n",
20 "NOT kt -> ku\n",
21 "ea AND eb -> ed\n",
22 "kl OR kr -> ks\n",
23 "hi AND hk -> hl\n",
24 "au AND av -> ax\n",
25 "lf RSHIFT 2 -> lg\n",
26 "dd RSHIFT 3 -> df\n",
27 "eu AND fa -> fc\n",
28 "df AND dg -> di\n",
29 "ip LSHIFT 15 -> it\n",
30 "NOT el -> em\n",
31 "et OR fe -> ff\n",
32 "fj LSHIFT 15 -> fn\n",
33 "t OR s -> u\n",
34 "ly OR lz -> ma\n",
35 "ko AND kq -> kr\n",
36 "NOT fx -> fy\n",
37 "et RSHIFT 1 -> fm\n",
38 "eu OR fa -> fb\n",
39 "dd RSHIFT 2 -> de\n",
40 "NOT go -> gp\n",
41 "kb AND kd -> ke\n",
42 "hg OR hh -> hi\n",
43 "jm LSHIFT 1 -> kg\n",
44 "NOT cn -> co\n",
45 "jp RSHIFT 2 -> jq\n",
46 "jp RSHIFT 5 -> js\n",
47 "1 AND io -> ip\n",
48 "eo LSHIFT 15 -> es\n",
49 "1 AND jj -> jk\n",
50 "g AND i -> j\n",
51 "ci RSHIFT 3 -> ck\n",
52 "gn AND gp -> gq\n",
53 "fs AND fu -> fv\n",
54 "lj AND ll -> lm\n",
55 "jk LSHIFT 15 -> jo\n",
56 "iu RSHIFT 3 -> iw\n",
57 "NOT ii -> ij\n",
58 "1 AND cc -> cd\n",
59 "bn RSHIFT 3 -> bp\n",
60 "NOT gw -> gx\n",
61 "NOT ft -> fu\n",
62 "jn OR jo -> jp\n",
63 "iv OR jb -> jc\n",
64 "hv OR hu -> hw\n",
65 "19138 -> b\n",
66 "gj RSHIFT 5 -> gm\n",
67 "hq AND hs -> ht\n",
68 "dy RSHIFT 1 -> er\n",
69 "ao OR an -> ap\n",
70 "ld OR le -> lf\n",
71 "bk LSHIFT 1 -> ce\n",
72 "bz AND cb -> cc\n",
73 "bi LSHIFT 15 -> bm\n",
74 "il AND in -> io\n",
75 "af AND ah -> ai\n",
76 "as RSHIFT 1 -> bl\n",
77 "lf RSHIFT 3 -> lh\n",
78 "er OR es -> et\n",
79 "NOT ax -> ay\n",
80 "ci RSHIFT 1 -> db\n",
81 "et AND fe -> fg\n",
82 "lg OR lm -> ln\n",
83 "k AND m -> n\n",
84 "hz RSHIFT 2 -> ia\n",
85 "kh LSHIFT 1 -> lb\n",
86 "NOT ey -> ez\n",
87 "NOT di -> dj\n",
88 "dz OR ef -> eg\n",
89 "lx -> a\n",
90 "NOT iz -> ja\n",
91 "gz LSHIFT 15 -> hd\n",
92 "ce OR cd -> cf\n",
93 "fq AND fr -> ft\n",
94 "at AND az -> bb\n",
95 "ha OR gz -> hb\n",
96 "fp AND fv -> fx\n",
97 "NOT gb -> gc\n",
98 "ia AND ig -> ii\n",
99 "gl OR gm -> gn\n",
100 "0 -> c\n",
101 "NOT ca -> cb\n",
102 "bn RSHIFT 1 -> cg\n",
103 "c LSHIFT 1 -> t\n",
104 "iw OR ix -> iy\n",
105 "kg OR kf -> kh\n",
106 "dy OR ej -> ek\n",
107 "km AND kn -> kp\n",
108 "NOT fc -> fd\n",
109 "hz RSHIFT 3 -> ib\n",
110 "NOT dq -> dr\n",
111 "NOT fg -> fh\n",
112 "dy RSHIFT 2 -> dz\n",
113 "kk RSHIFT 2 -> kl\n",
114 "1 AND fi -> fj\n",
115 "NOT hr -> hs\n",
116 "jp RSHIFT 1 -> ki\n",
117 "bl OR bm -> bn\n",
118 "1 AND gy -> gz\n",
119 "gr AND gt -> gu\n",
120 "db OR dc -> dd\n",
121 "de OR dk -> dl\n",
122 "as RSHIFT 5 -> av\n",
123 "lf RSHIFT 5 -> li\n",
124 "hm AND ho -> hp\n",
125 "cg OR ch -> ci\n",
126 "gj AND gu -> gw\n",
127 "ge LSHIFT 15 -> gi\n",
128 "e OR f -> g\n",
129 "fp OR fv -> fw\n",
130 "fb AND fd -> fe\n",
131 "cd LSHIFT 15 -> ch\n",
132 "b RSHIFT 1 -> v\n",
133 "at OR az -> ba\n",
134 "bn RSHIFT 2 -> bo\n",
135 "lh AND li -> lk\n",
136 "dl AND dn -> do\n",
137 "eg AND ei -> ej\n",
138 "ex AND ez -> fa\n",
139 "NOT kp -> kq\n",
140 "NOT lk -> ll\n",
141 "x AND ai -> ak\n",
142 "jp OR ka -> kb\n",
143 "NOT jd -> je\n",
144 "iy AND ja -> jb\n",
145 "jp RSHIFT 3 -> jr\n",
146 "fo OR fz -> ga\n",
147 "df OR dg -> dh\n",
148 "gj RSHIFT 2 -> gk\n",
149 "gj OR gu -> gv\n",
150 "NOT jh -> ji\n",
151 "ap LSHIFT 1 -> bj\n",
152 "NOT ls -> lt\n",
153 "ir LSHIFT 1 -> jl\n",
154 "bn AND by -> ca\n",
155 "lv LSHIFT 15 -> lz\n",
156 "ba AND bc -> bd\n",
157 "cy LSHIFT 15 -> dc\n",
158 "ln AND lp -> lq\n",
159 "x RSHIFT 1 -> aq\n",
160 "gk OR gq -> gr\n",
161 "NOT kx -> ky\n",
162 "jg AND ji -> jj\n",
163 "bn OR by -> bz\n",
164 "fl LSHIFT 1 -> gf\n",
165 "bp OR bq -> br\n",
166 "he OR hp -> hq\n",
167 "et RSHIFT 5 -> ew\n",
168 "iu RSHIFT 2 -> iv\n",
169 "gl AND gm -> go\n",
170 "x OR ai -> aj\n",
171 "hc OR hd -> he\n",
172 "lg AND lm -> lo\n",
173 "lh OR li -> lj\n",
174 "da LSHIFT 1 -> du\n",
175 "fo RSHIFT 2 -> fp\n",
176 "gk AND gq -> gs\n",
177 "bj OR bi -> bk\n",
178 "lf OR lq -> lr\n",
179 "cj AND cp -> cr\n",
180 "hu LSHIFT 15 -> hy\n",
181 "1 AND bh -> bi\n",
182 "fo RSHIFT 3 -> fq\n",
183 "NOT lo -> lp\n",
184 "hw LSHIFT 1 -> iq\n",
185 "dd RSHIFT 1 -> dw\n",
186 "dt LSHIFT 15 -> dx\n",
187 "dy AND ej -> el\n",
188 "an LSHIFT 15 -> ar\n",
189 "aq OR ar -> as\n",
190 "1 AND r -> s\n",
191 "fw AND fy -> fz\n",
192 "NOT im -> in\n",
193 "et RSHIFT 3 -> ev\n",
194 "1 AND ds -> dt\n",
195 "ec AND ee -> ef\n",
196 "NOT ak -> al\n",
197 "jl OR jk -> jm\n",
198 "1 AND en -> eo\n",
199 "lb OR la -> lc\n",
200 "iu AND jf -> jh\n",
201 "iu RSHIFT 5 -> ix\n",
202 "bo AND bu -> bw\n",
203 "cz OR cy -> da\n",
204 "iv AND jb -> jd\n",
205 "iw AND ix -> iz\n",
206 "lf RSHIFT 1 -> ly\n",
207 "iu OR jf -> jg\n",
208 "NOT dm -> dn\n",
209 "lw OR lv -> lx\n",
210 "gg LSHIFT 1 -> ha\n",
211 "lr AND lt -> lu\n",
212 "fm OR fn -> fo\n",
213 "he RSHIFT 3 -> hg\n",
214 "aj AND al -> am\n",
215 "1 AND kz -> la\n",
216 "dy RSHIFT 5 -> eb\n",
217 "jc AND je -> jf\n",
218 "cm AND co -> cp\n",
219 "gv AND gx -> gy\n",
220 "ev OR ew -> ex\n",
221 "jp AND ka -> kc\n",
222 "fk OR fj -> fl\n",
223 "dy RSHIFT 3 -> ea\n",
224 "NOT bs -> bt\n",
225 "NOT ag -> ah\n",
226 "dz AND ef -> eh\n",
227 "cf LSHIFT 1 -> cz\n",
228 "NOT cv -> cw\n",
229 "1 AND cx -> cy\n",
230 "de AND dk -> dm\n",
231 "ck AND cl -> cn\n",
232 "x RSHIFT 5 -> aa\n",
233 "dv LSHIFT 1 -> ep\n",
234 "he RSHIFT 2 -> hf\n",
235 "NOT bw -> bx\n",
236 "ck OR cl -> cm\n",
237 "bp AND bq -> bs\n",
238 "as OR bd -> be\n",
239 "he AND hp -> hr\n",
240 "ev AND ew -> ey\n",
241 "1 AND lu -> lv\n",
242 "kk RSHIFT 3 -> km\n",
243 "b AND n -> p\n",
244 "NOT kc -> kd\n",
245 "lc LSHIFT 1 -> lw\n",
246 "km OR kn -> ko\n",
247 "id AND if -> ig\n",
248 "ih AND ij -> ik\n",
249 "jr AND js -> ju\n",
250 "ci RSHIFT 5 -> cl\n",
251 "hz RSHIFT 1 -> is\n",
252 "1 AND ke -> kf\n",
253 "NOT gs -> gt\n",
254 "aw AND ay -> az\n",
255 "x RSHIFT 2 -> y\n",
256 "ab AND ad -> ae\n",
257 "ff AND fh -> fi\n",
258 "ci AND ct -> cv\n",
259 "eq LSHIFT 1 -> fk\n",
260 "gj RSHIFT 3 -> gl\n",
261 "u LSHIFT 1 -> ao\n",
262 "NOT bb -> bc\n",
263 "NOT hj -> hk\n",
264 "kw AND ky -> kz\n",
265 "as AND bd -> bf\n",
266 "dw OR dx -> dy\n",
267 "br AND bt -> bu\n",
268 "kk AND kv -> kx\n",
269 "ep OR eo -> eq\n",
270 "he RSHIFT 1 -> hx\n",
271 "ki OR kj -> kk\n",
272 "NOT ju -> jv\n",
273 "ek AND em -> en\n",
274 "kk RSHIFT 5 -> kn\n",
275 "NOT eh -> ei\n",
276 "hx OR hy -> hz\n",
277 "ea OR eb -> ec\n",
278 "s LSHIFT 15 -> w\n",
279 "fo RSHIFT 1 -> gh\n",
280 "kk OR kv -> kw\n",
281 "bn RSHIFT 5 -> bq\n",
282 "NOT ed -> ee\n",
283 "1 AND ht -> hu\n",
284 "cu AND cw -> cx\n",
285 "b RSHIFT 5 -> f\n",
286 "kl AND kr -> kt\n",
287 "iq OR ip -> ir\n",
288 "ci RSHIFT 2 -> cj\n",
289 "cj OR cp -> cq\n",
290 "o AND q -> r\n",
291 "dd RSHIFT 5 -> dg\n",
292 "b RSHIFT 2 -> d\n",
293 "ks AND ku -> kv\n",
294 "b RSHIFT 3 -> e\n",
295 "d OR j -> k\n",
296 "NOT p -> q\n",
297 "NOT cr -> cs\n",
298 "du OR dt -> dv\n",
299 "kf LSHIFT 15 -> kj\n",
300 "NOT ac -> ad\n",
301 "fo RSHIFT 5 -> fr\n",
302 "hz OR ik -> il\n",
303 "jx AND jz -> ka\n",
304 "gh OR gi -> gj\n",
305 "kk RSHIFT 1 -> ld\n",
306 "hz RSHIFT 5 -> ic\n",
307 "as RSHIFT 2 -> at\n",
308 "NOT jy -> jz\n",
309 "1 AND am -> an\n",
310 "ci OR ct -> cu\n",
311 "hg AND hh -> hj\n",
312 "jq OR jw -> jx\n",
313 "v OR w -> x\n",
314 "la LSHIFT 15 -> le\n",
315 "dh AND dj -> dk\n",
316 "dp AND dr -> ds\n",
317 "jq AND jw -> jy\n",
318 "au OR av -> aw\n",
319 "NOT bf -> bg\n",
320 "z OR aa -> ab\n",
321 "ga AND gc -> gd\n",
322 "hz AND ik -> im\n",
323 "jt AND jv -> jw\n",
324 "z AND aa -> ac\n",
325 "jr OR js -> jt\n",
326 "hb LSHIFT 1 -> hv\n",
327 "hf OR hl -> hm\n",
328 "ib OR ic -> id\n",
329 "fq OR fr -> fs\n",
330 "cq AND cs -> ct\n",
331 "ia OR ig -> ih\n",
332 "dd OR do -> dp\n",
333 "d AND j -> l\n",
334 "ib AND ic -> ie\n",
335 "as RSHIFT 3 -> au\n",
336 "be AND bg -> bh\n",
337 "dd AND do -> dq\n",
338 "NOT l -> m\n",
339 "1 AND gd -> ge\n",
340 "y AND ae -> ag\n",
341 "fo AND fz -> gb\n",
342 "NOT ie -> if\n",
343 "e AND f -> h\n",
344 "x RSHIFT 3 -> z\n",
345 "y OR ae -> af\n",
346 "hf AND hl -> hn\n",
347 "NOT h -> i\n",
348 "NOT hn -> ho\n",
349 "he RSHIFT 5 -> hh\"\"\""
350 ]
351 },
352 {
353 "cell_type": "code",
354 "execution_count": 2,
355 "metadata": {
356 "collapsed": false
357 },
358 "outputs": [],
359 "source": [
360 "pi7 = open('advent07.txt').read().strip()"
361 ]
362 },
363 {
364 "cell_type": "code",
365 "execution_count": 3,
366 "metadata": {
367 "collapsed": true
368 },
369 "outputs": [],
370 "source": [
371 "from collections import namedtuple\n",
372 "\n",
373 "Rule = namedtuple('Rule', ['command', 'antecedents', 'consequence'])"
374 ]
375 },
376 {
377 "cell_type": "code",
378 "execution_count": 4,
379 "metadata": {
380 "collapsed": true
381 },
382 "outputs": [],
383 "source": [
384 "def parse_arg(arg):\n",
385 " #try:\n",
386 " # return int(arg)\n",
387 " #except ValueError:\n",
388 " # return arg\n",
389 " if arg.isnumeric():\n",
390 " return int(arg)\n",
391 " else:\n",
392 " return arg\n",
393 " \n",
394 "def parse_rule(text):\n",
395 " tokens = text.strip().split(' ')\n",
396 " if tokens[0] == 'NOT':\n",
397 " rule = Rule(command=tokens[0], antecedents=[parse_arg(tokens[1])], consequence=tokens[3])\n",
398 " elif len(tokens) == 3:\n",
399 " rule = Rule(command='ASSIGN', antecedents=[parse_arg(tokens[0])], consequence=tokens[2])\n",
400 " else:\n",
401 " rule = Rule(command=tokens[1], antecedents=[parse_arg(tokens[0]), parse_arg(tokens[2])], consequence=tokens[4])\n",
402 " return rule"
403 ]
404 },
405 {
406 "cell_type": "code",
407 "execution_count": 5,
408 "metadata": {
409 "collapsed": false
410 },
411 "outputs": [
412 {
413 "name": "stdout",
414 "output_type": "stream",
415 "text": [
416 "123 -> x: Rule(command='ASSIGN', antecedents=[123], consequence='x')\n",
417 "456 -> y: Rule(command='ASSIGN', antecedents=[456], consequence='y')\n",
418 "x AND y -> d: Rule(command='AND', antecedents=['x', 'y'], consequence='d')\n",
419 "x OR y -> e: Rule(command='OR', antecedents=['x', 'y'], consequence='e')\n",
420 "x LSHIFT 2 -> f: Rule(command='LSHIFT', antecedents=['x', 2], consequence='f')\n",
421 "y RSHIFT 2 -> g: Rule(command='RSHIFT', antecedents=['y', 2], consequence='g')\n",
422 "NOT x -> h: Rule(command='NOT', antecedents=['x'], consequence='h')\n",
423 "NOT y -> i: Rule(command='NOT', antecedents=['y'], consequence='i')\n",
424 "lx -> zz: Rule(command='ASSIGN', antecedents=['lx'], consequence='zz')\n"
425 ]
426 }
427 ],
428 "source": [
429 "for r in ['123 -> x', '456 -> y', 'x AND y -> d', 'x OR y -> e', 'x LSHIFT 2 -> f', \n",
430 " 'y RSHIFT 2 -> g', 'NOT x -> h', 'NOT y -> i', 'lx -> zz']:\n",
431 " print(r, end=': ')\n",
432 " print(parse_rule(r))"
433 ]
434 },
435 {
436 "cell_type": "code",
437 "execution_count": 6,
438 "metadata": {
439 "collapsed": false
440 },
441 "outputs": [],
442 "source": [
443 "def rule_can_fire(rule, known_values):\n",
444 " return all(isinstance(a, int) or a in known_values for a in rule.antecedents)"
445 ]
446 },
447 {
448 "cell_type": "code",
449 "execution_count": 7,
450 "metadata": {
451 "collapsed": false
452 },
453 "outputs": [
454 {
455 "data": {
456 "text/plain": [
457 "True"
458 ]
459 },
460 "execution_count": 7,
461 "metadata": {},
462 "output_type": "execute_result"
463 }
464 ],
465 "source": [
466 "rule_can_fire(parse_rule('NOT y -> f'), {'y': 12})"
467 ]
468 },
469 {
470 "cell_type": "code",
471 "execution_count": 8,
472 "metadata": {
473 "collapsed": true
474 },
475 "outputs": [],
476 "source": [
477 "def get_value(arg, known_values):\n",
478 " if arg in known_values:\n",
479 " return known_values[arg]\n",
480 " else:\n",
481 " return arg\n",
482 "\n",
483 "def fire_rule(rule, known_values):\n",
484 " evaluated_args = [get_value(arg, known_values) for arg in rule.antecedents]\n",
485 " if rule.command == 'ASSIGN':\n",
486 " known_values[rule.consequence] = evaluated_args[0]\n",
487 " elif rule.command == 'NOT':\n",
488 " known_values[rule.consequence] = ~evaluated_args[0] % 65536\n",
489 " elif rule.command == 'LSHIFT':\n",
490 " known_values[rule.consequence] = (evaluated_args[0] << evaluated_args[1]) % 65536\n",
491 " elif rule.command == 'RSHIFT':\n",
492 " known_values[rule.consequence] = (evaluated_args[0] >> evaluated_args[1]) % 65536\n",
493 " elif rule.command == 'AND':\n",
494 " known_values[rule.consequence] = (evaluated_args[0] & evaluated_args[1]) % 65536\n",
495 " elif rule.command == 'OR':\n",
496 " known_values[rule.consequence] = (evaluated_args[0] | evaluated_args[1]) % 65536"
497 ]
498 },
499 {
500 "cell_type": "code",
501 "execution_count": 9,
502 "metadata": {
503 "collapsed": false
504 },
505 "outputs": [
506 {
507 "data": {
508 "text/plain": [
509 "65518"
510 ]
511 },
512 "execution_count": 9,
513 "metadata": {},
514 "output_type": "execute_result"
515 }
516 ],
517 "source": [
518 "~17 % 65536"
519 ]
520 },
521 {
522 "cell_type": "code",
523 "execution_count": 10,
524 "metadata": {
525 "collapsed": false
526 },
527 "outputs": [
528 {
529 "data": {
530 "text/plain": [
531 "339"
532 ]
533 },
534 "execution_count": 10,
535 "metadata": {},
536 "output_type": "execute_result"
537 }
538 ],
539 "source": [
540 "rules = [parse_rule(r) for r in pi7.splitlines()]\n",
541 "len(rules)"
542 ]
543 },
544 {
545 "cell_type": "code",
546 "execution_count": 11,
547 "metadata": {
548 "collapsed": false
549 },
550 "outputs": [
551 {
552 "data": {
553 "text/plain": [
554 "16076"
555 ]
556 },
557 "execution_count": 11,
558 "metadata": {},
559 "output_type": "execute_result"
560 }
561 ],
562 "source": [
563 "known = {}\n",
564 "while 'a' not in known:\n",
565 " for r in rules:\n",
566 " if rule_can_fire(r, known) and r.consequence not in known:\n",
567 " fire_rule(r, known)\n",
568 "known['a']"
569 ]
570 },
571 {
572 "cell_type": "code",
573 "execution_count": 12,
574 "metadata": {
575 "collapsed": false
576 },
577 "outputs": [
578 {
579 "data": {
580 "text/plain": [
581 "2797"
582 ]
583 },
584 "execution_count": 12,
585 "metadata": {},
586 "output_type": "execute_result"
587 }
588 ],
589 "source": [
590 "known = {'b': 16076}\n",
591 "while 'a' not in known:\n",
592 " for r in rules:\n",
593 " if rule_can_fire(r, known) and r.consequence not in known:\n",
594 " fire_rule(r, known)\n",
595 "known['a']"
596 ]
597 },
598 {
599 "cell_type": "code",
600 "execution_count": 13,
601 "metadata": {
602 "collapsed": false
603 },
604 "outputs": [
605 {
606 "data": {
607 "text/plain": [
608 "{'a': 2797,\n",
609 " 'aa': 251,\n",
610 " 'ab': 1023,\n",
611 " 'ac': 232,\n",
612 " 'ad': 65303,\n",
613 " 'ae': 791,\n",
614 " 'af': 2015,\n",
615 " 'ag': 785,\n",
616 " 'ah': 64750,\n",
617 " 'ai': 1230,\n",
618 " 'aj': 8174,\n",
619 " 'ak': 1094,\n",
620 " 'al': 64441,\n",
621 " 'am': 7080,\n",
622 " 'an': 0,\n",
623 " 'ao': 0,\n",
624 " 'ap': 0,\n",
625 " 'aq': 4019,\n",
626 " 'ar': 0,\n",
627 " 'as': 4019,\n",
628 " 'at': 1004,\n",
629 " 'au': 502,\n",
630 " 'av': 125,\n",
631 " 'aw': 511,\n",
632 " 'ax': 116,\n",
633 " 'ay': 65419,\n",
634 " 'az': 395,\n",
635 " 'b': 16076,\n",
636 " 'ba': 1007,\n",
637 " 'bb': 392,\n",
638 " 'bc': 65143,\n",
639 " 'bd': 615,\n",
640 " 'be': 4087,\n",
641 " 'bf': 547,\n",
642 " 'bg': 64988,\n",
643 " 'bh': 3540,\n",
644 " 'bi': 0,\n",
645 " 'bj': 0,\n",
646 " 'bk': 0,\n",
647 " 'bl': 2009,\n",
648 " 'bm': 0,\n",
649 " 'bn': 2009,\n",
650 " 'bo': 502,\n",
651 " 'bp': 251,\n",
652 " 'bq': 62,\n",
653 " 'br': 255,\n",
654 " 'bs': 58,\n",
655 " 'bt': 65477,\n",
656 " 'bu': 197,\n",
657 " 'bv': 503,\n",
658 " 'bw': 196,\n",
659 " 'bx': 65339,\n",
660 " 'by': 307,\n",
661 " 'bz': 2043,\n",
662 " 'c': 0,\n",
663 " 'ca': 273,\n",
664 " 'cb': 65262,\n",
665 " 'cc': 1770,\n",
666 " 'cd': 0,\n",
667 " 'ce': 0,\n",
668 " 'cf': 0,\n",
669 " 'cg': 1004,\n",
670 " 'ch': 0,\n",
671 " 'ci': 1004,\n",
672 " 'cj': 251,\n",
673 " 'ck': 125,\n",
674 " 'cl': 31,\n",
675 " 'cm': 127,\n",
676 " 'cn': 29,\n",
677 " 'co': 65506,\n",
678 " 'cp': 98,\n",
679 " 'cq': 251,\n",
680 " 'cr': 98,\n",
681 " 'cs': 65437,\n",
682 " 'ct': 153,\n",
683 " 'cu': 1021,\n",
684 " 'cv': 136,\n",
685 " 'cw': 65399,\n",
686 " 'cx': 885,\n",
687 " 'cy': 1,\n",
688 " 'cz': 0,\n",
689 " 'd': 4019,\n",
690 " 'da': 1,\n",
691 " 'db': 502,\n",
692 " 'dc': 32768,\n",
693 " 'dd': 33270,\n",
694 " 'de': 8317,\n",
695 " 'df': 4158,\n",
696 " 'dg': 1039,\n",
697 " 'dh': 5183,\n",
698 " 'di': 14,\n",
699 " 'dj': 65521,\n",
700 " 'dk': 5169,\n",
701 " 'dl': 13437,\n",
702 " 'dm': 49,\n",
703 " 'dn': 65486,\n",
704 " 'do': 13388,\n",
705 " 'dp': 46590,\n",
706 " 'dq': 68,\n",
707 " 'dr': 65467,\n",
708 " 'ds': 46522,\n",
709 " 'dt': 0,\n",
710 " 'du': 2,\n",
711 " 'dv': 2,\n",
712 " 'dw': 16635,\n",
713 " 'dx': 0,\n",
714 " 'dy': 16635,\n",
715 " 'dz': 4158,\n",
716 " 'e': 2009,\n",
717 " 'ea': 2079,\n",
718 " 'eb': 519,\n",
719 " 'ec': 2591,\n",
720 " 'ed': 7,\n",
721 " 'ee': 65528,\n",
722 " 'ef': 2584,\n",
723 " 'eg': 6718,\n",
724 " 'eh': 24,\n",
725 " 'ei': 65511,\n",
726 " 'ej': 6694,\n",
727 " 'ek': 23295,\n",
728 " 'el': 34,\n",
729 " 'em': 65501,\n",
730 " 'en': 23261,\n",
731 " 'eo': 1,\n",
732 " 'ep': 4,\n",
733 " 'eq': 5,\n",
734 " 'er': 8317,\n",
735 " 'es': 32768,\n",
736 " 'et': 41085,\n",
737 " 'eu': 10271,\n",
738 " 'ev': 5135,\n",
739 " 'ew': 1283,\n",
740 " 'ex': 5391,\n",
741 " 'ey': 1027,\n",
742 " 'ez': 64508,\n",
743 " 'f': 502,\n",
744 " 'fa': 4364,\n",
745 " 'fb': 14623,\n",
746 " 'fc': 12,\n",
747 " 'fd': 65523,\n",
748 " 'fe': 14611,\n",
749 " 'ff': 47487,\n",
750 " 'fg': 8209,\n",
751 " 'fh': 57326,\n",
752 " 'fi': 39278,\n",
753 " 'fj': 0,\n",
754 " 'fk': 10,\n",
755 " 'fl': 10,\n",
756 " 'fm': 20542,\n",
757 " 'fn': 0,\n",
758 " 'fo': 20542,\n",
759 " 'fp': 5135,\n",
760 " 'fq': 2567,\n",
761 " 'fr': 641,\n",
762 " 'fs': 2695,\n",
763 " 'ft': 513,\n",
764 " 'fu': 65022,\n",
765 " 'fv': 2182,\n",
766 " 'fw': 7311,\n",
767 " 'fx': 6,\n",
768 " 'fy': 65529,\n",
769 " 'fz': 7305,\n",
770 " 'g': 2047,\n",
771 " 'ga': 23743,\n",
772 " 'gb': 4104,\n",
773 " 'gc': 61431,\n",
774 " 'gd': 19639,\n",
775 " 'ge': 1,\n",
776 " 'gf': 20,\n",
777 " 'gg': 21,\n",
778 " 'gh': 10271,\n",
779 " 'gi': 32768,\n",
780 " 'gj': 43039,\n",
781 " 'gk': 10759,\n",
782 " 'gl': 5379,\n",
783 " 'gm': 1344,\n",
784 " 'gn': 5443,\n",
785 " 'go': 1280,\n",
786 " 'gp': 64255,\n",
787 " 'gq': 4163,\n",
788 " 'gr': 14919,\n",
789 " 'gs': 3,\n",
790 " 'gt': 65532,\n",
791 " 'gu': 14916,\n",
792 " 'gv': 47711,\n",
793 " 'gw': 10244,\n",
794 " 'gx': 55291,\n",
795 " 'gy': 37467,\n",
796 " 'gz': 1,\n",
797 " 'h': 464,\n",
798 " 'ha': 42,\n",
799 " 'hb': 43,\n",
800 " 'hc': 21519,\n",
801 " 'hd': 32768,\n",
802 " 'he': 54287,\n",
803 " 'hf': 13571,\n",
804 " 'hg': 6785,\n",
805 " 'hh': 1696,\n",
806 " 'hi': 7841,\n",
807 " 'hj': 640,\n",
808 " 'hk': 64895,\n",
809 " 'hl': 7201,\n",
810 " 'hm': 15651,\n",
811 " 'hn': 5121,\n",
812 " 'ho': 60414,\n",
813 " 'hp': 10530,\n",
814 " 'hq': 64815,\n",
815 " 'hr': 2,\n",
816 " 'hs': 65533,\n",
817 " 'ht': 64813,\n",
818 " 'hu': 1,\n",
819 " 'hv': 86,\n",
820 " 'hw': 87,\n",
821 " 'hx': 27143,\n",
822 " 'hy': 32768,\n",
823 " 'hz': 59911,\n",
824 " 'i': 65071,\n",
825 " 'ia': 14977,\n",
826 " 'ib': 7488,\n",
827 " 'ic': 1872,\n",
828 " 'id': 8016,\n",
829 " 'ie': 1344,\n",
830 " 'if': 64191,\n",
831 " 'ig': 6672,\n",
832 " 'ih': 14993,\n",
833 " 'ii': 6656,\n",
834 " 'ij': 58879,\n",
835 " 'ik': 8337,\n",
836 " 'il': 60055,\n",
837 " 'im': 8193,\n",
838 " 'in': 57342,\n",
839 " 'io': 51862,\n",
840 " 'ip': 0,\n",
841 " 'iq': 174,\n",
842 " 'ir': 174,\n",
843 " 'is': 29955,\n",
844 " 'it': 0,\n",
845 " 'iu': 29955,\n",
846 " 'iv': 7488,\n",
847 " 'iw': 3744,\n",
848 " 'ix': 936,\n",
849 " 'iy': 4008,\n",
850 " 'iz': 672,\n",
851 " 'j': 1583,\n",
852 " 'ja': 64863,\n",
853 " 'jb': 3336,\n",
854 " 'jc': 7496,\n",
855 " 'jd': 3328,\n",
856 " 'je': 62207,\n",
857 " 'jf': 4168,\n",
858 " 'jg': 30027,\n",
859 " 'jh': 4096,\n",
860 " 'ji': 61439,\n",
861 " 'jj': 25931,\n",
862 " 'jk': 1,\n",
863 " 'jl': 348,\n",
864 " 'jm': 349,\n",
865 " 'jn': 14977,\n",
866 " 'jo': 32768,\n",
867 " 'jp': 47745,\n",
868 " 'jq': 11936,\n",
869 " 'jr': 5968,\n",
870 " 'js': 1492,\n",
871 " 'jt': 6100,\n",
872 " 'ju': 1360,\n",
873 " 'jv': 64175,\n",
874 " 'jw': 4740,\n",
875 " 'jx': 16036,\n",
876 " 'jy': 640,\n",
877 " 'jz': 64895,\n",
878 " 'k': 4031,\n",
879 " 'ka': 15396,\n",
880 " 'kb': 48805,\n",
881 " 'kc': 14336,\n",
882 " 'kd': 51199,\n",
883 " 'ke': 34469,\n",
884 " 'kf': 1,\n",
885 " 'kg': 698,\n",
886 " 'kh': 699,\n",
887 " 'ki': 23872,\n",
888 " 'kj': 32768,\n",
889 " 'kk': 56640,\n",
890 " 'kl': 14160,\n",
891 " 'km': 7080,\n",
892 " 'kn': 1770,\n",
893 " 'ko': 8170,\n",
894 " 'kp': 680,\n",
895 " 'kq': 64855,\n",
896 " 'kr': 7490,\n",
897 " 'ks': 16210,\n",
898 " 'kt': 5440,\n",
899 " 'ku': 60095,\n",
900 " 'kv': 10770,\n",
901 " 'kw': 65362,\n",
902 " 'kx': 2048,\n",
903 " 'ky': 63487,\n",
904 " 'kz': 63314,\n",
905 " 'l': 1571,\n",
906 " 'la': 0,\n",
907 " 'lb': 1398,\n",
908 " 'lc': 1398,\n",
909 " 'ld': 28320,\n",
910 " 'le': 0,\n",
911 " 'lf': 28320,\n",
912 " 'lg': 7080,\n",
913 " 'lh': 3540,\n",
914 " 'li': 885,\n",
915 " 'lj': 4085,\n",
916 " 'lk': 340,\n",
917 " 'll': 65195,\n",
918 " 'lm': 3745,\n",
919 " 'ln': 8105,\n",
920 " 'lo': 2720,\n",
921 " 'lp': 62815,\n",
922 " 'lq': 5385,\n",
923 " 'lr': 32681,\n",
924 " 'ls': 1024,\n",
925 " 'lt': 64511,\n",
926 " 'lu': 31657,\n",
927 " 'lv': 1,\n",
928 " 'lw': 2796,\n",
929 " 'lx': 2797,\n",
930 " 'ly': 14160,\n",
931 " 'lz': 32768,\n",
932 " 'm': 63964,\n",
933 " 'ma': 46928,\n",
934 " 'n': 2460,\n",
935 " 'o': 16348,\n",
936 " 'p': 2188,\n",
937 " 'q': 63347,\n",
938 " 'r': 14160,\n",
939 " 's': 0,\n",
940 " 't': 0,\n",
941 " 'u': 0,\n",
942 " 'v': 8038,\n",
943 " 'w': 0,\n",
944 " 'x': 8038,\n",
945 " 'y': 2009,\n",
946 " 'z': 1004}"
947 ]
948 },
949 "execution_count": 13,
950 "metadata": {},
951 "output_type": "execute_result"
952 }
953 ],
954 "source": [
955 "known"
956 ]
957 },
958 {
959 "cell_type": "code",
960 "execution_count": null,
961 "metadata": {
962 "collapsed": true
963 },
964 "outputs": [],
965 "source": []
966 }
967 ],
968 "metadata": {
969 "kernelspec": {
970 "display_name": "Python 3",
971 "language": "python",
972 "name": "python3"
973 },
974 "language_info": {
975 "codemirror_mode": {
976 "name": "ipython",
977 "version": 3
978 },
979 "file_extension": ".py",
980 "mimetype": "text/x-python",
981 "name": "python",
982 "nbconvert_exporter": "python",
983 "pygments_lexer": "ipython3",
984 "version": "3.4.3"
985 }
986 },
987 "nbformat": 4,
988 "nbformat_minor": 0
989 }