Quine incremental


23

Su tarea es escribir un programa o función que genere el primer carácter de su código fuente, luego el segundo, luego el tercero ... cada vez que se ejecute.

Por ejemplo, si su programa estaba fooen el idioma del bararchivo baz.bar, debería obtener una salida similar a esta:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Su programa puede hacer cualquier cosa una vez que haya terminado de imprimir su código fuente de esta manera. Puede modificar el código fuente del archivo, pero recuerde que el código fuente a imprimir es el código fuente original .

Este es un código de golf, por lo que gana el programa más corto en bytes.


1
Si podemos modificar el código fuente del archivo, ¿eso significa que también podemos leerlo?
FlipTack

1
@ Flp.Tkc Buena pregunta. Honestamente, no tengo idea. No quiero que construyas el quine leyendo la fuente, pero estoy bien si lees la fuente solo para modificar el archivo.
Conor O'Brien

Respuestas:


6

Jalea , 12 bytes

“;⁾vṾ®ȯ©Ḣ”vṾ

Este es un enlace niládico. Pruébalo en línea! (Incluye código para llamar al enlace doce veces).

Cómo funciona

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Como una ventaja adicional, dado que el registro mantendrá una cadena vacía después de la duodécima llamada, una vez más es falsa y el enlace está listo para comenzar de nuevo. Llamar al enlace 24 veces generará el código fuente dos veces, llamándolo 36 veces tres veces, etc.


No conozco a Jelly, entonces, ¿qué hace exactamente el pie de página? ¿Por qué ^ 17?
Conor O'Brien

Llame al enlace de arriba ( ¢), la función de identidad ( ¹no es realmente necesaria después de la primera llamada), establezca el valor de retorno en salto de línea ( imprime implícitamente el valor de retorno anterior), repita. ¹y ambos son superíndices, pero no están relacionados. Los he reemplazado con los menos confusos ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(llamar, concatenar, repetir).
Dennis

12

Javascript - 26 bytes

Define f()que devuelve el código fuente carácter por carácter.

n=0;f=x=>("n=0;f="+f)[n++]

Devuelve indefinido después de que se quede sin caracteres.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


Si no me equivoco, debe incluir la llamada a la función como parte del código.
Mama Fun Roll

@MamaFunRoll enlace a meta publicación relevante?
Downgoat

No conozco ninguno: P Sin embargo, siempre he pensado que la función llamada en sí misma era parte de la quine; tal vez hay algo que me falta?
Mama Fun Roll

@MamaFunRoll La especificación específicamente permite funciones, por lo que no debería ser necesaria una llamada. De todos modos, no tendría mucho sentido para este desafío particular.
Dennis

Muy bien, solo asegurándome.
Mama Fun Roll

2

apilado , no competitivo, 34 bytes

[tostr ':!' + execCounter # out]:!

Una variación de la quine estándar. Este es un programa completo. Esto sirve execCounterpara saber cuántas veces se ejecutó este programa específicamente. Errores después de enviar todo.

Pruébalo aquí!


2

Pip , 31 bytes

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Una función anónima. ¡Pruébalo en TIO!

Explicación

Comience con esta Pip quine estándar:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Envuelva esto en llaves para que sea una función. Ahora, en lugar de devolver toda la fuente, necesitamos indexarla. El uso de una variable global para el índice y su incremento cada vez cumplirá el requisito del "siguiente carácter cada vez que se llame". ves el mejor candidato porque está preinicializado -1. Incrementándolo la primera vez se obtiene un índice de 0, la próxima vez 1, etc.

Pip tiene una indexación cíclica, por lo que una vez que la función imprime su último carácter, comenzará de nuevo desde el principio.


1

Python, 90 bytes

Una extensión de la línea estándar de Python (se aceptan consejos de golf):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Esta es una función de generador de Python , lo que significa que iteras sobre ella, y cada iteración proporciona el siguiente carácter en el código fuente. Cuando se han devuelto todos los caracteres, esto se bloquea con IndexError.

Para probar, simplemente agregue este script al final del programa:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

O pruébalo en línea!


1

*> <> , 13 21 bytes

" r:2+a1Fi1+:1F1+[ro;

Crea un archivo llamado \npara realizar un seguimiento del índice.

Es posible que se pueda jugar más al golf, pero nada me sobresalta de inmediato ...

Salida

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Explicación

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Hacer trampa Quine incremental

a1Fi1+:0go1F;

Explicación

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

jaja, no tenía idea de que podría nombrar un archivo "\ n". Aunque esto técnicamente lee el código fuente, según las ginstrucciones.
Conor O'Brien

@ ConorO'Brien, ah lo suficientemente justo. hmm ...
redstarcoder

¿*> <> Tiene algún tipo de indexación de pila? O comando de repetición? Luego, puede usar el marco "your code goes here;de trabajo estándar para> <>, luego acceder al enésimo miembro en la pila
Conor O'Brien

@ ConorO'Brien, sí Teal Pelican me mostró esta variante de quine en mi otra respuesta de trampa quine :).
redstarcoder

1
@redstarcoder He estado trabajando más en quines (¡YAY!) y descubrí un buen truco, si reemplazas r por # puedes: 1- el # me gusta; #; o [+ 1F1: + 1iF1a-1: "No puedo probar esto en este momento, pero creo que corta 1 byte de su código.> <> quines se puede hacer como #o <-1:" etc: D
Teal pelican

1

Mathematica, 91 bytes

Comentarios muy bienvenidos; Todavía estoy aprendiendo las cuerdas sobre qué quines son quines adecuadas.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Define una función llamada repetidamente sin argumentos. Después de la llamada 91, arroja un gran error y regresa sin evaluar.

Había dos problemas que superar: primero, solo quería usar StringTake[ToString[#0]<>"[]"], pero ToString[]parece borrar las comillas; así que tuve que sustituir "[]"por FromCharacterCode[{91, 93}]. En segundo lugar, las variables de Mathematica comienzan sin inicializar, por lo que no puedo llamar ++qantes de que qesté definido; Por eso If[!NumberQ[q], q = 0]se necesita la inicial .

Coda irrelevante: mientras miraba hacia arriba NumberQ, aprendí que Mathematica tiene una función llamada TrueQ... que, ¡sí, devuelve Truesi el argumento es Truey Falsesi el argumento es False! (La utilidad es que también devuelve Falsetodos los demás argumentos).


1

Microscript II, 40 33 bytes

Un literal de bloque de código, el equivalente más cercano del lenguaje a una función:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Después de ejecutarse, se vuelve xa poner para facilitar la invocación nuevamente.


0

Bash (y zsh, ksh), 39 bytes

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

No imprime nada después de que se imprime el programa.

Asegúrese de 0que no exista en el directorio actual y ejecute:

bash iquine.bash

Bienvenido a PPCG! Tienes una idea inteligente para incrementar el índice. Desafortunadamente, parece que esta respuesta funciona leyendo su propio código fuente, lo que significa que no es una cita válida según nuestros estándares . Si lo modifica para utilizar técnicas de quine distintas a la lectura de su propia fuente, será una buena respuesta.
DLosc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.