/text2bf.py

https://gitlab.com/8wiw/text2brainfuck · Python · 214 lines · 175 code · 22 blank · 17 comment · 65 complexity · 17c76b7eac52086335c537ead5df8729 MD5 · raw file

  1. # https://github.com/r4v10l1
  2. # https://gist.github.com/r4v10l1/34a13e265b528c4975a719abed3d45a0
  3. import sys, math
  4. ####### EDIT ME #########
  5. debug = False # Boolean. Print in console extra stuff.
  6. mode = "2" # Make sure you put the number inside a string!
  7. match_paragraphs = False # If there is a \n in the input file, type a \n in the output.bf
  8. ###########################
  9. def check_file_argv():
  10. if len(sys.argv) > 1:
  11. if sys.argv[1] == "-f":
  12. if len(sys.argv) > 2:
  13. return True
  14. else:
  15. error_exit("You specified the \'-f\' argument but you didn't specify a file!")
  16. else:
  17. error_exit("You need to specify \'-f\' in order to use the file mode!")
  18. else:
  19. return False
  20. def clear_file(filename):
  21. with open(filename, "w") as clear_file:
  22. clear_file.write("[ Made using https://github.com/r4v0l1/text2brainfuck ]\n\n")
  23. def error_exit(text):
  24. print()
  25. print(f" [!] {text}")
  26. exit(1)
  27. def debug_func(a1, a2, a3, a4, a5, a6):
  28. if a1 == "\n":
  29. print(" ┌ Character: \\n")
  30. else:
  31. print(f" ┌ Character: {a1}")
  32. print(f" │ Ascii value: {a2}")
  33. print(f" │ Value 1: {a3}")
  34. print(f" │ Value 2: {int(a4)}")
  35. print(f" │ BF Total: {int(a5)}")
  36. print(f" └ BF Remaining: {int(a6)}")
  37. print()
  38. # Mode 1. Using a memory block for each value.
  39. def mode1(string2translate):
  40. for character in string2translate:
  41. ascii_value = int(ord(character))
  42. bf_plus_count_1 = int(math.sqrt(ascii_value))
  43. for i in range(2, 15):
  44. if ascii_value % i == 0:
  45. bf_plus_count_1 = i
  46. bf_plus_count_2 = ascii_value / bf_plus_count_1
  47. bf_total = int(bf_plus_count_1) * int(bf_plus_count_2)
  48. if ascii_value > bf_total:
  49. bf_remaining = ascii_value - bf_total
  50. else:
  51. bf_remaining = 0
  52. # Write into the bf script
  53. with open("output.bf", "a") as bf_file:
  54. # Add part 1 (mult. 1)
  55. bf_file.write(">" + "+" * bf_plus_count_1)
  56. # Add part 2 (mult. 2)
  57. bf_file.write("[<" + "+" * int(bf_plus_count_2) + ">-]<")
  58. # Add the extra characters
  59. if bf_remaining is not 0:
  60. bf_file.write("+" * bf_remaining)
  61. # Print the character
  62. bf_file.write(".>")
  63. if debug:
  64. debug_func(character, ascii_value, bf_plus_count_1, int(bf_plus_count_2), int(bf_total), int(bf_remaining))
  65. # Mode 2. Deleting value and writing the new one in the same memory block.
  66. def mode2(string2translate):
  67. for character in string2translate:
  68. ascii_value = int(ord(character))
  69. bf_plus_count_1 = int(math.sqrt(ascii_value))
  70. for i in range(2, 15):
  71. if ascii_value % i == 0:
  72. bf_plus_count_1 = i
  73. bf_plus_count_2 = ascii_value / bf_plus_count_1
  74. bf_total = int(bf_plus_count_1) * int(bf_plus_count_2)
  75. if ascii_value > bf_total:
  76. bf_remaining = ascii_value - bf_total
  77. else:
  78. bf_remaining = 0
  79. with open("output.bf", "a") as bf_file:
  80. bf_file.write(">" + "+" * bf_plus_count_1) # Part 1
  81. bf_file.write("[<" + "+" * int(bf_plus_count_2) + ">-]<") # Part 2
  82. if bf_remaining is not 0:
  83. bf_file.write("+" * bf_remaining) # Add the remaining
  84. bf_file.write(".[-]") # Print the character
  85. # Instead of moving the memory block, delete until it's 0,
  86. # then start to write the new character in that memory block.
  87. if debug:
  88. debug_func(character, ascii_value, bf_plus_count_1, int(bf_plus_count_2), int(bf_total), int(bf_remaining))
  89. # Mode 3. Going from old value to new.
  90. def mode3(string2translate):
  91. global old_ascii_value
  92. global first_time
  93. for character in string2translate:
  94. ascii_value = int(ord(character))
  95. if first_time:
  96. bf_plus_count_1 = int(math.sqrt(ascii_value))
  97. for i in range(2, 15):
  98. if ascii_value % i == 0:
  99. bf_plus_count_1 = i
  100. bf_plus_count_2 = ascii_value / bf_plus_count_1
  101. bf_total = int(bf_plus_count_1) * int(bf_plus_count_2)
  102. if ascii_value > bf_total:
  103. bf_remaining = ascii_value - bf_total
  104. else:
  105. bf_remaining = 0
  106. with open("output.bf", "a") as bf_file:
  107. bf_file.write(">" + "+" * bf_plus_count_1)
  108. bf_file.write("[<" + "+" * int(bf_plus_count_2) + ">-]<")
  109. if bf_remaining is not 0:
  110. bf_file.write("+" * bf_remaining)
  111. bf_file.write(".")
  112. first_time = False
  113. else:
  114. # If we want to print the same value again
  115. if ascii_value == old_ascii_value:
  116. with open("output.bf", "a") as bf_file:
  117. bf_file.write(".")
  118. # If we want to increase the value
  119. elif ascii_value > old_ascii_value:
  120. difference = ascii_value - old_ascii_value
  121. bf_plus_count_1 = int(math.sqrt(difference))
  122. for i in range(2, int(difference / 2)):
  123. if difference % i == 0:
  124. bf_plus_count_1 = i
  125. bf_plus_count_2 = difference / bf_plus_count_1
  126. bf_total = int(bf_plus_count_1) * int(bf_plus_count_2)
  127. if difference > bf_total:
  128. bf_remaining = difference - bf_total
  129. else:
  130. bf_remaining = 0
  131. with open("output.bf", "a") as bf_file:
  132. bf_file.write(">" + "+" * bf_plus_count_1)
  133. bf_file.write("[<" + "+" * int(bf_plus_count_2) + ">-]<")
  134. if bf_remaining is not 0:
  135. bf_file.write("+" * bf_remaining)
  136. bf_file.write(".")
  137. # If we want to decrease the value
  138. elif ascii_value < old_ascii_value:
  139. difference = old_ascii_value - ascii_value
  140. bf_plus_count_1 = int(math.sqrt(difference))
  141. for i in range(2, int(difference / 2)):
  142. if difference % i == 0:
  143. bf_plus_count_1 = i
  144. bf_plus_count_2 = difference / bf_plus_count_1
  145. bf_total = int(bf_plus_count_1) * int(bf_plus_count_2)
  146. if difference > bf_total:
  147. bf_remaining = difference - bf_total
  148. else:
  149. bf_remaining = 0
  150. with open("output.bf", "a") as bf_file:
  151. bf_file.write(">" + "+" * bf_plus_count_1)
  152. bf_file.write("[<" + "-" * int(bf_plus_count_2) + ">-]<")
  153. if bf_remaining is not 0:
  154. bf_file.write("-" * bf_remaining)
  155. bf_file.write(".")
  156. else:
  157. error_exit("Unknown error in mode 3. Exiting...")
  158. old_ascii_value = ascii_value
  159. if debug:
  160. debug_func(character, ascii_value, bf_plus_count_1, int(bf_plus_count_2), int(bf_total), int(bf_remaining))
  161. def main():
  162. clear_file("output.bf")
  163. if check_file_argv():
  164. with open(sys.argv[2], "r") as input_file: # Read the input file
  165. while True:
  166. line = input_file.readline() # Read each line in a loop
  167. if not line: # If there are no lines left exit the loop
  168. break
  169. if mode == "1":
  170. mode1(line)
  171. elif mode == "2":
  172. mode2(line)
  173. elif mode == "3":
  174. mode3(line)
  175. first_time = False
  176. if match_paragraphs:
  177. with open("output.bf", "a") as bf_file:
  178. bf_file.write("\n\n")
  179. elif not check_file_argv():
  180. print()
  181. if mode == "1":
  182. mode1(input(" [?] String to translate: "))
  183. print()
  184. elif mode == "2":
  185. mode2(input(" [?] String to translate: "))
  186. print()
  187. elif mode == "3":
  188. mode3(input(" [?] String to translate: "))
  189. print()
  190. first_time = False
  191. first_time = True # Don't touch this
  192. main()