Generar programas en tamaño creciente

21

En este desafío, escribirá un programa que genera un programa que es el doble de la longitud del programa original. El programa generado debería generar un nuevo programa, un programa que duplique su longitud.

Ejemplos

Si mi programa es a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Reglas

  • No hay complementos de quine
  • El programa original debe tener al menos un byte
  • La secuencia teóricamente debería funcionar infinitamente
  • Su programa no puede leer nada (archivo, stdio)

Su puntaje es del tamaño del programa original.

Downgoat
fuente
¿Qué tal acceder al archivo leyéndolo / accediendo al lugar donde está contenido el código?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ eso no está permitido ya que eso violaría las reglas, creo.
Downgoat
2
@ Doᴡɴɢᴏᴀᴛ las reglas de quine son recomendadas por la etiqueta wiki pero no se aplican automáticamente
Martin Ender

Respuestas:

12

CJam, 10 bytes

{"_~"+_}_~

Pruébalo aquí.

Explicación

{"_~" e# Generalised quine framework, leaves the block and the string "_~"
      e# on the stack. 
+     e# Prepend the block to the string.
_     e# Duplicate the resulting array.
}_~
Martin Ender
fuente
¡GolfScript no está muerto! Ilmari tiene una respuesta a una pregunta similar que hace esto en exactamente 10 bytes.
Justin
8

JavaScript, 62 61 37 bytes


¡Gracias a @ Doᴡɴɢᴏᴀᴛ por la ayuda!


Original [37 bytes]:

f=_=>'f='+'_'.repeat((10+f).length)+f

Niño [74 bytes]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

Nieto [148 bytes]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


Alternativo (con impresión a la consola y como programa completo):

Original [61 bytes]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Niño [122 bytes]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Nieto [244 bytes]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



¡Cómo funciona!

1.   f=_=>   Defina la función f comoconsole.log(...)

2.   ;f()   Ejecutar la función f.

3.   (en la función f)  

  • console.log(...)   Imprima lo siguiente:

    • f=   texto literal "f ="
    • ${'_'.repeat((0+f).length+5)   "_" repetido para la longitud de f, alterado para tener en cuenta los caracteres no incluidos en la cadena de f
    • +f}   La stringificación de la función f
    • ;f()   texto literal "; f ()"

Notas

  • console.log es necesario en lugar de alert porque alertno parece funcionar bien con cadenas realmente largas (al menos en la configuración de mi máquina / navegador)
  • Los _'s se insertan en el nombre del parámetro (no utilizado) de la función f, para garantizar que se incluyan en la cadena de f.
  • Mejora principal (además de deshacerse de la console.log) de la primera solución sobre la segunda: agregar 10a la función en lugar de 0convertirla en cadena hace que sea un byte más, eliminando la necesidad de agregar 1 a la longitud posterior, ahorrando un byte.
jrich
fuente
0+ftambién debería funcionar para convertir la función en una cadena
Downgoat
48 bytes:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat
@ Doᴡɴɢᴏᴀᴛ Olvidé que devolver el resultado suele ser aceptable. Actualizará.
jrich
@ Doᴡɴɢᴏᴀᴛ En realidad, dado que escribir respuestas como funciones es generalmente aceptado, ¿la solución tiene que llamar a la función?
jrich
claro, podrías hacerlo
Downgoat
6

Minkolang 0.15 , 19 14 bytes

"66*2-rIDdr$O.

Original , hijo , nieto .

Explicación

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

Lo que hace el bit entre rs es duplicar el período final suficientes veces para cumplir el criterio de duplicación. .es el carácter "detener programa", por lo que los muchos períodos al final no hacen nada excepto estar allí.

El'endia Starman
fuente
3

CJam, 12 bytes

{"_~"1$1$}_~

Cuando se ejecuta, esto imprimirá

{"_~"1$1$}_~{"_~"1$1$}_~

que, a su vez, imprimirá

{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~

y así.

Pruébalo en línea!

Dennis
fuente
2

Python 3, 51 bytes

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

Esto incluye una nueva línea final.

Qué salidas:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
Zweedeend
fuente
2

GolfScript, 11 bytes

{: ".~"]}.~

Pruébalo en línea!

Cómo funciona el código fuente

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

Si el código fuente anterior se ejecuta una vez, la pila terminará como

["" {: ".~"]} ".~"]

donde la cadena vacía al principio corresponde al estado inicial de la pila (entrada vacía).

Dos copias del código fuente dejarían un estado final de

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

y así.

Que pasa despues

Después de ejecutar el código fuente, el intérprete hace lo siguiente:

  1. Envuelve toda la pila en una matriz y empuja esa matriz en la pila.

    Para una sola copia del código fuente, la pila ahora contiene

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Se ejecutó putscon la intención de imprimir la pila envuelta, seguido de un salto de línea.

    putsse define como {print n print}, por lo que hace lo siguiente.

    1. printimprime la copia envuelta de la pila sin inspeccionarla (es decir, sin convertirla en su representación de cadena). Esto envía

      {: ".~"]}.~
      

      STDOUT y muestra la copia de la pila desde la parte superior de la pila.

      La pila ahora contiene

      ["" {: ".~"]} ".~"]
      
    2. ejecuta el bloque de código que definimos previamente.

      :comienza guardando ["" {: ".~"]} ".~"]el carácter de espacio, luego se ".~"empuja y ]envuelve la pila en una matriz.

    3. n empuja una cadena que consiste en un solo salto de línea.

      La pila ahora contiene

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. se ejecuta una vez más. Sin embargo, se redefinió cuando lo llamamos por primera vez y ahora contiene una matriz, no un bloque de código.

      De hecho, empuja ["" {: ".~"]} ".~"], dejando la pila como

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Finalmente, printimprime el elemento de la pila superior sin inspeccionarlo, enviando

      {: ".~"]}.~
      

      a STDOUT.

Dennis
fuente
1

𝔼𝕊𝕄𝕚𝕟, 26 caracteres / 36 bytes

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

Tenga en cuenta que hay una nueva línea final.

Explicación

Quine estándar: ⟮ⒸⅩ222+ᶈ0

Modificaciones:

  • Use la ôfunción para generar los quines de todos los resultados en lugar del último resultado (como se hace con la salida implícita)
  • Use \u27ee⦃ᶈ0}\u27ef\ny cierre el bloque de copia para evitar conflictos con los bloques de copia posteriores.
  • Use ď2para repetir la cuerda dos veces.
Mama Fun Roll
fuente