Genera programmi in dimensioni crescenti


21

In questa sfida, si scriverà un programma che emette un programma che è il doppio della lunghezza del programma originale. Il programma emesso dovrebbe produrre un nuovo programma un programma doppio della sua lunghezza.

Esempi

Se il mio programma è a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Regole

  • Nessun quine integrato
  • Il programma originale deve essere almeno un byte
  • La sequenza dovrebbe teoricamente funzionare all'infinito
  • Il tuo programma non può leggere nulla (file, stdio)

Il tuo punteggio è la dimensione del programma originale.


Che ne dici di accedere al file leggendo se stesso / accedendo al luogo in cui è contenuto il codice?
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ non è consentito in quanto violerebbe le regole credo.
Downgoat,

2
@ Doᴡɴɢᴏᴀᴛ le regole di Quine sono raccomandate dal tag wiki ma non si applicano automaticamente
Martin Ender


Risposte:



8

JavaScript, 62 61 37 byte


Grazie a @ Doᴡɴɢᴏᴀᴛ per l'aiuto!


Originale [37 byte]:

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

Bambino [74 byte]:

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

Nipote [148 byte]:

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


Alternativo (con stampa su console e come programma completo):

Originale [61 byte]:

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

Figlio [122 byte]:

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

Nipote [244 byte]:

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



Come funziona!

1.   f=_=>   Definire la funzione f comeconsole.log(...)

2.   ;f()   Funzione di esecuzione f.

3.   (nella funzione f)  

  • console.log(...)   Stampa quanto segue:

    • f=   testo letterale "f ="
    • ${'_'.repeat((0+f).length+5)   "_" ripetuto per la lunghezza di f, modificato per tenere conto dei caratteri non inclusi nella stringa di f
    • +f}   La stringificazione della funzione f
    • ;f()   testo letterale "; f ()"

Gli appunti

  • console.logè necessario anziché alertperchéalert non sembra funzionare bene con stringhe molto lunghe (almeno sulla mia configurazione macchina / browser)
  • Il _ '' sono inseriti nel nome del parametro (non usato) della funzione f, per assicurarsi che siano inclusi nella stringa di f.
  • Il principale miglioramento (oltre a sbarazzarsi della console.log) della prima soluzione rispetto alla seconda: aggiungendo 10alla funzione invece di 0lanciarla su stringa si allunga di un byte, eliminando la necessità di aggiungere 1 alla lunghezza in seguito, salvando un byte.

0+fdovrebbe anche funzionare per lanciare la funzione su una stringa
Downgoat

48 byte:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat,

@ Doᴡɴɢᴏᴀᴛ Dimenticato che la restituzione del risultato è generalmente accettabile. Si aggiorna.
jrich

@ Doᴡɴɢᴏᴀᴛ In realtà, poiché la scrittura di risposte come funzioni è generalmente accettata, la soluzione deve anche chiamare la funzione?
jrich

certo, potresti farlo
Downgoat

6

Minkolang 0,15 , 19 14 byte

"66*2-rIDdr$O.

Originale , figlio , nipote .

Spiegazione

"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

Ciò che fa il bit tra rs è duplicare il periodo finale abbastanza volte per soddisfare il criterio del raddoppio. .è il carattere "programma di arresto", quindi i numerosi periodi alla fine non fanno altro che esserci.


3

CJam, 12 byte

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

Quando eseguito, verrà stampato

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

che, a sua volta, stamperà

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

e così via.

Provalo online!


2

Python 3, 51 byte

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

Ciò include una nuova riga finale.

Quali uscite:

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

2

GolfScript, 11 byte

{: ".~"]}.~

Provalo online!

Come funziona il codice sorgente

{: ".~"]}.~

{       }    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.

Se il codice sorgente sopra viene eseguito una volta, lo stack finirà come

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

dove la stringa vuota all'inizio corrisponde allo stato iniziale dello stack (input vuoto).

Due copie del codice sorgente lascerebbero lo stato finale di

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

e così via.

Cosa succede dopo

Dopo aver eseguito il codice sorgente, l'interprete procede come segue:

  1. Avvolge l'intero stack in un array e inserisce tale array nello stack.

    Per una singola copia del codice sorgente, lo stack ora contiene

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. È stato eseguito putscon l'intenzione di stampare la pila incartata, seguita da un avanzamento riga.

    putsè definito come {print n print}, quindi effettua le seguenti operazioni.

    1. printstampa la copia impilata della pila senza ispezionarla (ovvero senza convertirla nella sua rappresentazione in formato stringa). Questo invia

      {: ".~"]}.~
      

      su STDOUT e fa apparire la copia dello stack dalla parte superiore dello stack.

      Lo stack ora contiene

      ["" {: ".~"]} ".~"]
      
    2. esegue il blocco di codice che abbiamo definito in precedenza.

      :inizia salvando ["" {: ".~"]} ".~"]il carattere spazio, quindi si ".~"spinge e ]avvolge la pila in un array.

    3. n spinge una stringa composta da un singolo avanzamento riga.

      Lo stack ora contiene

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. viene eseguito ancora una volta. Tuttavia, è stato ridefinito quando lo abbiamo chiamato per la prima volta e ora contiene un array, non un blocco di codice.

      In effetti, spinge ["" {: ".~"]} ".~"], lasciando lo stack come

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Infine, printstampa l'elemento in pila più in alto senza ispezionarlo, inviandolo

      {: ".~"]}.~
      

      a STDOUT.


1

𝔼𝕊𝕄𝕚𝕟, 26 caratteri / 36 byte

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

Try it here (Firefox only).

Si noti che esiste una nuova riga finale.

Spiegazione

Quine standard: ⟮ⒸⅩ222+ᶈ0

modifiche:

  • Utilizzare la ôfunzione per generare le righe tutti i risultati anziché l'ultimo risultato (come fatto utilizzando l'output implicito)
  • Utilizzare \u27ee⦃ᶈ0}\u27ef\ne chiudere il blocco copia per evitare conflitti con i blocchi copia successivi.
  • Utilizzare ď2per ripetere la stringa due volte.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.