Brainfuck

Brainfuck是一種極小化的計算機語言,它是由Urban Müller在1993年創建的,由于fuck在英語中是臟話,這種語言有時被稱為brainf*ck或brainf**k,甚至被簡稱為BF,
這種語言,是一種按照“Turing complete(圖靈完備)”思想設計的語言,它的主要設計思路是:用最小的概念實作一種“簡單”的語言,BrainF**k 語言只有八種符號,所有的操作都由這八種符號的組合來完成,
下面是這八種狀態的描述,其中每個狀態由一個字符標識:
| 字符 | 含義 |
|---|---|
| > | 指標加一 |
| < | 指標減一 |
| + | 指標指向的位元組的值加一 |
| - | 指標指向的位元組的值減一 |
| . | 輸出指標指向的單元內容(ASCII碼) |
| , | 輸入內容到指標指向的單元(ASCII碼) |
| [ | 如果指標指向的單元值為零,向后跳轉到對應的]指令的次一指令處 |
| ] | 如果指標指向的單元值不為零,向前跳轉到對應的[指令的次一指令處 |
比如對于一串brainfuck陳述句,怎樣翻譯成能看懂的ASCII碼
a = '++++++++++[>+++++++++>++++++++>+++++++<<<-]>>>++.---.<----..+++.'
代碼
def brainfuck(a):
li = [0]
index = 0
kuo = []
output = []
i = 0
while i < len(a):
if a[i] == '+' or a[i] == '-':
li[index] = eval(str(li[index]) + a[i] + '1')
elif a[i] == '>':
index += 1
if len(li) <= index:
li.append(0)
elif a[i] == '<':
index -= 1
elif a[i] == '.':
print(li[index], end=' ')
output.append(li[index])
elif a[i] == ',':
i += 1
li[index] = ord(a[i])
elif a[i] == '[':
if li[index] == 0:
while a[i] != ']':
i += 1
i += 1
else:
kuo.append(i)
elif a[i] == ']':
if li[index] != 0:
i = kuo.pop()-1
else:
temp = kuo.pop()
i += 1
return output
理解
li 模擬記憶體,最開始只有一個0值
index 表示指標
kuo 模擬一個堆疊,記錄前中括號(回圈)的下標
output 回傳值,存放‘.’輸出的記憶體值(ASCII碼)
i 指輸入值的索引
相當于 index 為記憶體 li 的指標,i 為函式輸入的brainfuck陳述句指標
控制指標 i 依次讀入字符,進行以下判斷:
- 如果是加 + 減 - 號,則組成 ‘該符號 +/- 1’的運算式,并執行
- 如果是 > ,則 index 指標右移,若記憶體 li 不夠長則添加一個0值
- 如果是 < , 則 index 指標左移
- 如果是 . , 則輸出記憶體中指標指向的值(ASCII碼),并存入output
- 如果是 , , 則 i 指標右移讀取下一個輸入字符,并將其ACSCII碼存入記憶體li
- 如果是 [ , 則判斷當前指標指向的記憶體 li 值是否為0,是則將指標 i 指向反括號之后,不是則將當前指標 i 存入堆疊kuo內
- 如果是 ] , 則再次判斷當前指標指向的記憶體 li 值是否為0,不是則繼續回圈,將堆疊kuo內的堆疊頂元素賦值給指標 i,是則拋棄堆疊頂元素,繼續遍歷
輸出測驗
呼叫函式,并將回傳值轉為字符輸出
output = brainfuck(a)
for i in output:
print(chr(i), end='')
a = '++++++++++[>+++++++++>++++++++>+++++++<<<-]>>>++.---.<----..+++.'
>> 72 69 76 76 79 HELLO
攻防世界misc題目:can_has_stdio?
ctf = '''
+
++
+++
++[>
+>++>
+++>++
++>++++
+>++++++
>+++++++>
++++++++>+
++++++++>++
++++++++>+++
++++++++>++++
++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++
++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>--.++<<
<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<
>>>>>>>>>>>>+.-<<<<<<<<<<<<>>>>>>>>>>>>>-.+<
<<<<<<<<<<<<>>>>>>>>>>>>>>>+++.---<<<<<<
<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<
<<<<<<>>>>>>>>>>>>>>+++.---<<<<<
<<<<<<<<<>>>>>>>>>>>>>>-.+<<
<<<<<<<<<<<<>>>>>>>>>>>>
>>----.++++<<<<<<<<<<<<<
<>>>>>>>>>>>>+.-<<<<<<<<
<<<<>>>>>>>>>>>>>>--.++<<<
<<<<<<<<<<<>>>>>>>>>>>>>-.
+<<<<<<<<<<<<<>>>>>>>>>>>>>>
+++.---<<<<<< <<<<<<<<>>>>
>>>>>>>>-.+< <<<<<<<<<<<
>>>>>>>>>> >>>--.++<
<<<<<<<<< <<<>>>>>
>>>>>> >>>-.+
<<<<< <<<<<
<<< <>>
>> >>
>>>>>>>>++.--<<<<<<<<<<<<<<>>>>>>>>>>>>-.+<<<<<<<<<<<<>>>>>>>>>>>>>--.++<<<<<<<<<<<<<>>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>--.++<<<<<<<<<<<<<<>>>>>>>>>>>>-.+<<<<<<<<<<<<>>>>>>>>>>>>+.-<<<<<<<<<<<<>>>>>>>>>>>>>>--.++<<<<<<<<<<<<<<>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<>>>>>>>>>>>>-.+<<<<<<<<<<<<>>>>>>>>>>>>>>.<<<<<<<<<<<<<<>>>>>>>>>>>>>>++.--<<<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>--.++<<<<<<<<<<<<<>>>>>>>>>>>>>+.-<<<<<<<<<<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<<.
'''
>> 102 108 97 103 123 101 115 111 108 97 110 103 115 95 102 111 114 95 102 117 110 95 97 110 100 95 112 114 111 102 105 116 125 0
flag{esolangs_for_fun_and_profit}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255900.html
標籤:其他
