Hacer un quine

12

Quería engañar a un amigo dándole una quine que casi funcionó, pero se volvió más y más descuidada.

Cree un programa que, cuando se ejecute, genere el programa, pero con un carácter apagado. Se puede agregar, eliminar o ambos caracteres (un carácter cambia). Pero solo un personaje.

Tu puntuación será (length of your program) / floor(sqrt(number of times the program almost quines))(¿Dónde / 0está el infinito?)

number of times the program almost quineses la cantidad de veces que su programa se ejecuta mientras solo cambia un carácter en stdout. Su programa puede no aceptar entradas. Es posible que tampoco imprima un programa que ya ha impreso.

También es posible que no se añada un personaje que ha añadido previamente antes, o eliminar un personaje del mismo índice. Por ejemplo, si ha agregado 1antes y agrega 1nuevamente, ahí es donde se number of times the program almost quinesdetiene. Si elimina el primer carácter, no podrá eliminar el primer carácter nuevamente. Si cambiaste el tercer carácter a un 2, no puedes agregar 2ni eliminar el tercer carácter.

mbomb007
fuente
¿Qué es una quine?
Abr001am
@ Agawa001 Un quine es un programa que se imprime solo.

Respuestas:

7

CJam, 0.000884

{_,6/[{64md}6*](124+\+'�f++`"1$~"}""1$~

Aquí, denota el carácter no imprimible con el punto de código 128. Pruébelo en línea.

Idea

Este enfoque agrega todos los caracteres UCS (especificación original) con puntos de código entre U + 4000000 y U + 7FFFFFFF a la cadena inicialmente vacía que sigue al bloque de código.

Elegimos UTF-8 , que codifica cada uno de estos caracteres usando una cadena de 6 bytes de la siguiente manera:

1111110u₂     10vvvvvv₂     10wwwwww₂     10xxxxxx₂     10yyyyyy₂     10zzzzzz₂

252 + u       128 + vvvvvv  128 + wwwwww  128 + xxxxxx  128 + yyyyyy  128 + zzzzzz

Por lo tanto, podemos codificar el enésimo carácter en este rango calculando sus 6 dígitos menos significativos en la base 64 y agregando 252 a los más significativos y 128 a los restantes.

Puntuación

Hay caracteres de 2 ** 31 = 2,147,483,6486 bytes UTF-8 y la longitud del código original es 39, por lo que la puntuación es 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Cómo funciona

{                                }""    e# Push the code block and an empty string.
                                    1$~ e# Execute a copy of the code block.
 _,                                     e# Push the length of the string.
   6/                                   e# Divide by 6 to get the number of chars.
      {64md}6*                          e# Perform modular division six times.
     [        ]                         e# Collect the results in an array.
               (124+\+                  e# Add 124 to the first element.
                      '�f+              e# Add 128 to all and cast each to Char.
                          +             e# Concatenate the strings.
                           `            e# Push a string representation.
                            "1$~"       e# Push '1$~' to complete the quine.
Dennis
fuente
Estoy aceptando esto debido a su primer puntaje (más bajo). Lo permitiré
6

CJam, 46 bytes, 65504 add, 65505 del, Score 0.127424

{`-2<_0c#)!{'#/~(_)\+\+S+]'#*}*W<"
}_~"e# 
}_~

Pruébalo aquí.

La forma básica es una quine CJam generalizada estándar. Para "casi quine", hay un comentario e#al final del bloque de quine, donde puedo agregar caracteres libremente sin afectar el código. Tenga en cuenta que el comentario inicialmente contiene un solo espacio.

El programa continúa agregando caracteres al frente del comentario, comenzando en !y luego en orden de valor ASCII. Los códigos de caracteres de CJam se envuelven después de 2 16, por lo que en algún momento, esto agregará un byte nulo. Una vez que eso sucede, el programa comienza a eliminar bytes del final del comentario (de modo que la posición del carácter eliminado siempre es diferente) hasta que el comentario esté vacío.

Martin Ender
fuente
5

CJam, 19 bytes, 65536 add, 0 del, Score 0.074219

"a"{\)_)++`\"_~"}_~

Más simple es mejor.

jimmy23013
fuente