-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmaintesting.bf.py
More file actions
146 lines (120 loc) · 4.16 KB
/
maintesting.bf.py
File metadata and controls
146 lines (120 loc) · 4.16 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
class backend:
ascii_table = [chr(i) for i in range(256)] # Including character for index 255
mem_array = [0] * 33000
mem_index = 0 # Starting at 0 for Python's zero-based indexing
arg = ""
arg_index = 0
arg_curr = arg[arg_index] if arg else None # Check if arg is not empty
first_arg_read = True
code = "" # Brainfuck code should be placed here
code_index = 0
output_result = "" # Renamed to avoid conflict with the output function
arg_err = False
need_arg = False
invalid_char_found = False
command = 0
@staticmethod
def add():
if backend.mem_array[backend.mem_index] == 255:
backend.mem_array[backend.mem_index] = 0
else:
backend.mem_array[backend.mem_index] += 1
@staticmethod
def sub():
if backend.mem_array[backend.mem_index] == 0:
backend.mem_array[backend.mem_index] = 255
else:
backend.mem_array[backend.mem_index] -= 1
@staticmethod
def right():
backend.mem_index += 1
if backend.mem_index >= 33000:
backend.mem_index = 0
@staticmethod
def left():
backend.mem_index -= 1
if backend.mem_index <= 0:
backend.mem_index = 33000
@staticmethod
def output_char():
backend.output_result += backend.ascii_table[backend.mem_array[backend.mem_index]]
@staticmethod
def read_arg():
if backend.first_arg_read:
backend.first_arg_read = False
else:
backend.arg_index += 1
if backend.arg_index < len(backend.arg):
backend.arg_curr = backend.arg[backend.arg_index]
else:
backend.arg_index = 1
backend.mem_array[backend.mem_index] = backend.ascii_table.find(backend.arg_curr)
func_map = {
'>': right,
'<': left,
'+': add,
'-': sub,
'.': output_char,
',': read_arg,
}
loop_stack = []
@staticmethod
def run():
backend.arg_curr = backend.arg[0] if backend.arg else None
while backend.code_index < len(backend.code):
command = backend.code[backend.code_index]
if command in backend.func_map:
backend.func_map[command]()
elif command == "[":
if backend.mem_array[backend.mem_index] == 0:
loop_start = backend.code_index
depth = 1
while depth > 0:
backend.code_index += 1
if backend.code[backend.code_index] == "[":
depth += 1
elif backend.code[backend.code_index] == "]":
depth -= 1
else:
backend.loop_stack.append(backend.code_index)
elif command == "]":
if backend.mem_array[backend.mem_index] != 0:
backend.code_index = backend.loop_stack[-1]
else:
backend.loop_stack.pop()
else:
pass
backend.code_index += 1
def run_code():
code_text = "++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++++++++++++++.------------.>+++++++++++++++.>.+++.------.--------.<<+."
arg_text = ""
need_arg = False
invalid_arg_char = False
err_code = None
finde = 0
backend.code = code_text
backend.arg = arg_text
finde = backend.code.find(",")
if finde != -1:
need_arg = True
else:
need_arg = False
if need_arg and not arg_text:
print("Argument Error 1: The program requires an argument but has not been given one")
err_code = 1
# Check if the argument contains invalid characters
if need_arg:
for char in backend.arg:
if char not in backend.ascii_table:
print("Argument Error 2: A character in the argument is not a valid character in Brainfuck")
err_code = 2
else:
pass
if err_code == 1:
print("ERR 1")
elif err_code == 2:
print("ERR 2")
else:
backend.run()
print(f"Output: {backend.output_result}")
run_code()