Ich wollte den Code mit Brainfuck schreiben, aber es schien mir ein Problem zu sein, den Code zu schreiben, also entschied ich mich dafür, ihn stattdessen von Python schreiben zu lassen. Ich kann etwas jedoch nicht so schwierig machen, also habe ich ein Programm erstellt, das eine Zeichenfolge so ausgibt, wie sie ist.
Das erste, woran ich dachte, war, jedes Zeichen der an der Eingabe empfangenen Zeichenfolge in ASCII zu konvertieren und dann den Zeiger ehrlich zu erhöhen und auszugeben. In Bezug auf Code sieht es so aus.
makebf0.py
import os
#Schon hoge.Löschen Sie alle bf-Dateien
if os.path.exists("/hoge.bf"):
os.remove("hoge.bf")
s = input()
array = []
#Holen Sie sich ASCII für jedes Zeichen
for si in s:
array.append(ord(si))
f = open("hoge.bf", "w")
for ai in array:
for i in range(ai):
f.write("+")
f.write(".>")
#Neue Zeile
f.write("++++++++++++.")
f.close()
Wenn du das machst
$ python makebf0.py
brainf*ck
$ cat hoge.bf
hoge.bf
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.>++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++.>++++++++++++.
Code wie dieser wird generiert.
Dies macht den Code lang und uninteressant, daher werde ich versuchen, den generierten Code zu komprimieren.
Die Idee, den Code zu komprimieren, bestand darin, Schleifen zu verwenden, um die Anzahl von + zu reduzieren. Wenn als Algorithmus die Anzahl der Umdrehungen der Schleife n ist und der ASCII des i-ten Zeichens der Zeichenfolge si ist, wird min (si / n, si / n + 1) in der Schleife inkrementiert und der Bruch ist die Schleife. Außen erhöht oder verringert. Ich habe versucht, den Code mit der kleinsten Anzahl von + zu generieren. Der Code sieht so aus.
makebf1.py
import os
import math
if os.path.exists("./hoge2.bf"):
os.remove("hoge2.bf")
s = input()
array= [] #Zeichen si ascii
for si in s:
array.append(ord(si))
f = open("hoge2.bf", "w")
MAX = 0
for ai in array:
if MAX < ai:
MAX = ai
list = [] #Unterschied
#Ich bin die entscheidende Entscheidung
for i in range(MAX):
if i == 0:
continue
sum = i
for ai in array:
r1 = ai // i
r2 = (ai + i) // i
if ai - r1 * i > r2 * i - ai:
r = r2 * i - ai
sum += r2
else :
r = ai - r1 * i
sum += r1
sum = sum + r
list.append(sum)
m = 10000000000
for i in range(len(list)):
#print(li)
li = list[i]
if m > li:
#print(li)
m = li
std = i
#Häufigkeit, mit der die Schleife gedreht wird
for i in range(m):
f.write('+')
flag = []
#Loop-Inhalt
f.write('[')
for ai in array:
r1 = ai // m
r2 = (ai + m) // m
f.write('>')
if ai - r1 * m > r2 * m - ai:
flag.append(-(r2 * m - ai))
for j in range(r2):
f.write('+')
else:
flag.append(ai - r1 * m)
for j in range(r1):
f.write('+')
#Zeiger auf Schleifenzähler zurückgeben
for i in range(len(array)):
f.write('<')
f.write('-')
f.write(']')
#Fraktionen handhaben
for i in range(len(array))
f.write('>')
if flag[i] < 0:
for j in range(-flag[i]):
f.write('-')
else:
for j in range(flag[i]):
f.write('+')
f.write('.')
#Beginnen Sie mit einer neuen Zeile
f.write('>++++++++++++.')
f.close()
Wenn du rennst
$ python makebf1.py
brainf*ck
$ cat hoge2.bf
hoge2.bf
+++++++++++++++++++++[>+++++>+++++>+++++>+++++>+++++>+++++>++>+++++>+++++
<<<<<<<<<-]>-------.>+++++++++.>--------.>.>+++++.>---.>.>------.>++.>++++++++++++.
Der Code wurde erheblich komprimiert. Ich konnte Code in 158 Bytes in komprimiertem Code generieren, verglichen mit 921 Bytes in einfachem Code. Du hast es geschafft.
Ich war es nicht gewohnt, Python zu schreiben, also konnte ich diesen Code schreiben, um mich ein bisschen an Python zu gewöhnen. Brainfuck ist auch eine interessante Sprache, daher möchte ich kompliziertere Dinge tun können. Wenn Sie bessere Algorithmen oder schlechte Dinge an Ihrem Code haben, lassen Sie es uns bitte wissen. Vielen Dank, dass Sie so weit gelesen haben.
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053 https://qiita.com/saba383810/items/39e20b11c71b3dfd2589
Recommended Posts