Gegeben 2 Gehirnfick Code - Schnipsel A
und B
, Ausgabe einige Gehirnfick Code , C
die das gleiche Verhalten hat wie Laufen B
mit dem Eingang des A
s Ergebnis. Beachten Sie, dass dies C
für alle Eingaben funktionieren muss, die den folgenden Annahmen entsprechen, als ob sie gegeben wären A
.
Sie können annehmen:
- Endliche Eingabe.
- sowohl A als auch B halten an.
- EOF ist konsistent 0 oder konsistent -1.
- Erlaube oder verbiete konsequent, dass Zellen nach links gehen
- Ungebundenes Band (andernfalls ist die Anforderung möglicherweise nicht möglich)
- Konsequent 8-Bit-Wrapping oder unbegrenzte Ganzzahl
- Kein Stream (Eingabe oder Ausgabe für A oder B) enthält das Byte, das EOF darstellt
- Code A und B können Zeichen enthalten, die möglicherweise in Ihrem C und erscheinen
+-[]<>,.
ZB (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
sind gültige Tests
Der kürzeste Code in jeder Sprache gewinnt. Der Gewinner in Brainfuck wird akzeptiert.
Shortest code in each language win
undShortest Brainfuck solution will be accepted
sind zwei verschiedene Gewinnkriterien.4.Consistently allow or disallow cells to left
. Die führende Antwort erfordert, dass die Zellen links in der Antwort funktionieren, A, B und C jedoch nicht das erste Byte passieren dürfen. Meine Antwort wird in Antwort A, B und C nach links verschoben. Wenn die Regeln für mein Programm und C von A und B abweichen können, kann ich meine Antwort sicherlich stark verkürzen.>
am Anfang meiner Antwort ein paar s hinzuzufügen , damit sie einem restriktiveren Geschmack entspricht (aber für Golf sollten wir auch Alternativen in Betracht ziehen). Außerdem scheint mir klar zu sein, dass A, B und C den gleichen Geschmack haben müssen.Antworten:
Brainfuck, 526 Bytes
Formatiert:
In Bezug auf A, B und C: EOF = 0 sind vom Start übrig gebliebene Zellen nicht zugelassen, 8-Bit-Wrapping-Zellen.
Erwartet A gefolgt von
?
gefolgt von B.Probieren Sie es online aus
(Diese Antwort kann mit einem Brainfuck-Interpreter kompatibel gemacht werden, der es nicht erlaubt, durch Transliteration auf Kosten eines Bytes vom Start wegzugehen
y/<>/></
und vorangestellt wird>
.)Die Grundidee besteht darin, eine Reihe von String-Ersetzungen zu verwenden, um die Bänder von A und B unter Verwendung von 2-Zellen-Knoten zu simulieren, wobei besonderes Augenmerk auf das Ersetzen
.
in A und,
in B gelegt wird, damit der Zwischendatenstrom in einem Block von gehalten wird Zellen links vom simulierten Band. Das Zeichenfolgenersetzungsschema lautet:>>
Vor A einfügenSowohl bei A und B, ersetzen
>
mit>[-]+>
und<
mit<<
In A, ersetzen
.
mit>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
>[>>]+>
Nach A und vor B einfügenIn B, ersetzen
,
mit,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
quelle
,[>,]<[.<]?,[...,]
Eingabe12345
kehrt zurück111
, auch mit genug>
vorher?,[>,]<[.<]
ist nicht gültig, aber>,[>,]<[.<]
ist.)>
s nach Bedarf vor D zu stellen.Brainfuck , 1287 Bytes
Probieren Sie es online aus!
Hier ist es! Der Brainfuck-Code, der zwei Brainfuck-Codes zusammensetzt. Benutze einen "!" um die beiden Eingabecode-Schnipsel zu trennen. Zum Beispiel Snippet A :
>,[>,]<[.<]
, Snippet B :.,[...,]
. Eingabe für mein Programm :>,[>,]<[.<]!,[...,]
. Es wird nicht beendet, wenn kein "!" gefunden.Dies entspricht im Wesentlichen meiner VBA-Version. Der generierte Code ist der gleiche wie in der VBA-Version (beachten Sie, dass die Beispiele im VBA-Beitrag vor der letzten Änderung in den Brainfuck-Snippets erstellt wurden).
Erläuterung
Dies ist mein Quellcode:
quelle
>[,>]<[.<]!,[...,]
, also gibt Snippet A nichts aus. Natürlich muss es>,[>,]<[.<]!,[...,]
ein funktionierendes Beispiel sein.VBA,
512489479 BytesErläuterung
Der VBA-Code ändert den Brainfuck-Code so, dass die Ausgabe von Snippet A in einer Liste gespeichert und die Eingabe von Snippet B aus dieser Liste gelesen wird.
Zunächst werden einige Variablen initialisiert
Dann liest es Snippet A und ersetzt jedes
<
By<<<[+]-<<
, jedes>
By>>>>>>>[+]-<<
und jedes.
durch die SpeicherroutineDanach wird der Speicher von Snippet A gelöscht und die gespeicherte Liste geändert, sodass sie als Eingabe für Snippet B gelesen werden kann:
Dann wird Snippet B gelesen, jedes
<
wird ersetzt durch<<<<<
, jedes>
wird ersetzt durch>>>>>
und jedes,
wird durch die Listenleseroutine ersetzt:Brainfuck Quellcode
Dies ist meine Quelle für die Brainfuck-Teile des Codes. Ich werde das später im Detail erklären.
Ausgabe für Testfall 1:
f ",[..,]",",[...,]"
Probieren Sie es online aus!
Ausgabe für Testfall 2:
f ">,[>,]<[.<]",",[...,]"
Probieren Sie es online aus!
Ausgabe für Testfall 3:
f ",.",",."
Probieren Sie es online aus!
Komplexer Testfall: Snippet A: Alphabet-Dreieck
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
erstellen Probieren Sie es online aus!Snippet B: Eingabe in aufsteigender Reihenfolge
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
sortieren Probieren Sie es online aus!Ergebnis:
Probieren Sie es online aus!
quelle
Brainfuck , 785 Bytes
Probieren Sie es online aus!
Um A von BI zu trennen, entschied man sich
/
.Erklärung:
Der tatsächliche Code, der diese erzeugt , ist nur ein Lese-Schleife mit einem Flag für die A / B und einen Schalter, der den Eingang zu suchen , verringert
>
,<
,/
,,
, und.
und ansonsten nur der Ausgang - Eingang. Es ist eigentlich nur ein Transpiler, bei dem der transpilierte Code innerhalb einer Datenstruktur lebt, so dass er die gespeicherten Daten von A oder einander nicht stört. Das verschiebt/
gerade die aktive Zelle in die erste nicht verwendete Zelle. Ich habe es ursprünglich aufgeräumt, aber das macht das Programm und die Ausgabe größer.Das Programmergebnis hat folgendes Speichermodell:
Das
c
bröckelt.cz
ist immer0
Es zeigt, wo in meinen emulierten BF-Daten der Zeiger ist. Der aktive Wert ist -1, während alle besuchten Zellen haben1
. Bei Operationen wieaprint
und erhaltenbread
manchec
eine besondere Bedeutung.Beim A-Code-Druck werden alle Zellen 1 Byte übersprungen, um Platz für eine weitere Byte-Eingabe zu lassen, bei der Kopien mit einer Sicherung in den nächsten Bytes zum Zurückkopieren zerbröckeln.
Beim Lesen des B-Codes werden Eingaben von Eingaben abgerufen. Hier ist es in Ordnung, destruktiv zu sein, und wenn Sie das letzte Byte "lesen", erhalten Sie unabhängig von der Implementierung 0 als EOF.
Ich begann als Extended BrainFuck- Code, der das EBF-Ergebnis ergab. Das meiste Debugging wurde für die Ergebnisdateien durchgeführt und dann auf die Quelle aktualisiert, die es generiert hat. Dann habe ich die Operationen einfach unabhängig ausgeführt, um die BF-Ausgabe zu erhalten, aber ich habe Dorians Antwort bemerkt, die mich in der Länge übertroffen hat, also habe ich die EBF-Quelle für eine kleinere BF-Ausgabe weiter gespielt. Die Originalquelle ist im Vergleich zu anderen Dingen, die ich damit gemacht habe, gut lesbar und einfach:
quelle
[->+]
in Programm C Fehler bei Eingaben wie->->,./,.
, und dies könnte mithilfe von behoben werden[->>+]
(indem sichergestellt wird, dass der Zeiger auf einer Zelle mit der gewünschten Parität startet). Denn[-<+]
, ich glaube , Sie das Navigationsschema ändern können auf alles A die auszugebende ungleich Null verlassen?->->,.
und B ist,.
, erzeugt Ihr bevorzugter Interpreter dasselbe C wie TIO, und funktioniert C bei Ihrem Interpreter wie erwartet? Weil es auf TIO fehlschlägt . (Ich schrieb dies als Antwort auf einen Kommentar, der jetzt gelöscht wird.)-1
Benutzerdaten zu suchen, aber tatsächlich tat ich dies in der Zeile "Gehe zu aktiver Zelle, stelle sie auf Null". Ich habe meine Antwort aktualisiert und dann ein Byte hinzugefügt: -O, aber zumindest funktioniert es. Übrigens. Wenn Im nicht - Scan verwendet für-1
zu , wenn die Eingabe in B holen werde ich habe , um die aktive Byte mit einer Kopie zu bewegen>[-<+]<
und damit füge ich mehr Zeichen , als ich durch den Austausch sparen+[-<+]-
mit[<]
. Wenn Sie nicht kopieren, können Sie nicht feststellen, ob das von Ihnen komponierte Byte fertig ist, und alle Bytes kopieren.[-<+]
sich eigentlich auch auf die Beseitigung von Fehlern (im Gegensatz zum Speichern von Bytes) für Eingaben wie-./,>++++++[<++++++>-]<.
, die#
eher gedruckt als gedruckt werden sollten%
. :) Aber ich sehe auch einige Möglichkeiten, Bytes zu speichern. Viel Glück! Ich werde versuchen, meine doppelt unendliche Bandlösung zu optimieren, obwohl ich sehe, dass das, was Sie getan haben, am Ende vielleicht richtig rechts ist.sed, 165 Bytes
Bei Aromen mit EOF = 0 sind Zellen, die vom Start übrig geblieben sind, nicht zulässig. 8-Bit-Umhüllungszellen.
Erwartet Programm A in der ersten Zeile und B in der zweiten Zeile.
Probieren Sie es online aus
Dies verwendet Knoten mit zwei Zellen, um die Bänder von A und B zu simulieren, wobei die Ausgabe von A zusammenhängende Zellen links vom Knoten ganz links belegt.
Alternative 173-Byte-Lösung:
Probieren Sie es online aus
Ursprünglich basierte mein Entwurf auf einem doppelt unendlichen Band, das erheblich mehr Arbeit erforderte, um sich nach links zu bewegen (Daten beim Überqueren der zuvor angetroffenen Zelle ganz links zu bewegen) und von A nach B zu wechseln (Daten zu löschen, anstatt nur an der Zelle ganz rechts vorbeizukommen zuvor angetroffen).
Vielen Dank an Sylwester und Dorian für Tricks und Ideen.
quelle
,[..,]
und Programm B,[...,]
.s/x/>>/g
am Ende gespeichert werden können , aber ich bin mehr an Verbesserungen interessiert, die die Ausgabe vorerst verkürzen.