Sie müssen ein Programm oder eine Funktion schreiben, die bei Angabe einer nicht leeren Zeichenfolge S mit N druckbaren ASCII-Zeichen † ein Programm ausgibt, das mit dem Beendigungscode C beendet wird , wobei C der ASCII-Codepunkt an Position 0 in S ist . Dieses von Ihnen geschriebene Programm gibt zusätzlich ein Programm P aus , so dass es beim Ausführen mit dem Exit-Code C 'beendet wird , wobei C' der ASCII-Codepunkt an Position 1 in S ist . Das Programm P gibt ein anderes Programm P 'aus . Dieser Vorgang wiederholt sich, bis in S keine Zeichen mehr vorhanden sind. Danach müssen Sie nichts mehr ausgeben, gefolgt von einem optionalen Zeilenumbruch. und sollte mit Exit-Code 0 beenden.
† Die Zeichen zwischen 0x20
und 0x7e
einschließlich.
Noch ein paar Regeln:
- Selbstmodifizierende Programme sind nicht zulässig: Sie müssen die Quelle an STDOUT ausgeben (oder zunächst einen Wert zurückgeben).
- Möglicherweise lesen Sie Ihren eigenen Quellcode nicht.
Das kürzeste derartige Programm in Bytes gewinnt.
Für einige rudimentäre Tests kann dieses Ruby-Skript verwendet werden. (Das erste Argument ist die Art und Weise, wie Sie das Skript aufrufen, das zweite das Programm und das dritte die Eingabezeichenfolge.)
Hypothetisches Beispiel
Sprich das Programm ist FOO
. Wenn die Zeichenfolge "ABC" angegeben wird, wird ausgegeben BARA
. Dieses Programm wird mit Code 65
und Ausgaben beendet BARB
. Dies wird wiederum mit Code 66
und Ausgaben beendet BARC
. Dieses Programm wird mit Code 67
und Ausgaben beendet BAR!
. Dies gibt nichts aus und wird mit Code beendet 0
.
0
ist Erfolg. tio.run/nexus/…33 throw
eine beliebige Zahl werfen. Sie verwenden Negative für die Betriebssystemebene und der Offset beträgt -512. Idk auch viel, aber ich suche hier: complang.tuwien.ac.at/forth/gforth/Docs-html/…Antworten:
Python 2,
12610194 BytesDabei stellte ich fest, dass Python-Code möglicherweise keine wörtlichen NUL-Bytes enthält.
Versuchen Sie es online (zeigt den Exit-Code in der Debug-Info)
Beachten Sie, dass jedes der folgenden nicht leeren Programme einen nachgestellten Zeilenumbruch hat.
Für die Eingabe gelten
Hello
die obigen Ausgaben:welche druckt
...
welche druckt
welche druckt
das druckt nichts (das leere Programm)
das druckt nichts und beendet mit Code 0.
quelle
Python 3, 77 Bytes
Dieser Code nimmt Eingaben von STDIN entgegen und gibt das erste Programm an STDOUT aus.
Wenn die Eingabe ist
ABCDE
, sind die ErgebnisseDabei enthält jede Zeile den Exit-Code und die Ausgabe des zuvor ausgeführten Programms (die erste Zeile ist das erste Programm).
quelle
Python 3 ,
115108100 BytesProbieren Sie es online!
Für die Eingabe
Hello
druckt das Programm:Das obige Programm druckt:
und wird mit Code beendet
72
.Probieren Sie es online!
Das obige Programm wird gedruckt
und wird mit Code beendet
101
.Probieren Sie es online!
Das obige Programm druckt:
und wird mit Code beendet
108
.Probieren Sie es online!
Das obige Programm druckt:
und wird mit Code beendet
108
.Probieren Sie es online!
Das obige Programm gibt nichts aus und wird mit Code beendet
111
.Probieren Sie es online!
Das leere Programm gibt nichts aus und wird mit Code beendet
0
.Probieren Sie es online!
quelle
C 156 Bytes
Probieren Sie es online! (Öffnen Sie die Debug-Registerkarte, um den Exit-Code zu sehen.)
Nimmt Eingaben als Befehlszeilenargument.
Bei Eingang "ABC" wird das Programm ausgegeben
Dies gibt 65 und Ausgänge zurück
was 66 und Ausgänge zurückgibt
was 67 und Ausgänge zurückgibt
was nichts ausgibt und 0 zurückgibt.
quelle
Python 2, 67 Bytes
Basierend auf dieser Antwort , aber geändert, um Python 2 zu verwenden, mit einem einfachen Programm
0
, um nichts zu drucken und zu beenden.Probieren Sie es online aus
quelle
RPL, 73 Bytes
Mit HP8-Codepage.
Schalten Sie Ihr HP48 oder ähnliches ein oder feuern Sie droid48 ab . Vergessen Sie nicht,
-52 SF
für eine bessere Visualisierung des Stapels. Ich gehe davon aus, dass Sie die Zeichenfolge bereits verschoben haben, z. B."ABC"
auf dem Stapel. Geben Sie dann die folgende Funktion ein:(Der Einfachheit halber schlage ich vor, die α-Taste zweimal zu drücken, bevor Sie etwas eingeben, um den Alpha-Eingabemodus zu sperren. Verwenden Sie in letzter Zeit einfach die ENTF-Taste, um die automatisch eingefügten schließenden Begrenzer zu löschen. Verwenden Sie einfach die EINGABETASTE, um die Eingabe zu bestätigen. Vergessen Sie nicht das Leerzeichen nach dem Stichoperator.)
Diese Funktion drückt sofort ein selbstmodifizierendes Programm in Form einer Liste auf den Stapel. (Die obige Funktion ändert sich jedoch nicht von selbst). Da das L in RPL ursprünglich für LISP steht, wird dieses Programm durch Drücken der EVAL-Taste ausgewertet. Es gibt den Exit-Code auf Stack-Ebene zwei zurück und lässt sich für ein letztes EVAL modifiziert (ja, hier ist es fraglich). Drücken Sie also mehrmals EVAL, bis das Programm endgültig stoppt und sich auf Stapelebene eins befindet. Der endgültige Beendigungscode 0 wird daher auf der ersten Ebene mit den vorherigen Beendigungscodes angezeigt. Wenn du vergessen hast, deine Freunde zu sein. Die Selbstmodifikation besteht aus dem Entfernen des verwendeten Zeichens aus der eingebetteten Zeichenfolge (dem Zweig). Daher ist das verworfene Programm nach jedem EVAL kürzer. Die Verzweigung sorgt für die Ausgabe nichts
-52 SF
können Sie nach jedem EVAL durch Drücken der Taste ▴ im Stapel navigieren (verlassen Sie diesen Navigationsmodus mit der Taste ON). Die obige Funktion akzeptiert Strings mit 0x0 Zeichen, um solche Strings0 CHR
und zu erstellen+
SUB 2 SWAP PUT
4 DROPN
Anweisung vom OP beachtet wird, und verwirft unter anderem das Programm selbst. Natürlich setzt all dies voraus, dass Ihre Notiz ein-55 SF
Experte ist. Nutzer von-55 SF
sollen gebannt werden. Für immer.Ich gehe davon aus, dass eine RPL / 2-Lösung vorhanden ist und einen echten Unix-Exit-Code enthalten könnte, aber afaik RPL / 2 verfügt über eine eingeschränkte Introspektion und kann keine Listen auswerten.
quelle
sed ,
467461 BytesZeichencodes sind schwer:
Probieren Sie es online!
Ansonsten ist die Logik recht einfach: (1) Escape-Sonderzeichen (es gibt zwei), (2) Wrap-In-Zusatzzeichen
s/^/…/;q\1
Ebene einschließen, (3) Wiederholen.Hier ist die Ausgabe für
hello
:Und ein kleines Skript, das ich benutzt habe:
quelle
PowerShell,
172.156Byte.Die
h3l}'{l0
Eingabe ergibt die nächste AusgabeProbieren Sie es online!
Was in der eigenen Runde ausgegeben wird
Probieren Sie es online!
Der letzte Lauf gibt nichts aus und der Beendigungscode ist 0.
Probieren Sie es online!
quelle