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 butterfly
lorsque 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
la source
Réponses:
Befunge-98, 602 octets
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:
À son tour, la partie inférieure génère:
la source
PHP, 74 octets
<?=
est équivalent<?php echo
et 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)strtr
remplace "chenille!" avec "un beau papillon!" dans l'argumentla source
Pyth,
5046 octetsExplication
Le code source résultant est
Qui imprime essentiellement le texte.
la source
Perl 6,
6056 octetsNé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 ...
la source
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(je suppose que Perl 6 autorise les mots nus comme Perl 5 avecno strict 'subs'
ets///
interpole les variables sur le LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
est plus court et fonctionnera certainement en Perl 6.Rétine, 53 octets
Imprime:
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.la source
bash
/awk
/cksum
-179,2169,6168 octetsDémo:
J'espère que le 20% s'applique à toute chaîne commençant par
xyz
, sinon le nombre d'origine est de224212210 octets (correction de la"I am Batman!"
partie).Transformation effectuée: remplace la seule occurrence du littéral
!NF
par10
, de sorte qu'elle" butterfly"
est également imprimée à l'aide duprintf
.Effectue un simple
cksum
sur une partie (c'est-à-dire le reste) du code source, d'où son exigence également.Attention: la première entrée doit se terminer parPas tant une mise en garde que de supprimer la mauvaise entrée ...'
.Aucune deuxième entrée n'est attendue.
la source
Python - 184 octets -20% pour le bonus = 147,2
Pour imprimer
I am batman
, remplacez les trois premiers guillemets doubles par des guillemets simples dans l'entrée. (La première ligne est'''"""
)la source