mbomb007 hat uns gebeten, ein selbstverstümmelndes Programm zu machen . Es ist eine interessante Herausforderung, aber ich persönlich möchte meine Programme nicht dazu ermutigen, sich selbst zu verstümmeln. Ich denke gerne, dass im Zentrum eines jeden Programms ein wunderschöner Schmetterling steht, der darauf wartet, auszubrechen.
Daher fordere ich Stack Exchange bei meiner allerersten Code Golf-Herausforderung auf, einen Schmetterling zu verwandeln. Ihr Programm sollte seinen eigenen Code als Eingabe und Ausgabe akzeptieren, I am a caterpillar!
gefolgt vom Code für ein anderes Programm in derselben Sprache (Sie können einen Teiler zwischen den Ausgaben setzen oder nicht ... aber wir sprechen von Schmetterlingen, also zählt die Hübschheit!). Dieses zweite Programm sollte ausgegeben werdenI am a beautiful butterfly!
Metamorphose: Dieses Programm sollte sich selbst modifizieren, weshalb es selbst als Eingabe übergeben wird. Ich möchte kein langweiliges verschachteltes Programm, das nichts anderes ist als eine print-Anweisung, I am a caterpillar!
gefolgt vom Drucken des Quellcodes. Sie müssen den Code selbst metamorphen, sodass die langweiligste akzeptable Antwort eine ist, die gedruckt wird I am a caterpillar
, dann eine Zeichenfolge aus der Eingabe (die zufällig Code ist) herausreißt und diese ausgibt. Natürlich ist dies eine sehr knifflige kleine Anforderung, die als "Geist der Herausforderung" betrachtet werden sollte. Die formale Anforderung wird festgelegt auf "Wenn Ihrem Programm eine zufällige Zeichenfolge mit der gleichen Länge wie Ihr Programm zugewiesen wird, sollte I am a butterfly
beim Ausführen des zweiten Programms eine Wahrscheinlichkeit von weniger als 5% für das Drucken bestehen ."
Zusammenfassung:
- Schreiben Sie ein Programm, das, wenn ein eigener Code als Eingabe bereitgestellt wird,
I am a caterpillar!
gefolgt von einem Quellcode-Block (mit einem Trennzeichen dazwischen oder nicht) druckt . - Dieser zweite Quellcodeblock wird gedruckt, wenn er in derselben Sprache kompiliert / interpretiert wird
I am a beautiful butterfly!
- Wenn Ihr Programm keinen eigenen Quellcode als Eingabe erhält und stattdessen eine zufällige Zeichenfolge erhält, die nicht mit seinem eigenen Code übereinstimmt, kann das Ergebnis entweder nicht kompiliert / interpretiert werden oder es wird nicht
I am a butterfly!
für mindestens 95% des Zufalls gedruckt strings (spirit: Es wird erwartet, dass Sie Ihren eigenen Quellcode aus der Eingabe lesen und zu einem Schmetterling zusammenfügen).- Ich bin damit einverstanden, dass Sie dies nicht beweisen, solange Sie an der Idee der Metamorphose festhalten und Ihren eigenen Code modifizieren. Wenn Sie jedoch versuchen, Lückenspiele zu spielen, um mit Ihren Eingaben umzugehen, sollten Sie dies erwarten es zu beweisen.
- Es gelten Standardlücken
Ich möchte, dass diese nach ihrer Schönheit beurteilt werden, aber das ist ein entschieden nicht quantitativer Ansatz, so dass die übliche "Anzahl von Bytes" -Route zur Beurteilung verwendet werden kann
Bonus : -20% - Wählen Sie eine beliebige 3-Buchstaben-Zeichenfolge, die nicht mit den ersten 3 Buchstaben Ihres Programms übereinstimmt. Wenn ich das Raupenprogramm ausführe, aber die Eingabe so ändere, dass die ersten 3 Zeichen in die angegebenen Zeichen geändert werden, drucken Sie I am Batman!
stattdessen. Sei immer Batman. ( Für diese ... Metamorphose gelten die gleichen zufälligen Zeichenkettenregeln! )
Triviales Beispiel (Python):
"""
print "I am a beautiful butterfly!"
#print "I am Batman!"
"""
import sys
code = sys.stdin.read()
if code.startswith("YYZ"):
# swap the comments between the print statements
code = code.replace("#print", "_a").replace("print", "#print").replace("_a", "print")
code = [3:] # remove """ or XYZ
code = code.split('"""')[0]
print "I am a caterpillar!"
print code
quelle
Antworten:
Befunge-98, 602 Bytes
In PyFunge getestet.
Wenn mit einer Zeichenfolge ausgeführt wird, die nicht mit 2 Leerzeichen beginnt (Wahrscheinlichkeit deutlich über 95% bei Zufall), wird nichts ausgegeben. Dies ist nicht genau das, wonach das OP sucht, aber es entspricht der Spezifikation.
Wenn ein String übergeben wird, der mit 2 Leerzeichen beginnt (wie er selbst), wird Folgendes ausgegeben:
Der untere Teil davon gibt wiederum aus:
quelle
PHP, 74 Bytes
<?=
ist gleichbedeutend mit<?php echo
und kann mehrere durch Kommas getrennte Werte zur Ausgabe annehmen¶ßž’ßžß
undšžŠ‹–™Š“ߊ‹‹š™“†Þ
sind in PHP gültige Konstantennamen, werden jedoch als String-Literal behandelt, da die Konstanten nicht existieren.~
invertiert sie in"I am a "
und"beautiful butterfly!"
(speichert ein Byte für jeweils ein Anführungszeichen)strtr
ersetzt "Raupe!" mit "einem schönen Schmetterling!" im Streitquelle
Pyth,
5046 BytesErläuterung
Der resultierende Quellcode ist
Welches druckt im Grunde den Text.
quelle
Perl 6,
6056 BytesBenötigt -p, um richtig zu laufen; Ich habe dies in der Byteanzahl berücksichtigt. Leider ist einer der Nachteile von Perl 6, dass die Syntax jetzt viel strenger ist ...
quelle
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(Ich gehe davon aus, dass Perl 6 Barewords wie Perl 5 erlaubtno strict 'subs'
unds///
Variablen auf der LHS interpoliert.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
ist kürzer und wird sicherlich in Perl 6Netzhaut, 53 Bytes
Druckt aus:
Beachten Sie, dass es zwischen
I am a caterpillar!
und dem neuen Programm kein Trennzeichen gibt . Das neue Programm erwartet keine Eingabe.quelle
bash
/awk
/cksum
-179,2169,6168 BytesDemo:
Ich hoffe, dass die 20% für alle Zeichenfolgen gelten, die mit "" beginnen
xyz
, ansonsten beträgt die ursprüngliche Anzahl224212210 Byte (das"I am Batman!"
Teil wurde korrigiert ).Transformation erledigt: Ersetzt das einzige Vorkommen des Literal
!NF
durch10
, so dass" butterfly"
es auch mit dem gedruckt wirdprintf
.Führt einen einfachen
cksum
Teil (dh den Rest) des Quellcodes aus, daher auch dessen Anforderung.Einschränkung: Erste Eingabe muss mit endenKeine Einschränkung, um falsche Eingaben zu unterdrücken ...'
.Es wird keine zweite Eingabe erwartet.
quelle
Python - 184 Bytes -20% für Bonus = 147,2
I am batman
Ersetzen Sie zum Drucken die ersten drei Anführungszeichen in der Eingabe durch einfache Anführungszeichen. (Die erste Zeile ist'''"""
)quelle