Kurz gesagt, Ihr Ziel ist es, ein vollständiges Programm zu erstellen, das seinen eigenen Quellcode ändert, bis jedes Zeichen der Quelle anders ist als das, als das es begonnen hat.
Bitte geben Sie in Ihrem Beitrag sowohl die Anfangsquelle als auch die Endquelle sowie eine Beschreibung an. ZB Beschreiben Sie, was (sonst) Ihr Programm macht, welche Sprache Sie verwendet haben, Ihre Strategie usw.
Regeln
- Ihr Programm muss einige Zeit nach Abschluss der Änderung angehalten werden.
- Es muss seinen eigenen, aktuell ausgeführten Quellcode ändern (nicht unbedingt die Datei, die Sie an den Interpreter übergeben haben, es muss seine Anweisungen ändern), kein neues Programm drucken oder eine neue Datei schreiben.
- Standardlücken sind nicht zulässig.
Kürzeste Sendung gewinnt.
Wenn Ihre Sprache ihre eigene Datei ändern und einen neuen Compiler-Prozess ausführen kann, aber ihren eigenen (derzeit ausgeführten) Quellcode nicht ändern kann, können Sie ein solches Programm stattdessen mit einer aufgerundeten Strafe von + 20% schreiben. Echte selbstmodifizierende Sprachen sollten einen Vorteil haben.
Bearbeiten : Wenn Ihr Programm mit Fehlern anhält, geben Sie es bitte als solches an (und sagen Sie vielleicht, was die Fehler sind.)
quelle
Antworten:
/// , 1 Byte
Das Programm findet eine
/
(den Beginn einer Musterersetzungsgruppe) und entfernt sie in Vorbereitung auf die Ersetzung. Dann erreicht es EOF, gibt also auf und hält an.quelle
Labyrinth , 2 Bytes
Das
>
dreht die Quelle so, dass es wirdDer Befehlszeiger befindet sich jetzt in einer Sackgasse und dreht sich um, um den zu treffen, der
@
das Programm beendet.<@
Würde natürlich auch funktionieren.quelle
Python 2, 225 Bytes
Der endende Quellcode ist eine Zeichenfolge von
"0"
s, deren Länge der Anzahl der Bytes im ursprünglichen kompilierten Codeobjekt entspricht.Der Code findet das ausgeführte Codeobjekt
sys._getframe().f_code.co_code
und erstellt eine Struktur, die Python-String-Objekte darstellt. Es erhält dann den Speicher, den der Code tatsächlich benötigt, und ersetzt ihn durch"0"*len(c)
.Wenn das Programm ausgeführt wird, wird es mit dem folgenden Traceback beendet:
Dies zeigt, dass das Überschreiben erfolgreich war und das Programm abstirbt, weil
0
kein gültiger Opcode vorliegt.Ich bin überrascht, dass dies sogar in Python möglich ist, Frame-Objekte sind schreibgeschützt, ich kann keine neuen erstellen. Das einzig Komplizierte dabei ist, ein unveränderliches Objekt (einen String) zu ändern.
quelle
"1"
Zeichenfolge im Code nicht Teil des "Codes", sondern nur eine Konstante, auf die im Bytecode verwiesen wird. Was ich gerade ändere, sind die kompilierten Opcodes der virtuellen Python-Maschine, nicht die Konstanten oder Variablen. Was ich ändere, ist also nicht der Quellcode, sondern nur der kompilierte Code. Ich könnte den Quellcode wie gespeichert ändern, aber das würde den Code zur Laufzeit nicht beeinflussen, da er bereits kompiliert worden wäre. Wenn Sie wollten, könnte ich dies in einem 'kompilierten Python 2.7-Opcode mit Konstanten' posten, aber das wäre albern, IMO."1"
um<backtick>1+1<backtick>
nur zwei weiteren Bytes1+1
von meinem Vorschlag2
in der kompilierten Version verwandelt ... Der Compiler ist zu schlau für sich selbst!böse , 1 Byte
Das Böse hat mehrere Speicher - einer ist der Quellcode selbst und einer ist das Rad, das eine kreisförmige Warteschlange ist, die auf eine einzige Null initialisiert wird.
q
tauscht den Quellcode und das Rad aus, sodass die Quelle durch ein Null-Byte ersetzt wird. Allerdings sind nur Kleinbuchstaben echte Operatoren im Bösen, sodass dieses Zeichen einfach ein No-Op ist und das Programm beendet wird.quelle
MSM , 8 Bytes
Transformiert den Quellcode in
pqpqpqpq
MSM arbeitet mit einer Liste von Zeichenfolgen. Befehle werden von links genommen und die rechte Seite als Stapel behandelt. MSM arbeitet immer an seiner eigenen Quelle.
Ausführungsablaufverfolgung:
quelle
Malbolge, 1 oder 2 Bytes.
Die Malbolge-Sprache "verschlüsselt" jeden Befehl nach seiner Ausführung, sodass dieser Buchstabe (Malbolge NOP) zu einem
!
(was auch ein NOP ist) wird und dann endet. Aus irgendeinem Grund benötigt der Malbolge-Interpreter, den ich verwende, zwei Bytes, um ausgeführt zu werdenDC
. Beide sind Nops.!U
Beide sind auch Nops.Bearbeiten: Der Anfangszustand des Malbolge-Speichers hängt von den letzten beiden Zeichen im Code ab, daher ist er für Ein-Zeichen-Programme nicht genau definiert. (Obwohl dieser Code den Anfangszustand des Speichers nicht berücksichtigt)
quelle
x86 asm - 6 Bytes
Ich bin mir nicht sicher, ob "bis jedes Zeichen der Quelle anders ist als das, als das es begonnen hat" sich auf jedes Byte, jede nemonische oder allgemeine Modifikation bezieht. Wenn ich ungültig bin, kann ich das xor in ein rep xor ändern, so dass jedes Bit seine Werte ändert, aber ich hatte gehofft, dass ich das nicht tun kann, um 6 weitere Bytes zu sparen, um zumindest ein bisschen vergleichbar mit diesen Spezialgolfsprachen zu bleiben.
Alles, was dies bewirkt, ist, ein c2 in ein c3 zu ändern, indem die Live-Adresse von eip abgerufen und 5 Bytes davor gespeichert werden.
quelle
SMBF , 92 Bytes
Kann golfen werden und ich werde wahrscheinlich später mehr daran arbeiten.
Erläuterung
Das Programm generiert die folgenden Befehle am Ende seines Bands, um sich selbst zu löschen. Daher muss es die folgenden Werte auf dem Band generieren:
Machen Sie eine Reihe von
91
s, mit Nullen (angezeigt als_
) dazwischen, um sie für temporäre Werte zu verwenden.Passen Sie die Werte an die Unterschiede an
Das Band nach der Ausführung besteht ausschließlich aus Nullen, mit Ausnahme des generierten Codes
[_[_-_]_<_]
.Hinweis:
Dieses Programm hat mir klar gemacht, dass mein Python-Interpreter für SMBF einen oder zwei Fehler aufweist,
und ich habe noch keine Lösung gefunden.Es ist jetzt behoben.quelle
Emacs Lisp 22 Bytes
Führen Sie von REPL aus:
Funktion wertet jetzt auf aus
nil
.Abwechselnd 30 Bytes
Bewerten und Fehler als
void-function
. Funktion existierte vor der Ausführung.quelle
Redcode , 7 Bytes, 1 Anweisung (Nur ein Beispiel. Nicht konkurrierend)
Dies ist ein triviales Beispiel.
Verschiebt den nächsten Speicherort auf sich selbst und stoppt dann (da der gesamte Speicher auf initialisiert wird
DAT 0 0
, wodurch das Programm bei der Ausführung angehalten wird).quelle
Powershell 65 Bytes
Definieren Sie eine Funktion, die sich selbst auf null zurücksetzt.
Bewerten Sie es einmal und es beseitigt sich.
Alternativ (löscht sich aus dem Speicher) 36 Bytes
Wenn Sie es zuerst aufrufen, wird es entfernt und dann versucht, es rekursiv auszuwerten. Fehler als unbekannter Befehl.
quelle
MIXAL, 6 Bytes (zählen 2 Tabs)
Das Programm startet an Speicherplatz 0 und schreibt dann 0 in Speicherplatz 0, wodurch es sich selbst löscht. Die Maschine stoppt automatisch.
Dies ist die Assemblersprache für Donald Knuths hypothetischen MIX-Computer, der mit dem GNU MIX Development Kit ( https://www.gnu.org/software/mdk/ ) zusammengestellt und ausgeführt werden kann .
quelle
> <> ,
403430 ByteProbieren Sie es hier aus!
Erläuterung:
Grundsätzlich werden 3 Zeichenblöcke wie folgt im Stapel abgelegt: (ypos, xpos, ASCII-Zeichen), die am Ende umgekehrt werden, sodass der endgültige Befehl 'p' (character, xpos, ypos) lautet und diese Position in der Zeile festlegt Code für dieses Zeichen. Das erste Zeichen wird manuell als '<' festgelegt, sodass der Code am Ende als '> p <' endet, um den Befehl zu wiederholen. Dann wird jedes andere Zeichen als '' einschließlich des Zeichens p überschrieben. Das '' ist eigentlich "ASCII CHAR 0", was KEINE NOP ist und beim Lesen einen Fehler ausgibt.
Außerdem muss vor dem Befehl 'p' eine ungerade (?) Anzahl von Zeichen stehen, sonst wird der Befehl nicht in eine letzte Schleife zurückgeschleift und überschrieben.
quelle
Batch, 11 Bytes
Ändert den Quellcode in
ECHO is on.
Das
@
ist da, damit der Befehl nicht wiederholt wird, aber meistens, damit die beidenecho
nicht in einer Reihe stehen.quelle
@
kann entfernt werden, weilECHO
(Großbuchstaben)! =echo
(Kleinbuchstaben)echo
können sich nicht aneinanderreihen .Jolf, 4 Bytes, nicht konkurrierend
Dies
₯S
setzt den₯C
Wert des ode-Elements in den Eingang,undefined
da keiner angegeben ist. Probieren Sie es hier aus!quelle
(Dateisystem) Befunge 98, 46 Bytes
Beachten Sie, dass dieses Programm eine Datei mit dem Namen erstellt und bearbeitet
a
. Wie es funktioniert:a
mit dem Namen erstellt, die den gesamten Code enthält (maximal 256 Zeichen in jeder Dimension) und um eine Stelle nach oben und zwei Stellen nach links verschoben.a
als eine Zeile bezeichnete Datei und ersetzt die gesamte erste Zeile durch den Inhalt dera
Datei.a
Datei in die zweite Zeile eingelesen wird, hat sich zwei Stellen nach rechts verschoben.Als Nebeneffekt ist der endende Quellcode nicht einmal gültig Befunge! (weil es Zeilenumbrüche als Daten in einer einzelnen Zeile enthält)
quelle
Python 2, 238 Bytes + 20% = 285,6
Im Grunde wechselt dies die aktuelle Dateicodierung der Python-Quelle zwischen
ascii
undutf-8
ändert somit im Wesentlichen jedes Zeichen der Quelle!quelle
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.