View difference between Paste ID: Hp85cg1R and 6Wa6hLuy
SHOW: | | - or go back to the newest paste.
1
class State:
2
	def __init__(self,arr=[0],arr_i=0,code_i=0):
3
		self.arr = arr
4
		self.arr_i = arr_i
5
		self.code_i = code_i
6
	def copy(self):
7
		return State(self.arr[:],self.arr_i,self.code_i)
8-
	def __str__(self):
8+
9-
		a = '['+''.join(map(str,self.arr))+']'
9+
10-
		p = ' '*(self.arr_i) + ' ^' + ' '*(len(self.arr) - self.arr_i + self.code_i) + ' ^'
10+
11-
		return a + ' ' + code + '\n' + p
11+
12-
	def __repr__(self):
12+
13-
		return 'State('+`self.arr`+','+`self.arr_i`+','+`self.code_i`
13+
14
	else:
15
		state.code_i = brackets[state.code_i]+1
16
		
17
def while_close(state):
18
	state.code_i = brackets[state.code_i]
19
	
20
def flip(state):
21
	state.arr[state.arr_i] = 1 - state.arr[state.arr_i]
22
	state.code_i += 1
23
	
24
def right(state):
25
	state.arr_i += 1
26
	if state.arr_i >= len(state.arr):
27
		state.arr.append(0)
28
	state.code_i += 1
29
	
30
def left(state):
31
	if state.arr_i:
32
		state.arr_i -= 1
33
	else:
34
		state.arr.insert(0,0)
35
	state.code_i += 1
36
	
37
def nd_choose(state):
38
	state.code_i += 1
39
	c = state.copy()
40
	state.arr[state.arr_i] = 0
41
	c.arr[c.arr_i] = 1
42
	return c
43
	
44
instructions = { 
45
	'[':while_open,
46
	']':while_close,
47
	'*':flip,
48
	'>':right,
49
	'<':left,
50
	'?':nd_choose }
51
52
states = [State()]
53
code = raw_input()
54
55
#Find matching brackets
56
brackets = [0]*len(code)
57
stack = []
58
for i in range(len(code)):
59
	if code[i]=='[':
60
		stack.append(i)
61
	elif code[i]==']':
62
		b = stack.pop()
63
		brackets[i]=b
64
		brackets[b]=i
65
		
66
while states:
67
	new_states = []
68
	for s in states:
69
		c = code[s.code_i]
70
		n = instructions[c](s)
71
		if n:
72
			new_states.append(n)
73
	states.extend(new_states)
74
	terminated = filter(lambda s:s.code_i == len(code),states)
75
	if any(map(lambda s:s.arr[s.arr_i],terminated)):
76
		print 1
77
		break
78
	states = filter(lambda s:s.code_i < len(code),states)
79
	if len(states) == 0:
80
		print 0
81
		break