Linguagem Pi

NotíciasPython
Enviado por thotypous em Ter, 18/07/2006 - 22:08.Notícias | Python
Trata-se de uma linguagem esotérica idealizada pelo Daniel (Dr_Kachu) e criada por mim e pelo Marcelo (Stranjo). Apresentamos neste artigo a idéia da linguagem e um compilador e interpretador em Python. A Linguagem Pi é uma variante do BrainFuck. Suas 8 instruções são codificadas como dígitos numéricos. Durante a conversão do programa BrainFuck em Linguagem Pi, esses dígitos são distribuidos, então, em casas aleatórias do número pi, gerando erros nessas casas de pi. O interpretador calcula casas do número pi e compara com as casas do programa em Linguagem Pi. Toda vez que é achada uma casa que não bate com a correta, essa casa é decodificada como uma instrução BrainFuck. Temos abaixo o compilador de BrainFuck em Pi, o descompilador, e o interpretador, escritos em Python:
  1. #! /usr/bin/env python
  2. """
  3. Pi In Bf interpreter
  4. @author stranjo and thotypous
  5. """
  6. import sys, random
  7.  
  8. def bf(string):
  9.  
  10.  
  11.     dpointer = pointer = 0
  12.     plist = [0]*3000
  13.     stack = []
  14.     string = list(string)
  15.    
  16.     while pointer < len(string):
  17.         if pointer == 0:
  18.             stack.append(-1)
  19.         #sys.stderr.write("parsing: %s\n"%string[pointer])
  20.         if string[pointer] == '+':
  21.             plist[dpointer] +=1
  22.             plist[dpointer] &= 0xFF
  23.  
  24.         elif string[pointer] == '-':
  25.             plist[dpointer] -= 1
  26.             plist[dpointer] &= 0xFF
  27.            
  28.         elif string[pointer] == '>':
  29.             dpointer += 1
  30.            
  31.         elif string[pointer] == '<':
  32.             dpointer-=1
  33.             if dpointer < 0: dpointer = 0
  34.            
  35.         elif string[pointer] == ']':
  36.             pointer = stack.pop()
  37.            
  38.         elif string[pointer] == '[':
  39.             if plist[dpointer]:
  40.                 stack.append(pointer-1)
  41.             else:
  42.                 while string[pointer] != ']': pointer+=1
  43.            
  44.         elif string[pointer] == '.':
  45.             sys.stdout.write(chr(plist[dpointer]))
  46.             sys.stdout.flush()
  47.         elif string[pointer] == ',':
  48.             plist[dpointer] = ord(sys.stdin.readline()[0])
  49.             sys.stdin.flush()
  50.         pointer+=1
  51.  
  52. def pi2bf(string):
  53.     out = ""
  54.     t = { 0:'>', 1:'<', 2:'+', 3:'-', 4:'.', 5:',', 6:'[', 7:']' }
  55.     k, a, b, a1, b1, r = 2, 4, 1, 12, 4, True
  56.     while r:
  57.         p, q, k = k*k, 2*k+1, k+1
  58.         a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
  59.         d = a / b
  60.         d1 = a1 / b1
  61.         while d == d1:
  62.             if len(string):
  63.                 c = string[0]
  64.                 string = string[1:]
  65.             else: c = ''
  66.             if len(c) == 0:
  67.                 r = False
  68.                 break
  69.             try: c = int(c)
  70.             except: continue
  71.             if c != d: out += t[c - (c > d)]
  72.             a, a1 = 10*(a%b), 10*(a1%b1)
  73.             d, d1 = a/b, a1/b1 
  74.     return out
  75. def bf2pi(string):
  76.     random.seed()
  77.     out = ""
  78.     t = { '>':0, '<':1, '+':2, '-':3, '.':4, ',':5, '[':6, ']':7 }
  79.     k, a, b, a1, b1, cl, r = 2, 4, 1, 12, 4, random.randint(20,30), True
  80.     while r:
  81.         p, q, k = k*k, 2*k+1, k+1
  82.         a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
  83.         d = a / b
  84.         d1 = a1 / b1
  85.         while d == d1:
  86.             if cl:
  87.                 out+= str(d)
  88.                 cl -= 1
  89.             else:
  90.                 if len(string):
  91.                     c = string[0]
  92.                     string = string[1:]
  93.                 else: c = ''
  94.                 if len(c) == 0:
  95.                     r = False
  96.                     break
  97.                 try: c = t[c]
  98.                 except: continue
  99.                 out += str(c + (c >= d))
  100.                 cl = random.randint(2,7)
  101.             a, a1 = 10*(a%b), 10*(a1%b1)
  102.             d, d1 = a/b, a1/b1
  103.     return "%s.%s"%(out[0],out[1:])
  104.  
  105. if __name__ == '__main__':
  106.     if len(sys.argv) == 1:
  107.         #reading from stdin
  108.         bf(pi2bf(sys.stdin.read()))
  109.  
  110.     elif sys.argv[1] == '-':
  111.         bf(pi2bf(" ".join(sys.argv[2:])))
  112.     elif sys.argv[1] == '-bf':
  113.         bf(" ".join(sys.argv[2:]))
  114.     elif sys.argv[1] == '--bf':
  115.         f = open(sys.argv[2])
  116.         bf(f.read())
  117.     elif sys.argv[1] == '--convert':
  118.         f = open(sys.argv[2])
  119.         print bf2pi(f.read())
  120.     elif sys.argv[1] == '-c':
  121.         print bf2pi(" ".join(sys.argv[2:]))
  122.     elif sys.argv[1] == '--tobf':
  123.         f = open(sys.argv[2])
  124.         print pi2bf(f.read())
  125.     elif sys.argv[1] == '-2bf':
  126.         print pi2bf(" ".join(sys.argv[2:]))
  127.     elif sys.argv[1] == '-h' or sys.argv[1] == '--help':
  128.         print """pi language commands:
  129.                 * -bf: parses a bf command
  130.                 * --bf: parses a bf file
  131.                 * - : parses a pi number from command line
  132.                 * -h --help: displays this help
  133.                 * --convert: convert a bf file into pi
  134.                 * -c: convert a bf command into pi
  135.                 * --tobf convert a pi file into bf
  136.                 * -2bf convert a pi command into bf"""
  137.     else:
  138.     f = open(sys.argv[1])
  139.         bf(pi2bf(f.read()))
  140.  
Um exemplo de programa em Linguagem Pi. Tente adivinhar o que ele faz:
  1.  
  2. 3.14159265358979323846264338320950388419712939937530582397494429220781640228623
  3. 8998228074825312112067922142086513222306642093244602550282231720359408428488117
  4. 1502841057019305211052596446239489529303839624282109256656334461184256422337867
  5. 2316522120190904534856698346031861045232665821339260726034934127322452700620631
  6. 5288175881420220963829224091415764337892598360010330530248823466521324146953941
  7. 5112094230572733657295919570921862173812326317931021185420740623739627895613518
  8. 8574272409122793218301394912283362336344065264338602132494632522273712077217186
  9. 0942702773539317176393172750384374818487669425132500508137145263260827285771242
  10. 7572896091236371782214684209072249514331425495853210517924796872589135420149561
  11. 3212903196386403451815931332977437130996451370721133999999857293804395105974173
  12. 4816096418595424453455346308502647522308233344885035061931388173010002137838252
  13. 8865825333083812206171726691477035981532904227524682311595608638824537885937529
  14. 5728145778753217142688661300122787663119520923642039893802525723106528586327286
  15. 5936353581
  16.  


Enviado por Ariel P. (não verificado(a)) em Sex, 21/07/2006 - 17:43.

Nossa... que absurda esta linguagem... onde posso achar mais sobre?

Mais HardCore que isso só binário... ;)

Ariel

Enviado por Curioso (não verificado(a)) em Qui, 12/06/2008 - 12:15.

Tudo isso deve ser so para imprimir um "hello world".