J'ai écrit le code pour écrire le code Brainf * ck en python

introduction

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.

environnement

Entraine toi

Manière stupide

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é.

Améliorations du code

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.

À la fin

Comment était-ce

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.

Articles référencés

https://qiita.com/TomoShiozawa/items/25dcce1540085df71053 https://qiita.com/saba383810/items/39e20b11c71b3dfd2589

Recommended Posts

J'ai écrit le code pour écrire le code Brainf * ck en python
Je veux écrire en Python! (1) Vérification du format de code
Je veux écrire en Python! (3) Utiliser des simulacres
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
Partie 1 J'ai écrit un exemple de la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai écrit "Introduction à la vérification des effets" en Python
Conseils pour rédiger un aplatissement concis en python
Je veux afficher la progression en Python!
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai écrit python en japonais
Comment obtenir le nombre de chiffres en Python
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
J'ai senti que j'avais porté le code Python en C ++ 98.
J'ai essayé de refactoriser le code de Python débutant (lycéen)
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Je veux utiliser le jeu de données R avec python
J'ai essayé de résumer les opérations de chaîne de Python
J'ai utilisé Python pour découvrir les choix de rôle des 51 "Yachts" dans le monde.
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai écrit la grammaire de base de Python dans Jupyter Lab
J'ai écrit le fonctionnement de base de Seaborn dans Jupyter Lab
J'ai essayé de résumer le code souvent utilisé dans Pandas
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Je l'ai écrit en langage Go pour comprendre le principe SOLID
Je viens d'écrire le matériel original pour l'exemple de code python
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai écrit le fonctionnement de base de Numpy dans Jupyter Lab.
Je veux connaître la nature de Python et pip
Je veux pouvoir exécuter Python avec VS Code
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
Je ne voulais pas écrire la clé AWS dans le programme
Dans la commande python, python pointe vers python3.8
J'ai écrit Fizz Buzz en Python
Ecrire le code de test du sélénium en python
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Comment déterminer l'existence d'un élément sélénium en Python
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Comment implémenter du code Java en arrière-plan de Red Hat (Linux ONE)
Comment connaître la structure interne d'un objet en Python
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Comment vérifier la taille de la mémoire d'une variable en Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
N'hésitez pas à changer l'étiquette de légende avec Seaborn en python