Removing files from data analysis directory
[ou-summer-of-code-2017.git] / 02-lifts / part2-brainfuck.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 7,
6 "metadata": {
7 "collapsed": true
8 },
9 "outputs": [],
10 "source": [
11 "from IPython.utils import io"
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 1,
17 "metadata": {
18 "collapsed": true
19 },
20 "outputs": [],
21 "source": [
22 "#!/usr/bin/python\n",
23 "#\n",
24 "# Brainfuck Interpreter\n",
25 "# Copyright 2011 Sebastian Kaspari\n",
26 "#\n",
27 "# Usage: ./brainfuck.py [FILE]\n",
28 "\n",
29 "import sys\n",
30 "\n",
31 "def execute(filename):\n",
32 " f = open(filename, \"r\")\n",
33 " evaluate(f.read())\n",
34 " f.close()\n",
35 "\n",
36 "\n",
37 "def evaluate(code, inp=None, debug=False):\n",
38 " code = cleanup(list(code))\n",
39 " bracemap = buildbracemap(code)\n",
40 "\n",
41 " cells, codeptr, cellptr = [0], 0, 0\n",
42 " inputptr = 0\n",
43 " outputs = []\n",
44 "\n",
45 " try:\n",
46 " while codeptr < len(code):\n",
47 " command = code[codeptr]\n",
48 " \n",
49 " if debug:\n",
50 " print(command, cellptr, cells)\n",
51 "\n",
52 " if command == \">\":\n",
53 " cellptr += 1\n",
54 " if cellptr == len(cells): cells.append(0)\n",
55 "\n",
56 " if command == \"<\":\n",
57 " cellptr = 0 if cellptr <= 0 else cellptr - 1\n",
58 "\n",
59 " if command == \"+\":\n",
60 " cells[cellptr] = cells[cellptr] + 1 if cells[cellptr] < 255 else 0\n",
61 "\n",
62 " if command == \"-\":\n",
63 " cells[cellptr] = cells[cellptr] - 1 if cells[cellptr] > 0 else 255\n",
64 "\n",
65 " if command == \"[\" and cells[cellptr] == 0: codeptr = bracemap[codeptr]\n",
66 " if command == \"]\" and cells[cellptr] != 0: codeptr = bracemap[codeptr]\n",
67 " if command == \".\": \n",
68 " outputs += [cells[cellptr]]\n",
69 " print(cells[cellptr]) # sys.stdout.write(chr(cells[cellptr]))\n",
70 " if command == \",\": \n",
71 " if inp is not None:\n",
72 " if inputptr >= len(inp):\n",
73 "# raise EOFError\n",
74 " cells[cellptr] = 0\n",
75 " else:\n",
76 " cells[cellptr] = ord(inp[inputptr])\n",
77 " inputptr += 1\n",
78 " else:\n",
79 " cells[cellptr] = ord(getch.getch())\n",
80 "\n",
81 " codeptr += 1\n",
82 " except EOFError:\n",
83 " pass\n",
84 " return cells, codeptr, cellptr, outputs\n",
85 "\n",
86 "\n",
87 "def cleanup(code):\n",
88 " return list(filter(lambda x: x in ['.', ',', '[', ']', '<', '>', '+', '-'], code))\n",
89 "\n",
90 "\n",
91 "def buildbracemap(code):\n",
92 " temp_bracestack, bracemap = [], {}\n",
93 "\n",
94 " for position, command in enumerate(code):\n",
95 " if command == \"[\": temp_bracestack.append(position)\n",
96 " if command == \"]\":\n",
97 " start = temp_bracestack.pop()\n",
98 " bracemap[start] = position\n",
99 " bracemap[position] = start\n",
100 " return bracemap\n",
101 "\n",
102 "\n",
103 "# def main():\n",
104 "# if len(sys.argv) == 2: execute(sys.argv[1])\n",
105 "# else: print(\"Usage:\", sys.argv[0], \"filename\")\n",
106 "\n",
107 "# if __name__ == \"__main__\": main()\n"
108 ]
109 },
110 {
111 "cell_type": "code",
112 "execution_count": 2,
113 "metadata": {},
114 "outputs": [
115 {
116 "data": {
117 "text/plain": [
118 "(118, 94, 61)"
119 ]
120 },
121 "execution_count": 2,
122 "metadata": {},
123 "output_type": "execute_result"
124 }
125 ],
126 "source": [
127 "ord('v'), ord('^'), ord('=')"
128 ]
129 },
130 {
131 "cell_type": "markdown",
132 "metadata": {},
133 "source": [
134 "```\n",
135 "set cell 1 to 61\n",
136 "set cell 2 to 94-61=33\n",
137 "set cell 3 to 118-94=24\n",
138 "copy cell 1 into cell 0, using cell 4\n",
139 "\n",
140 "cell 5 for ???? currently at an exit: 1 if at an exit, 0 otherwise\n",
141 "\n",
142 "set cell 6 to 0 (current level)\n",
143 "set cell 7 to for non-negative flag: 0 for +ive, 1 for -ive, 0 for zero.\n",
144 "set cell 8 to 0 (highest exit)\n",
145 "cell 9 for input\n",
146 "cell 10 for whether input has been dealt with: 0 for yes, 1 for no\n",
147 "reserve cell 11 and higher for scratch\n",
148 "\n",
149 "read character into cell 9\n",
150 "while cell 9 != 0\n",
151 " subtract cell 0 from cell 9\n",
152 " if cell 9 == 0 we're at an exit\n",
153 " if cell 7 != 0\n",
154 " if cell 6 is higher than cell 7\n",
155 " copy cell 6 into cell 7\n",
156 " else\n",
157 " subtract cell 2 from cell 9\n",
158 " if cell 9 == 0 we're going up\n",
159 " increment cell 6\n",
160 " if cell 6 is zero\n",
161 " if cell 7 != 0\n",
162 " decrement cell 7\n",
163 " else\n",
164 " decrement cell 6\n",
165 " \n",
166 " copy cell 1 into cell 0 using cell 4\n",
167 " read character into cell 9\n",
168 " \n",
169 "output cell 7\n",
170 "```"
171 ]
172 },
173 {
174 "cell_type": "markdown",
175 "metadata": {},
176 "source": [
177 "```\n",
178 "set cell 1 to 61 # exit\n",
179 "set cell 2 to 94-61=33 # up\n",
180 "set cell 3 to 118-94=24 # down\n",
181 "copy cell 1 into cell 0, using cell 4\n",
182 "\n",
183 "cell 5 for ???? currently at an exit: 1 if at an exit 0 otherwise\n",
184 "\n",
185 "set cell 6 to 0 (current level)\n",
186 "set cell 7 to for height above ground, min zero\n",
187 "set cell 8 to 0 (highest exit)\n",
188 "cell 9 for input\n",
189 "cell 10 for whether input has been dealt with: 0 for yes 1 for no\n",
190 "cell 11 for whether we've dealt with the height above zero cell\n",
191 "reserve cell 12 and higher for scratch\n",
192 "\n",
193 "\n",
194 "\n",
195 "\n",
196 "read character into cell 9\n",
197 "set cell 10 to 1\n",
198 "while cell 9 != 0 # have an input\n",
199 " subtract cell 1 from cell 9\n",
200 " while cell 9 != 0 # we're not at an exit\n",
201 " set cell 10 to 0\n",
202 " subtract cell 2 from cell 9\n",
203 " while cell 9 != 0 # we're going down\n",
204 " set cell 11 to 0\n",
205 " set cell 12 to 1\n",
206 " decrement cell 6\n",
207 " while cell 6 != 0 # haven't just descended to ground floor\n",
208 " while cell 7 != 0 # above ground\n",
209 " decrement cell 7\n",
210 " set cell 12 to 0 to finish loop\n",
211 " end\n",
212 " end\n",
213 " end\n",
214 " \n",
215 " while cell 11 != 0 # now deal with going up\n",
216 " set cell 12 to 1\n",
217 " while cell 6 != 0 # not on ground before going up\n",
218 " while cell 7 != 0 # above ground\n",
219 " increment cell 7\n",
220 " set cell 12 to 0 to finish the inner loop\n",
221 " end\n",
222 " set cell 12 to 0 to finish the loop\n",
223 " end\n",
224 " increment cell 6\n",
225 " end\n",
226 " end\n",
227 " \n",
228 " while cell 10 != 0 (at an exit)\n",
229 " while cell 7 != 0 (above ground level)\n",
230 " copy cell 8 to cell 11 using cell 13 (highest)\n",
231 " copy cell 7 to cell 12 using cell 13 (current)\n",
232 " \n",
233 " set cell 14 to 0\n",
234 " while cell 11 != 0\n",
235 " while cell 12 != 0\n",
236 " decrement cell 12\n",
237 " move pointer to 14 to terminate inner loop\n",
238 " end\n",
239 " decrement cell 11\n",
240 " end\n",
241 " \n",
242 " add cell 12 to cell 8\n",
243 " end\n",
244 " \n",
245 " copy cell 1 into cell 0 using cell 4\n",
246 " read character into cell 9\n",
247 " set cell 10 to 1\n",
248 "end \n",
249 "```\n"
250 ]
251 },
252 {
253 "cell_type": "markdown",
254 "metadata": {},
255 "source": [
256 "```\n",
257 "set cell 1 to 61 # exit\n",
258 "set cell 2 to 94-61=33 # up\n",
259 "set cell 3 to 118-94=24 # down\n",
260 "copy cell 1 into cell 0, using cell 4\n",
261 "\n",
262 "cell 5 for ???? currently at an exit: 1 if at an exit 0 otherwise\n",
263 "\n",
264 "set cell 6 to 0 (current level)\n",
265 "set cell 7 to for height above ground, min zero\n",
266 "set cell 8 to 0 (highest exit)\n",
267 "cell 9 for input\n",
268 "cell 10 for whether input has been dealt with: 0 for yes 1 for no\n",
269 "cell 11 for whether we've dealt with the height above zero cell\n",
270 "reserve cell 12 and higher for scratch\n",
271 "\n",
272 "\n",
273 "read character into cell 9\n",
274 "set cell 10 to 1\n",
275 "while cell 9 != 0 # have an input\n",
276 " subtract cell 1 from cell 9\n",
277 " while cell 9 != 0 # we're not at an exit\n",
278 " set cell 10 to 0\n",
279 " subtract cell 2 from cell 9\n",
280 " while cell 9 != 0 # we're going down\n",
281 " \n",
282 " while cell 6 != 0 # aren't descending from ground floor\n",
283 " copy cell 7 to cell 11 using cell 12\n",
284 " set cell 12 to 0\n",
285 " while cell 11 != 0 # above ground\n",
286 " set cell 12 to 1\n",
287 " decrement cell 11\n",
288 " end\n",
289 " while cell 12 != 0\n",
290 " decrement cell 7\n",
291 " decrement cell 12\n",
292 " end\n",
293 " end\n",
294 " decrement cell 6\n",
295 "\n",
296 " end\n",
297 " \n",
298 " subtract cell 3 from cell 9\n",
299 " while cell 9 != 0 # we're going up\n",
300 " increment cell 6\n",
301 " while cell 6 != 0 # haven't just ascended to ground floor\n",
302 " copy cell 7 to cell 11 using cell 12\n",
303 " set cell 12 to 0\n",
304 " while cell 11 != 0\n",
305 " set cell 12 to 1\n",
306 " decrement cell 11\n",
307 " end\n",
308 " while cell 12 != 0\n",
309 " increment cell 7\n",
310 " decrement cell 12\n",
311 " end\n",
312 " end\n",
313 " end\n",
314 " \n",
315 " while cell 10 != 0 # at an exit\n",
316 " while cell 7 != 0 (above ground level)\n",
317 " copy cell 8 to cell 11 using cell 13 (highest)\n",
318 " copy cell 7 to cell 12 using cell 13 (current)\n",
319 " \n",
320 " # subtract 11 from 12, ensuring 12 >= 0\n",
321 " # add 12 to 8\n",
322 " \n",
323 " while cell 11 != 0\n",
324 " set cell 13 to 0\n",
325 " copy cell 12 to cell 14 using cell 15\n",
326 " while cell 14 != 0\n",
327 " set cell 13 to 1\n",
328 " decrement cell 14\n",
329 " end\n",
330 " while cell 13 != 0\n",
331 " decrement cell 12\n",
332 " decrement cell 13\n",
333 " end\n",
334 " decrement cell 11\n",
335 " end\n",
336 " \n",
337 " add cell 12 to cell 8\n",
338 " \n",
339 " copy cell 1 into cell 0 using cell 4\n",
340 " read character into cell 9\n",
341 " set cell 10 to 1\n",
342 "end \n",
343 "output cell 8\n",
344 "```\n"
345 ]
346 },
347 {
348 "cell_type": "code",
349 "execution_count": 3,
350 "metadata": {},
351 "outputs": [
352 {
353 "name": "stdout",
354 "output_type": "stream",
355 "text": [
356 ">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>+++++++++++++++++++++++++++++++++>++++++++++++++++++++++++\n",
357 "\n",
358 "\n",
359 "read character into cell 9\n",
360 ">>>>>>,\n",
361 "\n",
362 "\n",
363 "\n",
364 "while cell 9 != 0 # have an input\n",
365 "[\n",
366 " set cell 10 to 1\n",
367 " >[-]+\n",
368 "\n",
369 " # clear cells 4 and 0\n",
370 " <<<<<<[-]<<<<[-]>\n",
371 " # copy cell 1 to cell 0 using cell 4\n",
372 " [-<+>>>>+<<<]\n",
373 " >>>[-<<<+>>>]\n",
374 " <<<<\n",
375 " \n",
376 " subtract cell 0 from cell 9 \n",
377 " [->>>>>>>>>-<<<<<<<<<]\n",
378 " >>>>>>>>>\n",
379 " \n",
380 " while cell 9 != 0 # we're not at an exit\n",
381 " [\n",
382 " set cell 10 to 0\n",
383 " >[-]\n",
384 " \n",
385 " copy cell 2 to cell 0 using cell 4\n",
386 " <<<<<<<<[-<<+>>>>+<<]\n",
387 " >>[-<<+>>]\n",
388 " <<<<\n",
389 " \n",
390 " subtract cell 0 from cell 9\n",
391 " [->>>>>>>>>-<<<<<<<<<]\n",
392 " >>>>>\n",
393 "\n",
394 " set cell 5 to 1\n",
395 " [-]+\n",
396 " >>>>\n",
397 "\n",
398 " \n",
399 " while cell 9 != 0 # we're going down\n",
400 " [\n",
401 " clear cell 5\n",
402 " <<<<[-]\n",
403 " copy cell 7 to cell 11 using cell 12\n",
404 " >>[->>>>+>+<<<<<]\n",
405 " >>>>>[-<<<<<+>>>>>]\n",
406 " \n",
407 " cell 12 is zero\n",
408 " \n",
409 " while cell 11 != 0 # above ground\n",
410 " <\n",
411 " [\n",
412 " set cell 12 to 1\n",
413 " >[-]+\n",
414 " \n",
415 " clear cell 11\n",
416 " <[-]\n",
417 " end\n",
418 " ] 11\n",
419 " \n",
420 " while cell 12 != 0\n",
421 " >\n",
422 " [\n",
423 " decrement cell 7\n",
424 " <<<<<-\n",
425 " \n",
426 " set cell 12 to zero\n",
427 " >>>>>[-]\n",
428 " end\n",
429 " ] 12\n",
430 " \n",
431 " <<<<<<\n",
432 " decrement cell 6\n",
433 " -\n",
434 " \n",
435 " have now dealt with the input so clear cell 9\n",
436 " >>>[-]\n",
437 " end\n",
438 " ] 9\n",
439 " \n",
440 " \n",
441 " while cell 5 != 0 # we're going up\n",
442 " <<<<\n",
443 " [\n",
444 " clear cell 5\n",
445 " [-]\n",
446 "\n",
447 "\n",
448 " # set cell 12 to 0\n",
449 " >>>>>>>[-]\n",
450 "\n",
451 " ### if 6 == 0 or 7 != 0\n",
452 " ### set cell 12 to 1\n",
453 "\n",
454 " # copy cell 6 to cell 11 using cell 12\n",
455 " <<<<<<[->>>>>+>+<<<<<<]\n",
456 " >>>>>>[-<<<<<<+>>>>>>]\n",
457 " \n",
458 " set cell 12 to 1\n",
459 " [-]+\n",
460 "\n",
461 " while cell 11 != 0\n",
462 " <\n",
463 " [\n",
464 " clear cell 12\n",
465 " >[-]\n",
466 "\n",
467 " set cell 11 to 0\n",
468 " <[-]\n",
469 " end 11\n",
470 " ] 11\n",
471 "\n",
472 "\n",
473 "\n",
474 " # copy cell 7 to cell 11 using cell 13\n",
475 " <<<<[->>>>+>>+<<<<<<]\n",
476 " >>>>>>[-<<<<<<+>>>>>>]\n",
477 "\n",
478 " # while cell 11 != 0\n",
479 " <<\n",
480 " [\n",
481 " set cell 12 to 1\n",
482 " >[-]+\n",
483 "\n",
484 " set cell 11 to 0\n",
485 " <[-]\n",
486 " \n",
487 " # end 11\n",
488 " ] 11\n",
489 " # add cell 12 to cell 7\n",
490 " >[-<<<<<+>>>>>]\n",
491 "\n",
492 " # increment cell 6\n",
493 " <<<<<<+\n",
494 " <\n",
495 " end\n",
496 " ] 5\n",
497 " \n",
498 " have now dealt with the non exit node\n",
499 " clear cell 9\n",
500 " >>>> \n",
501 " [-]\n",
502 " end\n",
503 " ] 9\n",
504 " \n",
505 " while cell 10 != 0 # at an exit\n",
506 " >\n",
507 " [\n",
508 " copy cell 7 to cell 12 using cell 13 (highest)\n",
509 " <<<[->>>>>+>+<<<<<<]\n",
510 " >>>>>>[-<<<<<<+>>>>>>]\n",
511 " \n",
512 " while cell 12 != 0 (above ground level)\n",
513 " <\n",
514 " [\n",
515 " copy cell 8 to cell 11 using cell 13 (highest)\n",
516 " <<<<[->>>+>>+<<<<<]\n",
517 " >>>>>[-<<<<<+>>>>>]\n",
518 " \n",
519 " cell 13 is zero\n",
520 " \n",
521 " ### subtract 11 from 12 ensuring 12 gte 0\n",
522 " ### add 12 to 8\n",
523 " \n",
524 " while cell 11 != 0\n",
525 " <<\n",
526 " [\n",
527 " copy cell 12 to cell 14 using cell 15\n",
528 " >[->>+>+<<<]\n",
529 " >>>[-<<<+>>>]\n",
530 " \n",
531 " while cell 14 != 0\n",
532 " <\n",
533 " [\n",
534 " set cell 13 to 1\n",
535 " <[-]+\n",
536 " decrement cell 14\n",
537 " >-\n",
538 " end\n",
539 " ] 14\n",
540 " while cell 13 != 0\n",
541 " <\n",
542 " [\n",
543 " decrement cell 12\n",
544 " <-\n",
545 " decrement cell 13\n",
546 " >-\n",
547 " end\n",
548 " ] 13\n",
549 " \n",
550 " decrement cell 11\n",
551 " <<-\n",
552 " end\n",
553 " ] 11\n",
554 " \n",
555 " >[-<<<<+>>>>]\n",
556 " add cell 12 to cell 8\n",
557 " ] 12\n",
558 " <<\n",
559 " clear 10\n",
560 " [-]\n",
561 " ] 10\n",
562 " \n",
563 " \n",
564 " \n",
565 " read character into cell 9\n",
566 " <,\n",
567 "end \n",
568 "] 9\n",
569 "\n",
570 "output cell 8\n",
571 "<.\n",
572 "\n",
573 "\n",
574 "\n"
575 ]
576 }
577 ],
578 "source": [
579 "program = open('part2.bf').read()\n",
580 "print(program)"
581 ]
582 },
583 {
584 "cell_type": "code",
585 "execution_count": 4,
586 "metadata": {},
587 "outputs": [
588 {
589 "data": {
590 "text/plain": [
591 "118"
592 ]
593 },
594 "execution_count": 4,
595 "metadata": {},
596 "output_type": "execute_result"
597 }
598 ],
599 "source": [
600 "61+33+24"
601 ]
602 },
603 {
604 "cell_type": "code",
605 "execution_count": 5,
606 "metadata": {},
607 "outputs": [
608 {
609 "name": "stdout",
610 "output_type": "stream",
611 "text": [
612 "1\n"
613 ]
614 },
615 {
616 "data": {
617 "text/plain": [
618 "([0, 61, 33, 24, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0], 698, 8, [1])"
619 ]
620 },
621 "execution_count": 5,
622 "metadata": {},
623 "output_type": "execute_result"
624 }
625 ],
626 "source": [
627 "evaluate(program, inp='^=')"
628 ]
629 },
630 {
631 "cell_type": "code",
632 "execution_count": 8,
633 "metadata": {},
634 "outputs": [
635 {
636 "data": {
637 "text/plain": [
638 "176223"
639 ]
640 },
641 "execution_count": 8,
642 "metadata": {},
643 "output_type": "execute_result"
644 }
645 ],
646 "source": [
647 "with io.capture_output() as captured:\n",
648 " evaluate(program, inp='^', debug=True)\n",
649 "\n",
650 "open('bf.log', 'w').write(captured.stdout)"
651 ]
652 },
653 {
654 "cell_type": "code",
655 "execution_count": 9,
656 "metadata": {},
657 "outputs": [
658 {
659 "name": "stdout",
660 "output_type": "stream",
661 "text": [
662 "1\n"
663 ]
664 },
665 {
666 "data": {
667 "text/plain": [
668 "([0, 61, 33, 24, 0, 0, 3, 3, 1, 0, 0, 0, 0, 0], 698, 8, [1])"
669 ]
670 },
671 "execution_count": 9,
672 "metadata": {},
673 "output_type": "execute_result"
674 }
675 ],
676 "source": [
677 "evaluate(program, inp='^^v=^^^v')"
678 ]
679 },
680 {
681 "cell_type": "code",
682 "execution_count": 10,
683 "metadata": {},
684 "outputs": [
685 {
686 "data": {
687 "text/plain": [
688 "'>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>+++++++++++++++++++++++++++++++++>++++++++++++++++++++++++>>>>>>,[>[-]+<<<<<<[-]<<<<[-]>[-<+>>>>+<<<]>>>[-<<<+>>>]<<<<[->>>>>>>>>-<<<<<<<<<]>>>>>>>>>[>[-]<<<<<<<<[-<<+>>>>+<<]>>[-<<+>>]<<<<[->>>>>>>>>-<<<<<<<<<]>>>>>[-]+>>>>[<<<<[-]>>[->>>>+>+<<<<<]>>>>>[-<<<<<+>>>>>]<[>[-]+<[-]]>[<<<<<->>>>>[-]]<<<<<<->>>[-]]<<<<[[-]>>>>>>>[-]<<<<<<[->>>>>+>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>][-]+<[>[-]<[-]]<<<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[>[-]+<[-]]>[-<<<<<+>>>>>]<<<<<<+<]>>>>[-]]>[<<<[->>>>>+>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<[<<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[>[->>+>+<<<]>>>[-<<<+>>>]<[<[-]+>-]<[<->-]<<-]>[-<<<<+>>>>]]<<[-]]<,]<.'"
689 ]
690 },
691 "execution_count": 10,
692 "metadata": {},
693 "output_type": "execute_result"
694 }
695 ],
696 "source": [
697 "''.join(cleanup(program))"
698 ]
699 },
700 {
701 "cell_type": "code",
702 "execution_count": 11,
703 "metadata": {
704 "collapsed": true
705 },
706 "outputs": [],
707 "source": [
708 "with open('part2.clean.bf', 'w') as f:\n",
709 " for i, c in enumerate(''.join(cleanup(program))):\n",
710 " f.write('{:03} {}\\n'.format(i, c))"
711 ]
712 },
713 {
714 "cell_type": "code",
715 "execution_count": 12,
716 "metadata": {},
717 "outputs": [
718 {
719 "data": {
720 "text/plain": [
721 "699"
722 ]
723 },
724 "execution_count": 12,
725 "metadata": {},
726 "output_type": "execute_result"
727 }
728 ],
729 "source": [
730 "open('part2.clean.bf', 'w').write(''.join(cleanup(program))+'\\n')"
731 ]
732 },
733 {
734 "cell_type": "code",
735 "execution_count": 123,
736 "metadata": {},
737 "outputs": [
738 {
739 "data": {
740 "text/plain": [
741 "([60, 60, 0, 15, 0], 152, 4)"
742 ]
743 },
744 "execution_count": 123,
745 "metadata": {},
746 "output_type": "execute_result"
747 }
748 ],
749 "source": [
750 "inp = open('02-lifts.txt').read().strip()\n",
751 "evaluate(program, inp=inp)"
752 ]
753 },
754 {
755 "cell_type": "code",
756 "execution_count": 124,
757 "metadata": {
758 "collapsed": true
759 },
760 "outputs": [],
761 "source": [
762 "def value(instr):\n",
763 " if instr == '^':\n",
764 " return 1\n",
765 " elif instr == 'v':\n",
766 " return -1\n",
767 " else:\n",
768 " return 0"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 125,
774 "metadata": {
775 "collapsed": true
776 },
777 "outputs": [],
778 "source": [
779 "def final(sequence):\n",
780 " current = 0\n",
781 " for c in sequence:\n",
782 " current += value(c)\n",
783 " return current"
784 ]
785 },
786 {
787 "cell_type": "code",
788 "execution_count": 126,
789 "metadata": {},
790 "outputs": [
791 {
792 "data": {
793 "text/plain": [
794 "209"
795 ]
796 },
797 "execution_count": 126,
798 "metadata": {},
799 "output_type": "execute_result"
800 }
801 ],
802 "source": [
803 "final(inp)"
804 ]
805 },
806 {
807 "cell_type": "code",
808 "execution_count": 193,
809 "metadata": {
810 "scrolled": true
811 },
812 "outputs": [
813 {
814 "name": "stdout",
815 "output_type": "stream",
816 "text": [
817 "0 ([94, 94, 24, 0, 0, 0], 144, 5) \n",
818 "-1 ([94, 94, 24, 0, 255, 0], 255, 5) v\n",
819 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vv\n",
820 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv\n",
821 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^\n",
822 "-1 ([94, 94, 24, 0, 255, 0], 255, 5) vvv^^\n",
823 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v\n",
824 "-1 ([94, 94, 24, 0, 255, 0], 255, 5) vvv^^v^\n",
825 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v^v\n",
826 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v^v=\n",
827 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv^^v^v=v\n",
828 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv\n",
829 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv^^v^v=vv^\n",
830 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv^v\n",
831 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv^^v^v=vv^v^\n",
832 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v^v=vv^v^^\n",
833 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv^^v^v=vv^v^^v\n",
834 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv^v^^vv\n",
835 "-5 ([94, 94, 24, 0, 251, 0], 255, 5) vvv^^v^v=vv^v^^vvv\n",
836 "-6 ([94, 94, 24, 0, 250, 0], 255, 5) vvv^^v^v=vv^v^^vvvv\n",
837 "-5 ([94, 94, 24, 0, 251, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^\n",
838 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^\n",
839 "-5 ([94, 94, 24, 0, 251, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v\n",
840 "-5 ([94, 94, 24, 0, 251, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=\n",
841 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^\n",
842 "-4 ([94, 94, 24, 0, 252, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=\n",
843 "-3 ([94, 94, 24, 0, 253, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^\n",
844 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^\n",
845 "-2 ([94, 94, 24, 0, 254, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=\n",
846 "-1 ([94, 94, 24, 0, 255, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^\n",
847 "0 ([94, 94, 24, 0, 0, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^\n",
848 "1 ([94, 94, 24, 0, 1, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^\n",
849 "1 ([94, 94, 24, 0, 1, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=\n",
850 "2 ([94, 94, 24, 0, 2, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^\n",
851 "3 ([94, 94, 24, 0, 3, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^\n",
852 "4 ([94, 94, 24, 0, 4, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^\n",
853 "3 ([94, 94, 24, 0, 3, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v\n",
854 "3 ([94, 94, 24, 0, 3, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=\n",
855 "4 ([94, 94, 24, 0, 4, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^\n",
856 "5 ([94, 94, 24, 0, 5, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^\n",
857 "6 ([94, 94, 24, 0, 6, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^\n",
858 "6 ([94, 94, 24, 0, 6, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=\n",
859 "7 ([94, 94, 24, 0, 7, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^\n",
860 "8 ([94, 94, 24, 0, 8, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^\n",
861 "7 ([94, 94, 24, 0, 7, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v\n",
862 "8 ([94, 94, 24, 0, 8, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v^\n",
863 "9 ([94, 94, 24, 0, 9, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v^^\n",
864 "8 ([94, 94, 24, 0, 8, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v^^v\n",
865 "9 ([94, 94, 24, 0, 9, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v^^v^\n",
866 "8 ([94, 94, 24, 0, 8, 0], 255, 5) vvv^^v^v=vv^v^^vvvv^^v=^=^^=^^^=^^^v=^^^=^^v^^v^v\n"
867 ]
868 }
869 ],
870 "source": [
871 "for i in range(50):\n",
872 " print(final(inp[:i]), evaluate(program, inp[:i]), inp[:i])"
873 ]
874 },
875 {
876 "cell_type": "code",
877 "execution_count": 194,
878 "metadata": {
879 "scrolled": true
880 },
881 "outputs": [
882 {
883 "data": {
884 "text/plain": [
885 "(209, ([94, 94, 24, 0, 209, 0], 255, 5))"
886 ]
887 },
888 "execution_count": 194,
889 "metadata": {},
890 "output_type": "execute_result"
891 }
892 ],
893 "source": [
894 "final(inp), evaluate(program, inp)"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 13,
900 "metadata": {
901 "collapsed": true
902 },
903 "outputs": [],
904 "source": [
905 "! bf -n part2.clean.bf < 02-lifts.txt > part2.bf.out"
906 ]
907 },
908 {
909 "cell_type": "code",
910 "execution_count": 17,
911 "metadata": {},
912 "outputs": [
913 {
914 "data": {
915 "text/plain": [
916 "[215]"
917 ]
918 },
919 "execution_count": 17,
920 "metadata": {},
921 "output_type": "execute_result"
922 }
923 ],
924 "source": [
925 "[int(b) for b in open('part2.bf.out', 'rb').read()]"
926 ]
927 },
928 {
929 "cell_type": "code",
930 "execution_count": null,
931 "metadata": {
932 "collapsed": true
933 },
934 "outputs": [],
935 "source": []
936 }
937 ],
938 "metadata": {
939 "kernelspec": {
940 "display_name": "Python 3",
941 "language": "python",
942 "name": "python3"
943 },
944 "language_info": {
945 "codemirror_mode": {
946 "name": "ipython",
947 "version": 3
948 },
949 "file_extension": ".py",
950 "mimetype": "text/x-python",
951 "name": "python",
952 "nbconvert_exporter": "python",
953 "pygments_lexer": "ipython3",
954 "version": "3.5.2+"
955 }
956 },
957 "nbformat": 4,
958 "nbformat_minor": 2
959 }