[GO] Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben

Einführung

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.

Umgebung

Trainieren

Blöder Weg

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.

Codeverbesserungen

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.

Am Ende

Wie war es

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.

Artikel, auf die verwiesen wird

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

Recommended Posts

Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Teil 1 Ich habe ein Beispiel für die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Geschrieben "Einführung in die Effektüberprüfung" in Python
Tipps zum Schreiben werden in Python kurz abgeflacht
Ich möchte den Fortschritt in Python anzeigen!
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe Python auf Japanisch geschrieben
So ermitteln Sie die Anzahl der Stellen in Python
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Ich möchte R-Datensatz mit Python verwenden
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe Python verwendet, um mich über die Rollenauswahl der 51 "Yachten" in der Welt zu informieren.
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe die grundlegende Grammatik von Python in Jupyter Lab geschrieben
Ich habe die Grundoperation von Seaborn im Jupyter Lab geschrieben
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe gerade das Originalmaterial für den Python-Beispielcode geschrieben
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe die Grundoperation von Numpy im Jupyter Lab geschrieben.
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte Python mit VS-Code ausführen können
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Im Python-Befehl zeigt Python auf Python3.8
Ich habe Fizz Buzz in Python geschrieben
Schreiben Sie Selentestcode in Python
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
So bestimmen Sie die Existenz eines Selenelements in Python
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
So implementieren Sie Java-Code im Hintergrund von Red Hat (Linux ONE)
Wie Sie die interne Struktur eines Objekts in Python kennen
[Python] Ich habe die Route des Taifuns mit Folium auf die Karte geschrieben
[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern