fork(77) download
  1. """
  2. Pi In Bf interpreter
  3. @author stranjo and thotypous
  4. """
  5. import sys, random
  6.  
  7. def bf(string):
  8.  
  9.  
  10. dpointer = pointer = 0
  11. plist = [0]*3000
  12. stack = []
  13. string = list(string)
  14.  
  15. while pointer < len(string):
  16. if pointer == 0:
  17. stack.append(-1)
  18.  
  19. if string[pointer] == '+':
  20. plist[dpointer] +=1
  21. plist[dpointer] &= 0xFF
  22.  
  23. elif string[pointer] == '-':
  24. plist[dpointer] -= 1
  25. plist[dpointer] &= 0xFF
  26.  
  27. elif string[pointer] == '>':
  28. dpointer += 1
  29.  
  30. elif string[pointer] == '<':
  31. dpointer-=1
  32. if dpointer < 0: dpointer = 0
  33.  
  34. elif string[pointer] == ']':
  35. pointer = stack.pop()
  36.  
  37. elif string[pointer] == '[':
  38. if plist[dpointer]:
  39. stack.append(pointer-1)
  40. else:
  41. while string[pointer] != ']': pointer+=1
  42.  
  43. elif string[pointer] == '.':
  44. sys.stdout.write(chr(plist[dpointer]))
  45. sys.stdout.flush()
  46. elif string[pointer] == ',':
  47. plist[dpointer] = ord(sys.stdin.readline()[0])
  48. sys.stdin.flush()
  49. pointer+=1
  50.  
  51. def pi2bf(string):
  52. out = ""
  53. t = { 0:'>', 1:'<', 2:'+', 3:'-', 4:'.', 5:',', 6:'[', 7:']' }
  54. k, a, b, a1, b1, r = 2, 4, 1, 12, 4, True
  55. while r:
  56. p, q, k = k*k, 2*k+1, k+1
  57. a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
  58. d = int(a / b)
  59. d1 = int(a1 / b1)
  60. while d == d1:
  61. if len(string):
  62. c = string[0]
  63. string = string[1:]
  64. else: c = ""
  65. if len(c) == 0:
  66. r = False
  67. break
  68. try: c = int(c)
  69. except: continue
  70. if c != d: out += t[c - (c > d)]
  71. a, a1 = 10*(a%b), 10*(a1%b1)
  72. d, d1 = int(a/b), int(a1/b1)
  73. return out
  74.  
  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 = int(a / b)
  84. d1 = int(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 = int(a/b), int(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 dis 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()))
Success #stdin #stdout 0.03s 10032KB
stdin
3.1415926535897932384226433232725028841271693992751358239749245923072164062
  822089986780348053431120629821483865332223366470908446395535832317223594083
  284831172502841037019385311052596446029489529303219642288009756259134461214
  751482337817834652812009021456285664234613486134553226482133236073603491413
  737242870066363155841744815239239622292545917053643278925902605113301301488
  204625213821429519415316024320522703627595939530921261373219226137931021185
  580744023794627495273518257527348912274384830113491298346743644406563430865
  2133494633522473749030217386093370277033921317659317670238267581846066440
stdout
Hello World!