Poetic/Interpreter
Jump to navigation
Jump to search
This is a:
- Poetic interpreter
- PoeticFuck interpreter
- Poetic to PoeticFuck translator
by User:None1 in Python.
import sys from random import randint def p2pf(code): # Translates Poetic to PoeticFuck res='' while code: p=0 q=0 while p<len(code) and code[p] in "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'": q+=code[p].isalpha() p+=1 if q: if q==10: res+='0' else: res+=str(q) while p<len(code) and code[p] not in "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'": p+=1 code=code[p:] r='' while res: if res[0] in '3456': try: r+=';[]+-><.,?'[int(res[0])]*(int(res[1]) if int(res[1]) else 10) res=res[2:] except: break else: r+=';[]+-><.,?'[int(res[0])] res=res[1:] return r def pf(code): # Interprets PoeticFuck s=[] matches={} tape=[0]*1000000 for i,j in enumerate(code): if j=='[': s.append(i) if j==']': m=s.pop() matches[m]=i matches[i]=m cp=0 p=0 while cp<len(code): if code[cp]=='+': tape[p]=(tape[p]+1)%256 if code[cp]=='-': tape[p]=(tape[p]-1)%256 if code[cp]==',': c=sys.stdin.read(1) tape[p]=(ord(c) if c else tape[p])%256 if code[cp]=='.': print(chr(tape[p]),end='') if code[cp]=='<': p-=1 if code[cp]=='>': p+=1 if code[cp]=='[': if not tape[p]: cp=matches[cp] if code[cp]==']': if tape[p]: cp=matches[cp] if code[cp]=='?': tape[p]=randint(0,255) if code[cp]==';': return cp+=1 if __name__=='__main__': # Direct execution: Interprets Poetic pf(p2pf(sys.stdin.read()))