Metamorfosis del código fuente

29

mbomb007 nos pidió que hiciéramos un programa de mutilación automática . Es un desafío interesante, pero personalmente no me gusta alentar a mis programas a que se auto mutilen. Me gusta pensar que, en el corazón de cada programa, hay una hermosa mariposa esperando a salir.

Como tal, para mi primer desafío de Code Golf, desafío a Stack Exchange a metamorfosear una mariposa. Su programa debe aceptar su propio código como entrada y salida I am a caterpillar!seguido del código para otro programa en el mismo idioma (puede poner un divisor entre las salidas o no ... pero estamos hablando de mariposas, ¡así que la belleza cuenta!). Este segundo programa debería generarI am a beautiful butterfly!

Metamorfosis: este programa debe modificarse a sí mismo, por lo que se pasa como entrada. No quiero un programa anidado aburrido que no sea más que una declaración de impresión I am a caterpillar!seguida de imprimir el código fuente. Debe metamorfear el código en sí mismo, por lo que la respuesta aceptable más aburrida es la que imprime I am a caterpillar, luego extrae una cadena de la entrada (que resulta ser el código) y la imprime. Por supuesto, este es un pequeño requisito muy difícil de escribir, por lo que debe considerarse como un "espíritu del desafío". El requisito formal se establecerá en "Si su programa recibe una cadena aleatoria de la misma longitud que su programa, debería haber menos de un 5% de posibilidades de impresión I am a butterflycuando se ejecuta el segundo programa".

Resumen:

  • Escriba un programa que, cuando se proporciona su propio código como entrada, imprime I am a caterpillar!seguido de un bloque de código fuente (con un delimitador entre ellos o no).
  • Este segundo bloque de código fuente, cuando se compila / interpreta como el mismo idioma, imprime I am a beautiful butterfly!
  • Si su programa no recibe su propio código fuente como entrada, y en su lugar se le asigna una cadena aleatoria de caracteres que no coincide con su propio código, el resultado debe fallar al compilar / interpretar, o no imprimir I am a butterfly!al menos el 95% del azar cadenas (espíritu: se espera que lea su propio código fuente de la entrada y lo una en una mariposa).
    • Me siento cómodo con que no demuestres esto, siempre y cuando mantengas el espíritu de la idea de la metamorfosis, modificando tu propio código, pero si estás tratando de jugar juegos de lagunas para evitar el uso de tus entradas, espera tener probarlo.
  • Se aplican lagunas estándar

Me gustaría que estos sean juzgados por su belleza, pero ese es un enfoque decididamente no cuantitativo, por lo que la ruta habitual de "número de bytes" se puede utilizar para juzgar

Bonificación : -20%: elige cualquier cadena de 3 letras que no coincida con las primeras 3 letras de tu programa. Si ejecuto el programa Caterpillar, pero modifico la entrada para que los primeros 3 caracteres se cambien a los especificados, imprima en su I am Batman!lugar. Siempre sé Batman. ( Se aplican las reglas cadena aleatoria mismas para esta metamorfosis ...! )

Ejemplo 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
Cort Ammon - Restablece a Monica
fuente
Como nota: me encantaría ver programas de arte ascii donde parezca una oruga la primera vez, y se convierta en una mariposa ascii la próxima fase, pero eso es un poco más avanzado de lo que el desafío debe ser.
Cort Ammon - Restablece a Monica el
¿Qué debemos hacer si un programa tiene varios archivos?
TheNumberOne
@TheNumberOne ¡Tengo curiosidad por lo que has planeado allí! No sé si quiero vencer las reglas para eso de inmediato, sin ver las consecuencias, pero me parece que si aceptaras un conjunto de archivos de varias partes como entrada (en lugar de un solo archivo contenido), y si tuviera que generar un conjunto de salidas de varias partes (en lugar de una única salida), con un delineador medio razonable entre los archivos, creo que debería ser una solución razonable. Si eso no funciona para usted, es posible que necesite más información sobre su solución propuesta para elaborar mejor una regla.
Cort Ammon - Restablece a Monica el
@TheNumberOne Y gracias por el error tipográfico. ¡Ese error tipográfico claramente no era una hermosa mariposa!
Cort Ammon - Restablece a Monica el

Respuestas:

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\

Probado en PyFunge.

Cuando se ejecuta con una cadena que no comienza con 2 espacios (probabilidad muy superior al 95% cuando es aleatorio) no genera nada. Esto no es exactamente lo que busca el OP, pero se ajusta a la especificación.

Cuando se pasa una cadena que comienza con 2 espacios (como sí misma) genera esto:

I am a caterpillar!

---

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

La parte inferior de eso, a su vez, produce:

I am a beautiful butterfly!
PurkkaKoodari
fuente
2
Guau. Esto es increíble.
un spaghetto
3
Sabía que alguien querría imponer las reglas igual que tú; Me alegro de que haya salido algo hermoso =)
Cort Ammon - Reinstalar a Monica el
Tanto la oruga como la mariposa parecen estar atrapadas en la Matriz. ¡Hermosa!
Erno
¿Dónde puedo ejecutar esto?
user1514631
3
Nunca entenderé cómo ustedes, la buena gente de Code Golf, logran crear monstruosidades tan hermosas.
Chris Cirefice
19

PHP, 74 bytes

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=es equivalente <?php echoy puede tomar varios valores separados por comas para generar
  • ¶ßž’ßžßy šžŠ‹–™Š“ߊ‹‹š™“†Þson nombres constantes válidos en PHP, pero debido a que las constantes no existen se tratan como cadenas literales. ~los invierte "I am a "y "beautiful butterfly!"(guardando un byte para una comilla cada uno)
  • strtrreemplaza "oruga!" con "una hermosa mariposa!" en el argumento
Fabian Schmengler
fuente
2
¿Te importaría dar una explicación?
Timwi
@Timwi no hay problema, explicación agregada
Fabian Schmengler
Esperaba que alguien codificara "mariposa hermosa" con algo como ROT13, pero la idea de combinarla con la técnica literal de cadena de PHP es, en palabras de Kaylee, ¡brillante!
Cort Ammon - Restablece a Monica el
7

Pyth, 50 46 bytes

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

Explicación

"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

El código fuente resultante es

"I am a beautiful butterfly!

Que básicamente imprime el texto.

PurkkaKoodari
fuente
6

Perl 6, 60 56 bytes

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

Requiere -p para ejecutarse correctamente; He contabilizado esto en el recuento de bytes. Lamentablemente, uno de los inconvenientes de Perl 6 es que la sintaxis es mucho más estricta ahora ...

un espagueti
fuente
Las orugas son vulnerables durante la metamorfosis. Es por eso que les gusta se envuelven en las variables de capullos: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Estoy asumiendo que Perl 6 permite barewords como Perl 5 con no strict 'subs'y s///variables que interpola en los LHS.)
ThisSuitIsBlackNot
Huh, eso es gracioso. Lo intenté y por alguna razón cuando lo hice me dio la misma cantidad de bytes. Pero al escribirlo nuevamente me dio menos bytes. Extraño.
un spaghetto
Oh, espera, no importa, recuerdo por qué no lo hice. Cuando ejecuta el nuevo código, arroja un error debido al espacio entre beautiful y butterfly.
un spaghetto
Ah, nunca he usado Perl 6, así que no puedo ayudarte allí. Realmente solo quería una excusa para hacer un comentario ingenioso. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/es más corto y seguramente funcionará en Perl 6.
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot Se ajusta al desafío. Las reglas solo estaban allí para asegurarse de que realmente lea y modifique su código. Al final, el verdadero espíritu está tratando de dejar que la hermosa mariposa en el corazón del código se libere. La belleza, por supuesto, está en el ojo del espectador. Cada uno encontraremos diferentes soluciones más o menos hermosas que otras. En cuanto a las soluciones en PERL, bueno ... digamos que PERL tiene su propia definición peculiar de bello, y se adapta perfectamente a sus propósitos ;-)
Cort Ammon - Reinstala a Monica el
4

Retina, 53 bytes

caterpillar
beautiful butterfly
^
I am a caterpillar!

Imprime:

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

Observe que no hay separador entre I am a caterpillar! y el nuevo programa. El nuevo programa no espera ninguna entrada.

El numero uno
fuente
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}'

Manifestación:

$ 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

Espero que el 20% se aplique a cualquier cadena que comience xyz, de lo contrario, el recuento original es 224 212 210 bytes (reparó la "I am Batman!"parte).

Transformación hecho: reemplaza la única ocurrencia de lo literal !NFcon 10, por lo que " butterfly"es también imprimirse mediante losprintf .

Realiza un simple cksumen una parte (es decir, el resto) del código fuente, de ahí su requisito también.

Advertencia: la primera entrada debe terminar con '. No es tanto una advertencia como para suprimir la entrada incorrecta ...

No se espera una segunda entrada.

hjk
fuente
1
WHOA. Estaba esperando a la persona awk, y eso es todo. Eso es muy bonito.
jrg
@jrg gracias por el aliento. :)
hjk
1

Python - 184 bytes -20% para bonificación = 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";'''

Para imprimir I am batman, reemplace las tres primeras comillas dobles con comillas simples en la entrada. (La primera línea es '''""")

pppery
fuente