/
bf.py
74 lines (71 loc) · 1.96 KB
/
bf.py
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
#!/usr/bin/env python
# http://acm.zhihua-lai.com
# Brainfuck Interpreter
from __future__ import print_function
def bf(src, left, right, data, idx):
"""
brainfuck interpreter
src: source string
left: start index
right: ending index
data: input data string
idx: start-index of input data string
"""
if len(src) == 0: return
if left < 0: left = 0
if left >= len(src): left = len(src) - 1
if right < 0: right = 0
if right >= len(src): right = len(src) - 1
# tuning machine has infinite array size
# increase or decrease here accordingly
arr = [0] * 30000
ptr = 0
i = left
while i <= right:
s = src[i]
if s == '>':
ptr += 1
# wrap if out of range
if ptr >= len(arr):
ptr = 0
elif s == '<':
ptr -= 1
# wrap if out of range
if ptr < 0:
ptr = len(arr) - 1
elif s == '+':
arr[ptr] += 1
elif s == '-':
arr[ptr] -= 1
elif s == '.':
print(chr(arr[ptr]), end="")
elif s == ',':
if idx >= 0 and idx < len(data):
arr[ptr] = ord(data[idx])
idx += 1
else:
arr[ptr] = 0 # out of input
elif s =='[':
if arr[ptr] == 0:
loop = 1
while loop > 0:
i += 1
c = src[i]
if c == '[':
loop += 1
elif c == ']':
loop -= 1
elif s == ']':
loop = 1
while loop > 0:
i -= 1
c = src[i]
if c == '[':
loop -= 1
elif c == ']':
loop += 1
i -= 1
i += 1
if __name__ == "__main__":
src = raw_input()
bf(src, 0, len(src) - 1, "sdfsdf", 0)