Diese Herausforderung zelebriert meine erste esoterische Sprache, Backhand !
Rückhand ist eine eindimensionale Sprache mit einem nichtlinearen Zeigerfluss. Der Zeiger bewegt sich drei Schritte gleichzeitig und führt nur jeden dritten Befehl aus.
Das Programm 1..1..+..O..@
addiert 1 + 1 und gibt 2 aus, bevor es beendet wird. Die Zwischeninstruktionen werden übersprungen, es 1<>1()+{}O[]@
handelt sich also genau um das gleiche Programm.
Wenn der Zeiger das Ende des Bandes verlässt, dreht er stattdessen die Richtung um und geht in die andere Richtung, so dass [email protected]+.
das gleiche Programm läuft. Beachten Sie, dass die Endanweisung nur einmal gezählt wird. Dadurch können wir die meisten linearen Programme wie z1O+1@
Hier besteht Ihre Herausforderung darin, ein Programm oder eine Funktion zu schreiben, die eine Zeichenfolge akzeptiert, und die Anweisungen auszugeben, die ausgeführt würden, wenn das Programm wie Rückhand interpretiert würde (Sie müssen keine tatsächlichen Rückhandanweisungen verarbeiten). Sie dürfen nur ausgeben, bis der Zeiger auf dem letzten Zeichen des Strings landet (an diesem Punkt würde die Ausführung normalerweise rückwärts gehen).
Aber warte , das ist noch nicht alles! Wenn Ihr Programm selbst auf diese Weise interpretiert wird, sollte der resultierende Code einen der folgenden Werte ausgeben:
(Mostly) works
Turing complete
'Recreational'
(Anführungszeichen können entweder'
oder"
aber nicht beide sein)Perfectly okay
Only a few bugs
Wenn Ihr Quellcode beispielsweise lautet code 2 backhand
, sollte das Programm ce cankb od2ahd
einen dieser Sätze ausgeben.
Testfälle:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
Und ein Referenzprogramm, das natürlich in Backhand geschrieben ist ( das könnte ein bisschen fehlerhaft sein Okay, ich denke, ich habe es behoben).
Regeln.
- Standardlücken sind verboten
- Die Eingabe des ersten Programms enthält nur druckbare ASCII- und Zeilenumbrüche (dh Bytes
0x20
-0x7E
sowie 0x0A). - Sie können wählen, ob Ihr zweites Programm von Ihrem ersten byte- oder UTF-8-Zeichen konvertiert wird.
- Zweites Programm:
- Groß- und Kleinschreibung spielt keine Rolle, daher kann Ihre Ausgabe auch eine sein,
pErFectLy OKay
wenn Sie möchten. - Beliebig viele nachgestellte / führende Leerzeichen (Zeilenumbrüche, Tabulatoren, Leerzeichen) sind ebenfalls in Ordnung.
- Das zweite Programm sollte dieselbe Sprache wie das erste sein, jedoch nicht unbedingt dasselbe Format (Programm / Funktion)
- Ich freue mich, Vorschläge aus den Kommentaren zu zusätzlichen Phrasen aufzunehmen (sofern diese nicht zu kurz sind).
- Groß- und Kleinschreibung spielt keine Rolle, daher kann Ihre Ausgabe auch eine sein,
- Da dies Codegolf ist , ist es Ihr Ziel, die kürzeste Antwort für Ihre Sprache zu erhalten!
- In zwei Wochen werde ich die kürzeste Rückhand-Antwort mit 200 Kopfgeldern belohnen.
quelle
"---!---!"
(oder eine beliebige Zeichenfolge, bei der das letzte Zeichen mehr als einmal vorkommt)Antworten:
R , 187 Bytes
Probieren Sie es online!
Das einzelne Leerzeichen am Ende wird benötigt, damit das
\n
nie gedruckt wird, wenn das Programm auf sich selbst angewendet wird.Erläuterung
Teil 1:
Ungolfed:
Teil 2:
Die Funktion erzeugt dies, wenn sie auf das gesamte Programm einwirkt:
quelle
Python 2 ,
1631301271211159996 BytesProbieren Sie es online!
Ausgänge:
quelle
Perl 6 ,
10186 BytesWow, -25 Bytes dank nwellnhof durch drastische Verbesserung des ersten Programms
Probieren Sie es online!
Ich hoffe, dass mehr Leute den Rebound nutzen. Das Rückhandprogramm ist
Was sich gerade dazu äußert
{"(Mostly) works"}
.quelle
05AB1E ,
43403837 Bytes-2 Bytes (40 → 38) dank @Emigna .
Probieren Sie es online aus . (PS: Wechseln Sie die Sprache von 05AB1E (Legacy) zu 05AB1E für Testfälle um
0123456789
. Die Legacy-Version ist schneller, zeigt jedoch falsche Ergebnisse für Zahleneingaben mit führenden Nullen.)Das "Rückhand" -Programm wird:
Welches wird
perfectly okay
in Kleinbuchstaben ausgegeben .Probieren Sie es online aus.
Erläuterung Basisprogramm:
Erklärung 'Rückhand' Programm:
Schritt für Schritt passiert folgendes:
„ÃеÝ
: STACK wird["perfectly okay"]
[
: Endlosschleife startenN©
: STACK wird["perfectly okay", 0]
I
: STACK bleibt bestehen,["perfectly okay", 0]
da keine Eingabe erfolgt#
: STACK wird["perfectly okay"]
und die Schleife wird fortgesetztN
: STACK wird["perfectly okay", 0]
#
: STACK wird["perfectly okay"]
und die Schleife wird fortgesetztN©
: STACK wird["perfectly okay", 1]
I
: STACK bleibt bestehen,["perfectly okay", 1]
da keine Eingabe erfolgt#
: STACK wird["perfectly okay"]
, und die Schleife bricht wegen der1
(Wahrheit)perfectly okay
Befolgen Sie die hier beschriebenen Schritte, wenn der Debugger für TIO aktiviert ist.
Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum
„€€Ã€„Ѐ€µ'€Ý
sindthe pointed
,dm one
undbeen
und„ÃеÝ
istperfectly okay
.Alte 38-Byte-Version:
Probieren Sie es online aus . (PS: Wechseln Sie die Sprache von 05AB1E (Legacy) zu 05AB1E für Testfälle
0123456789
und@
. Die Legacy-Version ist schneller, zeigt jedoch falsche Ergebnisse für Zahleneingaben mit führenden Nullen oder Eingaben mit einzelnen Zeichen.)Das "Rückhand" -Programm wird:
(Wo der
q
das Programm verlässt und alles andere no-ops macht.)Probieren Sie es online aus.
quelle
/
sollte `\` sein?N>3*©
anstelle vonXU
saves 2. Ich habe auch das Gefühl, dass auf irgendeine Weise das gesamte Drucken in der Schleife erfolgen sollte, wodurch noch mehr Bytes gespart würden./
hätte sein sollen\
.. Und danke für die -2. Ich habe in der Tat das Gefühl, dass man weiter Golf spielen kann. Die Grundfunktionalität des Druckens jedes dritten Werts, einschließlich des Zurückprallens, scheint zu lang.[ûDN3*©è?®IgD#<ÖNĀ*#
vorher ohne das if-else, das 2 Bytes kürzer ist als das if-else mit Schleife. Leider brauchen wir noch dasq
für das Rückhandprogramm, es wird also auch 38 Bytes sein . Aber ich habe das Gefühl, dass break definitiv irgendwie verbessert werden kann, wenn man die Single-Char-Eingaben, den Index 0 und die Teilbarkeit durch die Länge 1 zur gleichen ZeitPython 2 , 130 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 130 Byte
Früher Versuch. Nicht sehr befriedigend.
Probieren Sie es online!
Wenn der Code von selbst verarbeitet wird, werden die folgenden Zeichen isoliert:
was gibt:
quelle
Gelee , 34 Bytes
Ein vollständiges Programm oder ein monadischer Link, der eine Liste von Zeichen akzeptiert, die gedruckt oder ausgegeben werden.
Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Der durch die Rückhand geparste Code lautet dann:
Ein volles Programm oder ein Niladic Link drucken oder ergeben (bzw.) Turing abgeschlossen .
Wie?
Der durch die Rückhand geparste Code lautet dann:
quelle
Runenverzauberungen , 294 Bytes
Probieren Sie es online!
Unkomprimierte (und fast lesbare) Version:
Probieren Sie es online!
Das ... ist so nah wie ich nur kann.
Wenn Sie es weiter komprimieren, müssen Sie herausfinden, wie Sie mit den verschiedenen Loop-Swapping-Punkten umgehen können, ohne dass sie mit anderen Elementen kollidieren. Die erste Zeile (der einzige Teil, der als Eingabe an sich selbst übergeben werden muss) muss getrennt bleiben: Die gesamte Zeichenfolge kann nicht ohne Probleme in die zweite Zeile passen (
_
für erforderliche Leerzeichen):Dies
?
kann nicht von dem entfernt werden,!
was selbst nicht von dem entfernt werden kann,\
und keine der zulässigen Nachrichten lässt eines dieser drei Zeichen an dieser Position zu.Die Alternative wäre, die Flussumleitung zu verwenden. Dies führt jedoch zu einem Problem in der unteren Zeile:
Da müssen wir den Loop-Schalter im Hauptprogramm meiden.
Bekannte Probleme:
abcdefghijklmnopqrstuvwxyz
wenn nur nicht die gesamte eigene Quelle verarbeitet wird). Und es gibt eine Grenze, unabhängig davon, wie viele Zusammenführungen stattfinden. Kann bis zu 58 Bytes an Eingaben im Ist-Zustand verarbeiten (zusätzlich muss zur Erhöhung der Anzahl der IPs herausgefunden werden, wie diese zusammengeführt werden können, ohne mehr Speicherplatz zu belegen). Kann zwei weitere IP-Einträge in die Loop-Return-Zeile einfügen (rechts von derU
Zeile beginnend\y<<
in der unkomprimierten Version oder links von der Zeile über dery<<
in der komprimierten Version), wodurch die maximale Länge der Eingabe auf 78 erhöht wird.1\ \ 1\ \ +\ \ O\ \ @
. B. ). Dies ist eine Einschränkung der Syntaxanalyse der Sprache.0
s beginnen, können nicht bereitgestellt werden (wenn sie in eine Zahl auf dem Stapel umgewandelt werden, geht die0
verloren). Auch hier Einschränkung der Syntaxanalyse der Sprache.Wie es funktioniert
Eintrag:
Hauptschleife (vor allem, was auf dem Stack erscheint, steht ein Dup):
@
. True: Beenden. (Kommando beenden ausgeführt)Sekundärschleife:
quelle