Quellcode-Metamorphose


29

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 butterflybeim 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

Als Anmerkung: Ich würde gerne ASCII-Kunstprogramme sehen, in denen es zum ersten Mal wie eine Raupe aussieht und in der nächsten Phase in einen ASCII-Schmetterling verwandelt wird, aber das ist etwas weiter fortgeschritten als die Herausforderung sein muss.
Cort Ammon - Reinstate Monica

Was tun, wenn ein Programm mehrere Dateien enthält?
TheNumberOne

@TheNumberOne Ich bin gespannt was du da geplant hast! Ich weiß nicht, ob ich die Regeln dafür sofort niederschlagen möchte, ohne die Konsequenzen zu sehen, aber es scheint mir, als ob Sie einen mehrteiligen Satz von Dateien als Eingabe akzeptieren würden (und nicht nur eine einzelne Datei) Inhalt), und Sie sollten einen mehrteiligen Satz von Ausgaben (anstatt einer einzelnen Ausgabe) mit einem halbwegs vernünftigen Trennzeichen zwischen den Dateien ausgeben. Ich denke, das sollte eine vernünftige Lösung sein. Wenn das bei Ihnen nicht funktioniert, benötige ich möglicherweise mehr Einblick in Ihre vorgeschlagene Lösung, um eine Regel besser zu erstellen.
Cort Ammon - Reinstate Monica

@TheNumberOne Und danke für den Tippfehler. Dieser Tippfehler war ganz klar kein schöner Schmetterling!
Cort Ammon - Reinstate Monica

Antworten:


63

Befunge-98, 602 Bytes

                                        "^@<"v@@
                                     "'I'"00v>00g::
                                   "@v"0v@@@>g::a">#"
                                 "a">v@@>      0g::'"1>                                 /
                             ":\"'"v@>            'm'"00g:a                       >"@v$"
 "lufituaeb"'"'v00ga"@v\"'":'b\00v@>                :'a\":*84>"00ga"\>@@@@_,#:>"00g:a'<'"
"et"'"'va'v'":'l\00g5k:'""y!">>v@>                    g::'''""ut"'"'>a'<'""fr"'"00g3k:'">
 "ma"00g>'I~48*-~48*-+#@_>:#,_@>                        '"aa"---"aa"!rallipretac"00g:'a\

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:

I am a caterpillar!

---

"!y"       "l"v
v"te"     "rf"<
>"tu"'   "b"\v@
 v"beautiful"<
  >:#,_@@@@>\
 >48*:"a"\:$v@
  "ma"   v@#>
   'I'   <@^

Der untere Teil davon gibt wiederum aus:

I am a beautiful butterfly!

2
Wow. Das ist großartig.
ein Spaghetto

3
Ich wusste, dass jemand die Regeln genau wie Sie durchsetzen möchte. Ich bin froh, dass etwas Schönes dabei herausgekommen ist =)
Cort Ammon - Reinstate Monica

Sowohl die Raupe als auch der Schmetterling sehen aus, als ob sie in der Matrix stecken. Schön!
Erno

Wo kann ich das laufen lassen?
user1514631

3
Ich werde nie verstehen, wie Ihr guten Leute bei Code Golf es schafft, so schöne Monstrositäten zu erschaffen.
Chris Cirefice

19

PHP, 74 Bytes

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=ist gleichbedeutend mit <?php echound 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)
  • strtrersetzt "Raupe!" mit "einem schönen Schmetterling!" im Streit

2
Möchtest du eine Erklärung abgeben?
Timwi

@ Timwi kein Problem, Erklärung hinzugefügt
Fabian Schmengler

Ich habe voll und ganz damit gerechnet, dass jemand "schönen Schmetterling" mit so etwas wie ROT13 codiert, aber die Idee, ihn mit der String-Literal-Technik von PHP abzugleichen, ist in den Worten von Kaylee glänzend!
Cort Ammon - Reinstate Monica

7

Pyth, 50 46 Bytes

"I am a caterpillar!"+<z8"beautiful butterfly!

Erläuterung

"I am a caterpillar!"        print "I am a caterpillar!"
 z<8                         first 8 chars of input
+   "beautiful butterfly!    add "beautiful butterfly!" to that and print

Der resultierende Quellcode ist

"I am a beautiful butterfly!

Welches druckt im Grunde den Text.


6

Perl 6, 60 56 Bytes

say "I am a caterpillar!"; s/\S+\!/beautiful butterfly!/

Benö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 ...


Raupen sind während der Metamorphose anfällig. Deshalb wickeln sie sich gerne in Variablen ein: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Ich gehe davon aus, dass Perl 6 Barewords wie Perl 5 erlaubt no strict 'subs'und s///Variablen auf der LHS interpoliert.)
ThisSuitIsBlackNot

Huh, das ist lustig. Ich habe das versucht und aus irgendeinem Grund, als ich es tat, gab es mir die gleiche Menge an Bytes. Aber als ich es wieder abtippte, gab es mir weniger Bytes. Seltsam.
ein Spaghetto

Oh, warte, egal, ich erinnere mich, warum ich es nicht getan habe. Wenn der neue Code ausgeführt wird, wird aufgrund des Abstands zwischen beautiful und butterfly ein Fehler ausgegeben.
ein Spaghetto

Ah, ich habe Perl 6 noch nie benutzt, kann Ihnen also dort nicht weiterhelfen. Ich wollte wirklich nur eine Ausrede, um eine witzige Bemerkung zu machen. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/ist kürzer und wird sicherlich in Perl 6
funktionieren

1
@ThisSuitIsBlackNot Es passt zur Herausforderung. Die Regeln waren nur da, um sicherzustellen, dass Sie Ihren Code tatsächlich lesen und ändern. Am Ende versucht der wahre Geist, den schönen Schmetterling im Herzen des Codes loszulassen. Schönheit liegt natürlich im Auge des Betrachters. Wir werden unterschiedliche Lösungen finden, die mehr oder weniger schön sind als andere. Was die Lösungen in PERL betrifft, sagen wir einfach, dass PERL eine eigene Definition von schön hat und für seine Zwecke gut geeignet ist ;-)
Cort Ammon - Reinstate Monica

4

Netzhaut, 53 Bytes

caterpillar
beautiful butterfly
^
I am a caterpillar!

Druckt aus:

I am a caterpillar!beautiful butterfly
beautiful butterfly
^
I am a beautiful butterfly!

Beachten Sie, dass es zwischen I am a caterpillar! und dem neuen Programm kein Trennzeichen gibt . Das neue Programm erwartet keine Eingabe.


3

bash/ awk/ cksum- 179,2 169,6 168 Bytes

awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'

Demo:

$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am a caterpillar!
echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
$ echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
I am a beautiful butterfly!

# Batman!
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> xyzawk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am Batman!

# Invalid input
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0{'
> E

Ich hoffe, dass die 20% für alle Zeichenfolgen gelten, die mit "" beginnen xyz, ansonsten beträgt die ursprüngliche Anzahl 224 212 210 Byte (das "I am Batman!"Teil wurde korrigiert ).

Transformation erledigt: Ersetzt das einzige Vorkommen des Literal !NFdurch 10, so dass " butterfly"es auch mit dem gedruckt wirdprintf .

Führt einen einfachen cksumTeil (dh den Rest) des Quellcodes aus, daher auch dessen Anforderung.

Einschränkung: Erste Eingabe muss mit enden '. Keine Einschränkung, um falsche Eingaben zu unterdrücken ...

Es wird keine zweite Eingabe erwartet.


1
WHOA. Ich habe auf die awk Person gewartet, und das war's. Das ist ziemlich cool.
jrg

@jrg danke für die ermutigung. :)
hjk

1

Python - 184 Bytes -20% für Bonus = 147,2

""""""
import sys;c=sys.stdin.read();print"I am a caterpillar!";x=c[3:] if"\'''"!=c[:3] else c
print x+c[:3]
""";print"I am a beautiful butterfly!" """
''';print"I am Batman";'''

I am batmanErsetzen Sie zum Drucken die ersten drei Anführungszeichen in der Eingabe durch einfache Anführungszeichen. (Die erste Zeile ist '''""")

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.