"""
Pi In Bf interpreter
@author stranjo and thotypous
"""
import sys, random
def bf(string):
dpointer = pointer = 0
plist = [0]*3000
stack = []
string = list(string)
while pointer < len(string):
if pointer == 0:
stack.append(-1)
if string[pointer] == '+':
plist[dpointer] +=1
plist[dpointer] &= 0xFF
elif string[pointer] == '-':
plist[dpointer] -= 1
plist[dpointer] &= 0xFF
elif string[pointer] == '>':
dpointer += 1
elif string[pointer] == '<':
dpointer-=1
if dpointer < 0: dpointer = 0
elif string[pointer] == ']':
pointer = stack.pop()
elif string[pointer] == '[':
if plist[dpointer]:
stack.append(pointer-1)
else:
while string[pointer] != ']': pointer+=1
elif string[pointer] == '.':
sys.stdout.write(chr(plist[dpointer]))
sys.stdout.flush()
elif string[pointer] == ',':
plist[dpointer] = ord(sys.stdin.readline()[0])
sys.stdin.flush()
pointer+=1
def pi2bf(string):
out = ""
t = { 0:'>', 1:'<', 2:'+', 3:'-', 4:'.', 5:',', 6:'[', 7:']' }
k, a, b, a1, b1, r = 2, 4, 1, 12, 4, True
while r:
p, q, k = k*k, 2*k+1, k+1
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
d = int(a / b)
d1 = int(a1 / b1)
while d == d1:
if len(string):
c = string[0]
string = string[1:]
else: c = ""
if len(c) == 0:
r = False
break
try: c = int(c)
except: continue
if c != d: out += t[c - (c > d)]
a, a1 = 10*(a%b), 10*(a1%b1)
d, d1 = int(a/b), int(a1/b1)
return out
def bf2pi(string):
random.seed()
out = ""
t = { '>':0, '<':1, '+':2, '-':3, '.':4, ',':5, '[':6, ']':7 }
k, a, b, a1, b1, cl, r = 2, 4, 1, 12, 4, random.randint(20,30), True
while r:
p, q, k = k*k, 2*k+1, k+1
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
d = int(a / b)
d1 = int(a1 / b1)
while d == d1:
if cl:
out+= str(d)
cl -= 1
else:
if len(string):
c = string[0]
string = string[1:]
else: c = ""
if len(c) == 0:
r = False
break
try: c = t[c]
except: continue
out += str(c + (c >= d))
cl = random.randint(2,7)
a, a1 = 10*(a%b), 10*(a1%b1)
d, d1 = int(a/b), int(a1/b1)
return "%s.%s"%(out[0],out[1:])
if __name__ == '__main__':
if len(sys.argv) == 1:
#reading from stdin
bf(pi2bf(sys.stdin.read()))
elif sys.argv[1] == '-':
bf(pi2bf(" ".join(sys.argv[2:])))
elif sys.argv[1] == '-bf':
bf(" ".join(sys.argv[2:]))
elif sys.argv[1] == '--bf':
f = open(sys.argv[2])
bf(f.read())
elif sys.argv[1] == '--convert':
f = open(sys.argv[2])
print(bf2pi(f.read()))
elif sys.argv[1] == '-c':
print(bf2pi(" ".join(sys.argv[2:])))
elif sys.argv[1] == '--tobf':
f = open(sys.argv[2])
print(pi2bf(f.read()))
elif sys.argv[1] == '-2bf':
print(pi2bf(" ".join(sys.argv[2:])))
elif sys.argv[1] == '-h' or sys.argv[1] == '--help':
print("""pi language commands:
* -bf: parses a bf command
* --bf: parses a bf file
* - : parses a pi number from command line
* -h --help: displays dis help
* --convert: convert a bf file into pi
* -c: convert a bf command into pi
* --tobf convert a pi file into bf
* -2bf convert a pi command into bf""")
else:
f = open(sys.argv[1])
bf(pi2bf(f.read()))
IiIiClBpIEluIEJmIGludGVycHJldGVyCkBhdXRob3Igc3RyYW5qbyBhbmQgdGhvdHlwb3VzCiIiIgppbXBvcnQgc3lzLCByYW5kb20KCmRlZiBiZihzdHJpbmcpOgoKCiAgICBkcG9pbnRlciA9IHBvaW50ZXIgPSAwCiAgICBwbGlzdCA9IFswXSozMDAwCiAgICBzdGFjayA9IFtdCiAgICBzdHJpbmcgPSBsaXN0KHN0cmluZykKICAgIAogICAgd2hpbGUgcG9pbnRlciA8IGxlbihzdHJpbmcpOgogICAgICAgIGlmIHBvaW50ZXIgPT0gMDoKICAgICAgICAgICAgc3RhY2suYXBwZW5kKC0xKQogICAgICAgICAgICAKICAgICAgICBpZiBzdHJpbmdbcG9pbnRlcl0gPT0gJysnOgogICAgICAgICAgICBwbGlzdFtkcG9pbnRlcl0gKz0xCiAgICAgICAgICAgIHBsaXN0W2Rwb2ludGVyXSAmPSAweEZGCgogICAgICAgIGVsaWYgc3RyaW5nW3BvaW50ZXJdID09ICctJzoKICAgICAgICAgICAgcGxpc3RbZHBvaW50ZXJdIC09IDEKICAgICAgICAgICAgcGxpc3RbZHBvaW50ZXJdICY9IDB4RkYKICAgICAgICAgICAgCiAgICAgICAgZWxpZiBzdHJpbmdbcG9pbnRlcl0gPT0gJz4nOgogICAgICAgICAgICBkcG9pbnRlciArPSAxCiAgICAgICAgICAgIAogICAgICAgIGVsaWYgc3RyaW5nW3BvaW50ZXJdID09ICc8JzoKICAgICAgICAgICAgZHBvaW50ZXItPTEKICAgICAgICAgICAgaWYgZHBvaW50ZXIgPCAwOiBkcG9pbnRlciA9IDAKICAgICAgICAgICAgCiAgICAgICAgZWxpZiBzdHJpbmdbcG9pbnRlcl0gPT0gJ10nOgogICAgICAgICAgICBwb2ludGVyID0gc3RhY2sucG9wKCkKICAgICAgICAgICAgCiAgICAgICAgZWxpZiBzdHJpbmdbcG9pbnRlcl0gPT0gJ1snOgogICAgICAgICAgICBpZiBwbGlzdFtkcG9pbnRlcl06CiAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQocG9pbnRlci0xKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgd2hpbGUgc3RyaW5nW3BvaW50ZXJdICE9ICddJzogcG9pbnRlcis9MQogICAgICAgICAgICAKICAgICAgICBlbGlmIHN0cmluZ1twb2ludGVyXSA9PSAnLic6CiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoY2hyKHBsaXN0W2Rwb2ludGVyXSkpCiAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgICAgIGVsaWYgc3RyaW5nW3BvaW50ZXJdID09ICcsJzoKICAgICAgICAgICAgcGxpc3RbZHBvaW50ZXJdID0gb3JkKHN5cy5zdGRpbi5yZWFkbGluZSgpWzBdKQogICAgICAgICAgICBzeXMuc3RkaW4uZmx1c2goKQogICAgICAgIHBvaW50ZXIrPTEKCmRlZiBwaTJiZihzdHJpbmcpOgogICAgb3V0ID0gIiIKICAgIHQgPSB7IDA6Jz4nLCAxOic8JywgMjonKycsIDM6Jy0nLCA0OicuJywgNTonLCcsIDY6J1snLCA3OiddJyB9CiAgICBrLCBhLCBiLCBhMSwgYjEsIHIgPSAyLCA0LCAxLCAxMiwgNCwgVHJ1ZQogICAgd2hpbGUgcjoKICAgICAgICBwLCBxLCBrID0gayprLCAyKmsrMSwgaysxCiAgICAgICAgYSwgYiwgYTEsIGIxID0gYTEsIGIxLCBwKmErcSphMSwgcCpiK3EqYjEKICAgICAgICBkID0gaW50KGEgLyBiKQogICAgICAgIGQxID0gaW50KGExIC8gYjEpCiAgICAgICAgd2hpbGUgZCA9PSBkMToKICAgICAgICAgICAgaWYgbGVuKHN0cmluZyk6CiAgICAgICAgICAgICAgICBjID0gc3RyaW5nWzBdCiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmdbMTpdCiAgICAgICAgICAgIGVsc2U6IGMgPSAiIgogICAgICAgICAgICBpZiBsZW4oYykgPT0gMDoKICAgICAgICAgICAgICAgIHIgPSBGYWxzZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OiBjID0gaW50KGMpCiAgICAgICAgICAgIGV4Y2VwdDogY29udGludWUKICAgICAgICAgICAgaWYgYyAhPSBkOiBvdXQgKz0gdFtjIC0gKGMgPiBkKV0KICAgICAgICAgICAgYSwgYTEgPSAxMCooYSViKSwgMTAqKGExJWIxKQogICAgICAgICAgICBkLCBkMSA9IGludChhL2IpLCBpbnQoYTEvYjEpCiAgICByZXR1cm4gb3V0CgpkZWYgYmYycGkoc3RyaW5nKToKICAgIHJhbmRvbS5zZWVkKCkKICAgIG91dCA9ICIiCiAgICB0ID0geyAnPic6MCwgJzwnOjEsICcrJzoyLCAnLSc6MywgJy4nOjQsICcsJzo1LCAnWyc6NiwgJ10nOjcgfQogICAgaywgYSwgYiwgYTEsIGIxLCBjbCwgciA9IDIsIDQsIDEsIDEyLCA0LCByYW5kb20ucmFuZGludCgyMCwzMCksIFRydWUKICAgIHdoaWxlIHI6CiAgICAgICAgcCwgcSwgayA9IGsqaywgMiprKzEsIGsrMQogICAgICAgIGEsIGIsIGExLCBiMSA9IGExLCBiMSwgcCphK3EqYTEsIHAqYitxKmIxCiAgICAgICAgZCA9IGludChhIC8gYikKICAgICAgICBkMSA9IGludChhMSAvIGIxKQogICAgICAgIHdoaWxlIGQgPT0gZDE6CiAgICAgICAgICAgIGlmIGNsOgogICAgICAgICAgICAgICAgb3V0Kz0gc3RyKGQpCiAgICAgICAgICAgICAgICBjbCAtPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBsZW4oc3RyaW5nKToKICAgICAgICAgICAgICAgICAgICBjID0gc3RyaW5nWzBdCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nWzE6XQogICAgICAgICAgICAgICAgZWxzZTogYyA9ICIiCiAgICAgICAgICAgICAgICBpZiBsZW4oYykgPT0gMDoKICAgICAgICAgICAgICAgICAgICByID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdHJ5OiBjID0gdFtjXQogICAgICAgICAgICAgICAgZXhjZXB0OiBjb250aW51ZQogICAgICAgICAgICAgICAgb3V0ICs9IHN0cihjICsgKGMgPj0gZCkpCiAgICAgICAgICAgICAgICBjbCA9IHJhbmRvbS5yYW5kaW50KDIsNykKICAgICAgICAgICAgYSwgYTEgPSAxMCooYSViKSwgMTAqKGExJWIxKQogICAgICAgICAgICBkLCBkMSA9IGludChhL2IpLCBpbnQoYTEvYjEpCiAgICByZXR1cm4gIiVzLiVzIiUob3V0WzBdLG91dFsxOl0pCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgogICAgICAgICNyZWFkaW5nIGZyb20gc3RkaW4KICAgICAgICBiZihwaTJiZihzeXMuc3RkaW4ucmVhZCgpKSkKCiAgICBlbGlmIHN5cy5hcmd2WzFdID09ICctJzoKICAgICAgICBiZihwaTJiZigiICIuam9pbihzeXMuYXJndlsyOl0pKSkKICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJy1iZic6CiAgICAgICAgYmYoIiAiLmpvaW4oc3lzLmFyZ3ZbMjpdKSkKICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJy0tYmYnOgogICAgICAgIGYgPSBvcGVuKHN5cy5hcmd2WzJdKQogICAgICAgIGJmKGYucmVhZCgpKQogICAgZWxpZiBzeXMuYXJndlsxXSA9PSAnLS1jb252ZXJ0JzoKICAgICAgICBmID0gb3BlbihzeXMuYXJndlsyXSkKICAgICAgICBwcmludChiZjJwaShmLnJlYWQoKSkpCiAgICBlbGlmIHN5cy5hcmd2WzFdID09ICctYyc6CiAgICAgICAgcHJpbnQoYmYycGkoIiAiLmpvaW4oc3lzLmFyZ3ZbMjpdKSkpCiAgICBlbGlmIHN5cy5hcmd2WzFdID09ICctLXRvYmYnOgogICAgICAgIGYgPSBvcGVuKHN5cy5hcmd2WzJdKQogICAgICAgIHByaW50KHBpMmJmKGYucmVhZCgpKSkKICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJy0yYmYnOgogICAgICAgIHByaW50KHBpMmJmKCIgIi5qb2luKHN5cy5hcmd2WzI6XSkpKQogICAgZWxpZiBzeXMuYXJndlsxXSA9PSAnLWgnIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOgogICAgICAgIHByaW50KCIiInBpIGxhbmd1YWdlIGNvbW1hbmRzOgogICAgICAgICAgICAgICAgKiAtYmY6IHBhcnNlcyBhIGJmIGNvbW1hbmQKICAgICAgICAgICAgICAgICogLS1iZjogcGFyc2VzIGEgYmYgZmlsZQogICAgICAgICAgICAgICAgKiAtIDogcGFyc2VzIGEgcGkgbnVtYmVyIGZyb20gY29tbWFuZCBsaW5lCiAgICAgICAgICAgICAgICAqIC1oIC0taGVscDogZGlzcGxheXMgZGlzIGhlbHAKICAgICAgICAgICAgICAgICogLS1jb252ZXJ0OiBjb252ZXJ0IGEgYmYgZmlsZSBpbnRvIHBpCiAgICAgICAgICAgICAgICAqIC1jOiBjb252ZXJ0IGEgYmYgY29tbWFuZCBpbnRvIHBpCiAgICAgICAgICAgICAgICAqIC0tdG9iZiBjb252ZXJ0IGEgcGkgZmlsZSBpbnRvIGJmCiAgICAgICAgICAgICAgICAqIC0yYmYgY29udmVydCBhIHBpIGNvbW1hbmQgaW50byBiZiIiIikKICAgIGVsc2U6CiAgICAgICAgZiA9IG9wZW4oc3lzLmFyZ3ZbMV0pCiAgICAgICAgYmYocGkyYmYoZi5yZWFkKCkpKQ==