Métamorphose du code source


29

mbomb007 nous a demandé de faire un programme d'auto-mutilation . C'est un défi intéressant, mais personnellement, je n'aime pas encourager mes programmes à s'automutiler. J'aime à penser que, au cœur de chaque programme, un beau papillon attend pour éclater.

En tant que tel, pour mon tout premier défi Code Golf, je mets au défi Stack Exchange de métamorphoser un papillon. Votre programme doit accepter son propre code en entrée et en sortie, I am a caterpillar!suivi du code d'un autre programme dans la même langue (vous pouvez mettre un séparateur entre les sorties ou non ... mais nous parlons de papillons, donc la beauté compte!). Ce deuxième programme devrait sortirI am a beautiful butterfly!

Métamorphose: ce programme devrait se modifier lui-même, c'est pourquoi il est lui-même passé en entrée. Je ne veux pas d'un programme imbriqué ennuyeux qui n'est rien d'autre qu'une instruction d'impression I am a caterpillar!suivie de l'impression du code source. Vous devez métamorphoser le code lui-même, donc la réponse acceptable la plus ennuyeuse est celle qui imprime I am a caterpillar, puis déchire une chaîne de l'entrée (qui se trouve être du code) et l'imprime. Bien sûr, il s'agit d'une petite exigence très délicate à écrire, donc cela devrait être considéré comme un "esprit du défi". L'exigence formelle va être définie à "Si votre programme reçoit une chaîne aléatoire de la même longueur que votre programme, il devrait y avoir moins de 5% de chances d'imprimer I am a butterflylorsque le deuxième programme est exécuté."

Sommaire:

  • Écrivez un programme qui, lorsqu'il est fourni son propre code en entrée, imprime I am a caterpillar!suivi d'un bloc de code source (avec un délimiteur entre eux ou non).
  • Ce deuxième bloc de code source, une fois compilé / interprété comme le même langage, imprime I am a beautiful butterfly!
  • Si votre programme ne reçoit pas son propre code source en entrée et reçoit à la place une chaîne aléatoire de caractères qui ne correspond pas à son propre code, le résultat doit soit échouer à compiler / interpréter, soit ne pas imprimer I am a butterfly!pour au moins 95% de aléatoire chaînes (esprit: vous êtes censé lire votre propre code source à partir de l'entrée et l'assembler en un papillon).
    • Je suis à l'aise avec le fait que vous ne prouviez pas cela, tant que vous vous en tenez à l'esprit de l'idée de métamorphose, en modifiant votre propre code, mais si vous essayez de jouer à des jeux d'échappatoires pour contourner l'utilisation de vos entrées, attendez-vous à avoir pour le prouver.
  • Des échappatoires standard s'appliquent

Je voudrais que ceux-ci soient jugés par leur beauté, mais c'est une approche résolument non quantitative, donc la route habituelle du "nombre d'octets" peut être utilisée pour juger

Bonus : -20% - choisissez une chaîne de 3 lettres qui ne correspond pas aux 3 premières lettres de votre programme. Si j'exécute le programme Caterpillar, mais que je modifie l'entrée de sorte que les 3 premiers caractères soient remplacés par les caractères spécifiés, imprimez I am Batman!plutôt. Soyez toujours Batman. (Les mêmes règles de chaîne aléatoire s'appliquent pour cette ... métamorphose! )

Exemple trivial (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

Remarque: j'adorerais voir des programmes d'art ascii où il ressemble à une chenille la première fois et se transforme en papillon ascii la phase suivante, mais c'est un peu plus avancé que le défi ne doit l'être.
Cort Ammon - Rétablir Monica

Que devons-nous faire si un programme a plusieurs fichiers?
TheNumberOne

@TheNumberOne Je suis curieux de savoir ce que vous avez prévu là-bas! Je ne sais pas si je veux abattre les règles pour cela tout de suite, sans en voir les conséquences, mais il me semble que si vous acceptiez un ensemble de fichiers en plusieurs parties en entrée (plutôt qu'un seul fichier contenu), et vous deviez produire un ensemble de sorties en plusieurs parties (plutôt qu'une seule sortie), avec un séparateur à moitié raisonnable entre les fichiers, je pense que cela devrait être une solution raisonnable. Si cela ne fonctionne pas pour vous, j'ai peut-être besoin de plus d'informations sur la solution que vous proposez pour mieux élaborer une règle.
Cort Ammon - Rétablir Monica

@TheNumberOne Et merci pour la capture de faute de frappe. Cette faute de frappe n'était clairement pas un beau papillon!
Cort Ammon - Rétablir Monica

Réponses:


63

Befunge-98, 602 octets

                                        "^@<"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\

Testé dans PyFunge.

Lorsqu'il est exécuté avec une chaîne ne commençant pas par 2 espaces (probabilité bien supérieure à 95% lorsqu'il est aléatoire), rien ne sort. Ce n'est pas exactement ce que l'OP recherche, mais correspond aux spécifications.

Lorsqu'elle est passée, une chaîne commençant par 2 espaces (comme elle-même) génère ceci:

I am a caterpillar!

---

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

À son tour, la partie inférieure génère:

I am a beautiful butterfly!

2
Sensationnel. Ceci est incroyable.
un spaghetto du

3
Je savais que quelqu'un voudrait pousser les règles comme vous l'avez fait; Je suis content que quelque chose de beau en soit sorti =)
Cort Ammon - Rétablir Monica

La chenille et le papillon semblent être coincés dans la matrice. Beau!
Erno

où puis-je exécuter cela?
user1514631

3
Je ne comprendrai jamais comment vous, bons amis de Code Golf, parvenez à créer de si belles monstruosités.
Chris Cirefice

19

PHP, 74 octets

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=est équivalent <?php echoet peut prendre plusieurs valeurs séparées par des virgules pour sortir
  • ¶ßž’ßžßet šžŠ‹–™Š“ߊ‹‹š™“†Þsont des noms de constantes valides en PHP, mais comme les constantes n'existent pas, elles sont traitées comme des chaînes de caractères. ~les inverse "I am a "et "beautiful butterfly!"(enregistre un octet pour un guillemet chacun)
  • strtrremplace "chenille!" avec "un beau papillon!" dans l'argument

2
Voulez-vous fournir une explication?
Timwi

@Timwi aucun problème, explication ajoutée
Fabian Schmengler

Je m'attendais vraiment à ce que quelqu'un code le "beau papillon" avec quelque chose comme ROT13, mais l'idée de le faire correspondre avec la technique littérale des chaînes de PHP est, selon les mots de Kaylee, brillante!
Cort Ammon - Rétablir Monica

7

Pyth, 50 46 octets

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

Explication

"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

Le code source résultant est

"I am a beautiful butterfly!

Qui imprime essentiellement le texte.


6

Perl 6, 60 56 octets

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

Nécessite -p pour fonctionner correctement; Je l'ai expliqué dans le nombre d'octets. Malheureusement, l'un des inconvénients de Perl 6 est que la syntaxe est beaucoup plus stricte maintenant ...


Les chenilles sont vulnérables lors de la métamorphose. C'est pourquoi ils aiment s'envelopper dans les variables c̶o̶c̶o̶o̶n̶s̶: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(je suppose que Perl 6 autorise les mots nus comme Perl 5 avec no strict 'subs'et s///interpole les variables sur le LHS.)
ThisSuitIsBlackNot

C'est drôle. J'ai essayé cela et pour une raison quelconque, quand j'ai fait le wc, cela m'a donné la même quantité d'octets. Mais en le tapant à nouveau, cela m'a donné moins d'octets. Étrange.
un spaghetto du

Oh attendez, je me souviens pourquoi je ne l'ai pas fait. Lorsque vous exécutez le nouveau code, il génère une erreur en raison de l'espace entre beau et papillon.
un spaghetto du

Ah, je n'ai jamais utilisé Perl 6, je ne peux donc pas vous y aider. Je voulais vraiment juste une excuse pour faire une remarque pleine d'esprit. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/est plus court et fonctionnera certainement en Perl 6.
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot Cela correspond au défi. Les règles étaient juste là pour vous assurer de lire et de modifier votre code. Au final, le véritable esprit essaie de laisser le beau papillon au coeur du code se libérer. La beauté, bien sûr, est dans l'œil du spectateur. Nous trouverons chacun des solutions différentes plus ou moins belles les unes que les autres. En ce qui concerne les solutions dans PERL, eh bien ... disons simplement que PERL a sa propre définition particulière de beau, et qu'il convient très bien à ses objectifs ;-)
Cort Ammon - Rétablir Monica

4

Rétine, 53 octets

caterpillar
beautiful butterfly
^
I am a caterpillar!

Imprime:

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

Notez qu'il n'y a pas de séparateur entre I am a caterpillar! et le nouveau programme. Le nouveau programme n'attend aucune entrée.


3

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

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}'

Démo:

$ 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

J'espère que le 20% s'applique à toute chaîne commençant par xyz, sinon le nombre d'origine est de 224 212 210 octets (correction de la "I am Batman!"partie).

Transformation effectuée: remplace la seule occurrence du littéral !NFpar 10, de sorte qu'elle " butterfly"est également imprimée à l'aide duprintf .

Effectue un simple cksumsur une partie (c'est-à-dire le reste) du code source, d'où son exigence également.

Attention: la première entrée doit se terminer par '. Pas tant une mise en garde que de supprimer la mauvaise entrée ...

Aucune deuxième entrée n'est attendue.


1
WHOA. J'attendais la personne awk, et c'est tout. C'est plutôt cool.
2015

@jrg merci pour les encouragements. :)
hjk

1

Python - 184 octets -20% pour le 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";'''

Pour imprimer I am batman, remplacez les trois premiers guillemets doubles par des guillemets simples dans l'entrée. (La première ligne est '''""")

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.