table = '[<>,.-+]'
def numerate(s):
c=d=C=D=0
for e in s:d=d*8+'[<>,.-+]'.find(e);c+=(d and'['==e)-(c and'['<e);C,D=(-c,C+1,d,D)['['<e::2]
return -~D*8**C
def denumerate(number):
number -= 1
oct_encoded = oct(number)[2:]
if oct_encoded == "0":
return ""
program = ""
for digit in oct_encoded:
program += table[int(digit)]
temp = program.rstrip(']')
outside_loops = len(program) - len(temp)
program = temp
unmatched_left = 0
unmatched_right = 0
depth = 0
for op in program:
if op == '[':
depth += 1
if op == ']':
if not depth:
unmatched_right += 1
else:
depth -= 1
unmatched_left = depth
return '[' * (unmatched_right + outside_loops) + program + ']' * (unmatched_left + outside_loops)
for x in range(1,1000):
temp = denumerate(x)
try:
assert x == numerate(temp)
except AssertionError:
print(x, ":", temp)
dGFibGUgPSAnWzw+LC4tK10nCmRlZiBudW1lcmF0ZShzKToKICAgIGM9ZD1DPUQ9MCAKICAgIGZvciBlIGluIHM6ZD1kKjgrJ1s8PiwuLStdJy5maW5kKGUpO2MrPShkIGFuZCdbJz09ZSktKGMgYW5kJ1snPGUpO0MsRD0oLWMsQysxLGQsRClbJ1snPGU6OjJdIAogICAgcmV0dXJuIC1+RCo4KipDCiAKZGVmIGRlbnVtZXJhdGUobnVtYmVyKToKICAgIG51bWJlciAtPSAxCiAgICBvY3RfZW5jb2RlZCA9IG9jdChudW1iZXIpWzI6XQogICAgaWYgb2N0X2VuY29kZWQgPT0gIjAiOgogICAgICAgIHJldHVybiAiIgogICAgcHJvZ3JhbSA9ICIiCiAgICBmb3IgZGlnaXQgaW4gb2N0X2VuY29kZWQ6CiAgICAgICAgcHJvZ3JhbSArPSB0YWJsZVtpbnQoZGlnaXQpXQogICAgdGVtcCA9IHByb2dyYW0ucnN0cmlwKCddJykKICAgIG91dHNpZGVfbG9vcHMgPSBsZW4ocHJvZ3JhbSkgLSBsZW4odGVtcCkKICAgIHByb2dyYW0gPSB0ZW1wCiAgICB1bm1hdGNoZWRfbGVmdCA9IDAKICAgIHVubWF0Y2hlZF9yaWdodCA9IDAKICAgIGRlcHRoID0gMAogICAgZm9yIG9wIGluIHByb2dyYW06CiAgICAgICAgaWYgb3AgPT0gJ1snOgogICAgICAgICAgICBkZXB0aCArPSAxCiAgICAgICAgaWYgb3AgPT0gJ10nOgogICAgICAgICAgICBpZiBub3QgZGVwdGg6CiAgICAgICAgICAgICAgICB1bm1hdGNoZWRfcmlnaHQgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVwdGggLT0gMQogICAgdW5tYXRjaGVkX2xlZnQgPSBkZXB0aAogICAgcmV0dXJuICdbJyAqICh1bm1hdGNoZWRfcmlnaHQgKyBvdXRzaWRlX2xvb3BzKSArIHByb2dyYW0gKyAnXScgKiAodW5tYXRjaGVkX2xlZnQgKyBvdXRzaWRlX2xvb3BzKQogCmZvciB4IGluIHJhbmdlKDEsMTAwMCk6CiAgICB0ZW1wID0gZGVudW1lcmF0ZSh4KQogICAgdHJ5OgogICAgICAgIGFzc2VydCB4ID09IG51bWVyYXRlKHRlbXApCiAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CiAgICAgICAgcHJpbnQoeCwgIjoiLCB0ZW1wKQ==