Pythonから呼び出せるBrainfuckインタプリタをC++で作った
はじめに
Brainfuckerのみなさん,PythonでBrainfuckコードをエンコードしたいですよね?
私もそう思います.
というわけで作りました.
インストール
ローカルで使いたい場合はCmakeLists.txtから,pip管理してどこからでもBrainfuckしたい方はsetup.pyからインストールしてください.
ローカル
CMakeLists.txtのPythonを参照するパスを適宜書き換えたら,ビルドします.
1 2 3 4 | $ mkdir build $ cd build $ cmake .. $ make |
pip
1 2 3 4 | $ cd [pybrainfuckの親ディレクトリ] $ pip install ./pybrainfuck $ pip list | grep pybrainfuck pybrainfuck 0.1.0 |
使い方
超簡単です.
二通りの使い方があります.
Brainfuckファイルを指定する方法
1 2 3 4 5 6 7 8 9 10 | from pybrainfuck import Brainfuck if __name__ == '__main__': bf = Brainfuck("sample.bf") res = bf.analyze() steps = bf.get_steps() print(f"{res}") print(f"{steps} steps.") |
直接コードを指定する方法
1 2 3 4 5 6 7 8 9 10 11 | from pybrainfuck import Brainfuck if __name__ == '__main__': bf = Brainfuck() bf.set_code("+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.") res = bf.analyze() steps = bf.get_steps() print(f"{res}") print(f"{steps} steps.") |
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from pybrainfuck import Brainfuck from time import time if __name__ == '__main__': bf = Brainfuck() bf.set_code(""" ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+ >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<] <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-] """) start = time() res = bf.analyze() end = time() steps = bf.get_steps() print(f"{res}") print(f"{steps} steps.") print(f"{end - start} sec. ({(end - start) * 1000} ms)") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1600 1681 1764 1849 1936 2025 2116 2209 2304 2401 2500 2601 2704 2809 2916 3025 3136 3249 3364 3481 3600 3721 3844 3969 4096 4225 4356 4489 4624 4761 4900 5041 5184 5329 5476 5625 5776 5929 6084 6241 6400 6561 6724 6889 7056 7225 7396 7569 7744 7921 8100 8281 8464 8649 8836 9025 9216 9409 9604 9801 10000 1573287 steps. 0.00456690788269043 sec. (4.56690788269043 ms) |
インタプリタ自体はC++で実装してあるので,(多分) 超高速です.
お試しあれ.
実装・実行環境
C++Wrapper
pybinds11: 2.5.0
C++ Compiler
gcc/g++: Apple clang version 11.0.3
Machine
OS: macOS Catalina 10.15.6
CPU: 3.2 GHz 6コアIntel Core i7
RAM: 32GB