Hacer un quine
Parece fácil ¿verdad? Bueno, esta línea debe aparecer más su primer carácter, que luego se muestra más su segundo carácter, y así sucesivamente.
De esta manera, la quine debería generar en varias generaciones dos copias.
Ejemplo: permite que su código sea x
. Ejecutarlo debería dar salida x + x[:1]
. Ejecutar el programa resultante debería generar, x + x[:2]
etc.
Si su código fue foobar
, ejecutar esto debería generar foobarf
. Ejecutar esto debería dar salida foobarfo
. Y así sucesivamente siguiendo este patrón:
foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf
Su programa debe tener más de 2 bytes y debe generar solo UN carácter adicional de su propio código en cada iteración.
Respuestas:
zsh ,
110108100 bytesPruébalo en línea!
Entonces es posible.
Explicación
fuente
R, 289 bytes
crédito a esta quine por inspiración. Solo funciona si se ejecuta en el mismo entorno R que la quine anterior.
fuente
cat
añadiendo nuevas líneas.main
ninguna otra estructura obligatoria como esa en R. Además, la pregunta no solicita explícitamente un programa completo, por lo que una función o similar funcionaría.Alice , 29 bytes
Pruébalo en línea!
El carácter no imprimible es 0x18.
Explicación
El problema con las habituales
"
fungeoid quines es que si repetimos todo el código fuente, también obtenemos más"
y la cadena ya no cubre todo el código fuente. Supongo que es por eso que la respuesta existente utiliza elg
enfoque de trampa en su lugar.Esta respuesta utiliza el
"
enfoque basado en, pero en lugar de incluir un"
en la fuente, lo escribimos en el programa en tiempo de ejecución. De esa manera, solo habrá uno"
independientemente de la frecuencia con la que se repita el programa (porque solo lo escribimos en una coordenada específica, independientemente del tamaño del programa).La idea general es, entonces, que creamos una representación del código fuente completo en la pila, pero solo recorremos los primeros 29 caracteres (es decir, la longitud del programa) con la longitud del bucle determinada por el tamaño del código. Por lo tanto, en realidad podemos agregar caracteres arbitrarios (excepto los avances de línea) después
@
y el resultado siempre será una repetición cíclica del programa central, un carácter más largo que la fuente.fuente
Perl 5 , 83 bytes (incluida la nueva línea final)
Pruébalo en línea!
El buen
__DATA__
token antiguo hace que sea fácil agregar una cadena arbitraria a cualquier programa Perl, al que el programa principal puede acceder a través del<DATA>
identificador de archivo (y en realidad lo usa__END__
, lo que hace lo mismo para la compatibilidad con versiones anteriores, en lugar de__DATA__
guardar dos bytes adicionales) .Tenga en cuenta que este programa no lee su propio código fuente, sino solo los datos de entrada adicionales agregados a su fuente después del
__END__
token. En efecto, el__END__
token y todo lo que sigue funciona como una cadena literal terminada al final de la entrada.También tenga en cuenta que, para cumplir exactamente con las especificaciones, este programa debe terminar en una nueva línea. Si no es así, la nueva línea se agrega automáticamente después de la segunda de
__END__
todos modos, pero la salida de la primera iteración ya no será exactamente igual al código más su primer byte.fuente
Befunge-98 , 30 bytes
Pruébalo en línea!
Intenté usar Befunge-98, que usa una quine terminada en espacio que también cuenta cuántos caracteres han sido superados. Sin embargo, utiliza el
g
comando.fuente
PHP, 146 bytes
Debe ejecutarse usando la
-r
línea de comando.fuente
php -r 'command'
.Encantamientos rúnicos , 61 bytes
Pruébalo en línea!
Utiliza un enfoque similar al de la respuesta de Alice: escribe reflexivamente el
"
comando de cadena en el código para que solo haya uno. El resto es una gran cantidad de manipulación de cadenas y pilas para recuperar el programa original, cuántos bytes adicionales se necesitan e imprimir los trozos necesarios.La
}͍
secuencia gira la representación de cadena en memoria para que803X4+kw
aparezca al principio en lugar de al final, debido a la posición del"
y no hay una manera más fácil de manejar esta operación sin tener que calcular muchos números incómodos .Mientras que el programa original es de 61 bytes, su longitud de cadena es de solo 50, lo que es fácil de construir ya
5X
que fue una coincidencia que no fuera necesario rellenarlo después de contener todas las funciones necesarias (por ejemplo, un programa de longitud 49 sería más fácil codificar como50
con un byte de relleno que codificar un literal49
, mientras51
que se codificaría como5X3+
o 53, teniendo que tener en cuenta sus propios bytes adicionales).fuente