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 butterfly
cuando 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
fuente
Respuestas:
Befunge-98, 602 bytes
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:
La parte inferior de eso, a su vez, produce:
fuente
PHP, 74 bytes
<?=
es equivalente<?php echo
y 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)strtr
reemplaza "oruga!" con "una hermosa mariposa!" en el argumentofuente
Pyth,
5046 bytesExplicación
El código fuente resultante es
Que básicamente imprime el texto.
fuente
Perl 6,
6056 bytesRequiere -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 ...
fuente
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(Estoy asumiendo que Perl 6 permite barewords como Perl 5 conno strict 'subs'
ys///
variables que interpola en los LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
es más corto y seguramente funcionará en Perl 6.Retina, 53 bytes
Imprime:
Observe que no hay separador entre
I am a caterpillar!
y el nuevo programa. El nuevo programa no espera ninguna entrada.fuente
bash
/awk
/cksum
-179,2169,6168 bytesManifestación:
Espero que el 20% se aplique a cualquier cadena que comience
xyz
, de lo contrario, el recuento original es224212210 bytes (reparó la"I am Batman!"
parte).Transformación hecho: reemplaza la única ocurrencia de lo literal
!NF
con10
, por lo que" butterfly"
es también imprimirse mediante losprintf
.Realiza un simple
cksum
en una parte (es decir, el resto) del código fuente, de ahí su requisito también.Advertencia: la primera entrada debe terminar conNo es tanto una advertencia como para suprimir la entrada incorrecta ...'
.No se espera una segunda entrada.
fuente
Python - 184 bytes -20% para bonificación = 147.2
Para imprimir
I am batman
, reemplace las tres primeras comillas dobles con comillas simples en la entrada. (La primera línea es'''"""
)fuente