Je voulais écrire le code avec Brainfuck, mais cela semblait être une douleur d'écrire le code, alors j'ai décidé de laisser python l'écrire à la place. Cependant, je ne peux pas rendre quelque chose d'aussi difficile, j'ai donc créé un programme qui génère une chaîne de caractères telle quelle.
La première chose à laquelle j'ai pensé était de convertir chaque caractère de la chaîne de caractères reçue à l'entrée en ASCII, puis d'incrémenter honnêtement le pointeur et de le sortir. En termes de code, cela ressemble à ceci.
makebf0.py
import os
#Déjà hoge.Supprimer n'importe quel fichier bf
if os.path.exists("/hoge.bf"):
os.remove("hoge.bf")
s = input()
array = []
#Obtenez ASCII pour chaque caractère
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(".>")
#nouvelle ligne
f.write("++++++++++++.")
f.close()
Quand tu fais ça
$ python makebf0.py
brainf*ck
$ cat hoge.bf
hoge.bf
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.>++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++.>++++++++++++.
Un code comme celui-ci est généré.
Cela rend le code long et inintéressant, je vais donc essayer de compresser le code généré.
L'idée de compresser le code était d'utiliser des boucles pour réduire le nombre de +. En tant qu'algorithme, si le nombre de fois où la boucle est tournée est n et que l'ASCII du i-ème caractère de la chaîne de caractères est si, min (si / n, si / n + 1) est incrémenté dans la boucle et la fraction est la boucle. Incrémenté ou décrémenté à l'extérieur. J'ai essayé de générer le code avec le plus petit nombre de +. Le code ressemble à ceci.
makebf1.py
import os
import math
if os.path.exists("./hoge2.bf"):
os.remove("hoge2.bf")
s = input()
array= [] #Caractère 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 = [] #Différence
#c'est la décision décisive
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
#Nombre de fois pour tourner la boucle
for i in range(m):
f.write('+')
flag = []
#Contenu de la boucle
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('+')
#Renvoie le pointeur au compteur de boucle
for i in range(len(array)):
f.write('<')
f.write('-')
f.write(']')
#Gérer les fractions
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('.')
#Commencer sur une nouvelle ligne
f.write('>++++++++++++.')
f.close()
Quand tu cours
$ python makebf1.py
brainf*ck
$ cat hoge2.bf
hoge2.bf
+++++++++++++++++++++[>+++++>+++++>+++++>+++++>+++++>+++++>++>+++++>+++++
<<<<<<<<<-]>-------.>+++++++++.>--------.>.>+++++.>---.>.>------.>++.>++++++++++++.
Le code a été considérablement compressé. J'ai pu générer du code en 158 octets en code compressé, contre 921 octets en code simple. Tu l'as fait.
Je n'étais pas habitué à écrire du python, j'ai donc pu écrire ce code pour m'habituer un peu à python. Brainfuck est aussi un langage intéressant donc j'aimerais pouvoir faire des choses plus compliquées. Si vous avez de meilleurs algorithmes ou de mauvaises choses concernant votre code, veuillez nous en informer. Merci d'avoir lu jusqu'ici.
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053 https://qiita.com/saba383810/items/39e20b11c71b3dfd2589
Recommended Posts