Generuj programy w coraz większym rozmiarze

21

W tym wyzwaniu napiszesz program, który wypisze program, który jest dwukrotnie dłuższy niż oryginalny program. Emitowany program powinien wypisać nowy program program podwoi swoją długość.

Przykłady

Jeśli moim programem jest a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Zasady

  • Brak wbudowanych quine
  • Oryginalny program musi mieć co najmniej jeden bajt
  • Sekwencja powinna teoretycznie działać w nieskończoność
  • Twój program nie może czytać z niczego (plik, stdio)

Twój wynik to rozmiar oryginalnego programu.

Downgoat
źródło
Co powiesz na dostęp do pliku przez samo odczytanie / dostęp do miejsca, w którym znajduje się kod?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ jest to niedozwolone, ponieważ moim zdaniem naruszałoby to zasady.
Downgoat
2
@ Do rules reguły quine są zalecane przez tag wiki, ale nie mają zastosowania automatycznie
Martin Ender

Odpowiedzi:

12

CJam, 10 bajtów

{"_~"+_}_~

Sprawdź to tutaj.

Wyjaśnienie

{"_~" 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
źródło
GolfScript nie jest martwy! Ilmari ma odpowiedź na podobne pytanie, które robi to dokładnie w 10 bajtach.
Justin
8

JavaScript, 62 61 37 bajtów


Dzięki @ Doᴡɴɢᴏᴀᴛ za pomoc!


Oryginalny [37 bajtów]:

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

Dziecko [74 bajty]:

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

Wnuk [148 bajtów]:

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


Alternatywnie (z drukowaniem do konsoli i jako pełny program):

Oryginalny [61 bajtów]:

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

Dziecko [122 bajty]:

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

Wnuk [244 bajty]:

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



Jak to działa!

1.   f=_=>   Zdefiniuj funkcję f jakoconsole.log(...)

2.   ;f()   Uruchom funkcję f.

3.   (w funkcji f)  

  • console.log(...)   Wydrukuj następujące:

    • f=   dosłowny tekst „f =”
    • ${'_'.repeat((0+f).length+5)   „_” powtórzone dla długości f, zmienione w celu uwzględnienia znaków nieuwzględnionych w łańcuchu f
    • +f}   Strukturyzacja funkcji f
    • ;f()   dosłowny tekst „; f ()”

Notatki

  • console.logjest konieczne zamiast, alertponieważ alertwydaje się, że nie gra dobrze z naprawdę długimi łańcuchami (przynajmniej w konfiguracji mojego komputera / przeglądarki)
  • Te _są wstawiane do nazwy (nieużywanego) parametru funkcji f, aby upewnić się, że są uwzględnione w łańcuchowaniu f.
  • Główna poprawa (oprócz pozbycia się console.log) pierwszego rozwiązania w stosunku do drugiego: dodanie 10do funkcji zamiast 0rzucania jej na łańcuch powoduje, że jest on o jeden bajt dłuższy, eliminując potrzebę dodawania 1 do długości później, oszczędzając bajt.
jrich
źródło
0+fpowinien również pracować nad
rzutem
48 bajtów:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat
@ Doᴡɴɢᴏᴀᴛ Zapomniałem, że zwracanie wyniku jest zwykle dopuszczalne. Zaktualizuję.
jrich
@ Doᴡɴɢᴏᴀᴛ W rzeczywistości, skoro pisanie odpowiedzi jako funkcji jest ogólnie akceptowane, to czy rozwiązanie musi nawet wywołać funkcję?
jrich
jasne
6

Minkolang 0,15 , 19 14 bajtów

"66*2-rIDdr$O.

Oryginał , dziecko , wnuk .

Wyjaśnienie

"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

To, co rrobi bit pomiędzy s, powiela okres kończący tyle razy, aby spełnić kryterium podwojenia. .jest znakiem „zatrzymaj program”, więc wiele okresów na końcu nie robi nic poza byciem tam.

El'endia Starman
źródło
3

CJam, 12 bajtów

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

Po uruchomieniu zostanie wydrukowane

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

który z kolei wydrukuje

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

i tak dalej.

Wypróbuj online!

Dennis
źródło
2

Python 3, 51 bajtów

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

Obejmuje to końcowy znak nowej linii.

Które wyjścia:

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
źródło
2

GolfScript, 11 bajtów

{: ".~"]}.~

Wypróbuj online!

Jak działa kod źródłowy

{: ".~"]}.~

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

Jeśli powyższy kod źródłowy zostanie wykonany raz, stos zakończy się jako

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

gdzie pusty ciąg na początku odpowiada początkowemu stanowi stosu (puste wejście).

Dwie kopie kodu źródłowego pozostawiałyby końcowy stan

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

i tak dalej.

Co się potem dzieje

Po wykonaniu kodu źródłowego interpreter wykonuje następujące czynności:

  1. Zawija cały stos w tablicę i wypycha tę tablicę na stos.

    Dla pojedynczej kopii kodu źródłowego stos zawiera teraz

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Wykonano go putsz zamiarem wydrukowania owiniętego stosu, a następnie podania linii.

    putsjest zdefiniowany jako {print n print}, więc wykonuje następujące czynności.

    1. printdrukuje zawiniętą kopię stosu bez sprawdzania go (tzn. bez konwertowania go do reprezentacji ciągu). To wysyła

      {: ".~"]}.~
      

      do STDOUT i wysuwa kopię stosu z góry stosu.

      Stos zawiera teraz

      ["" {: ".~"]} ".~"]
      
    2. wykonuje zdefiniowany wcześniej blok kodu.

      :zaczyna się od zapisania ["" {: ".~"]} ".~"]znaku spacji, a następnie ".~"przesuwa się i ]zawija stos w tablicę.

    3. n wypycha ciąg składający się z pojedynczego kanału.

      Stos zawiera teraz

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. jest wykonywany ponownie. Zostało jednak na nowo zdefiniowane, gdy wywołaliśmy go po raz pierwszy i teraz zawiera tablicę, a nie blok kodu.

      W rzeczywistości pcha ["" {: ".~"]} ".~"], pozostawiając stos jako

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Na koniec printdrukuje najwyższy element stosu bez sprawdzania go, wysyłając

      {: ".~"]}.~
      

      do STDOUT.

Dennis
źródło
1

𝔼𝕊𝕄𝕚𝕟, 26 znaków / 36 bajtów

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

Try it here (Firefox only).

Zauważ, że jest nowy znak końca.

Wyjaśnienie

Standardowy quine: ⟮ⒸⅩ222+ᶈ0

Modyfikacje:

  • Użyj ôfunkcji, aby wyświetlić quinesy wszystkie wyniki zamiast ostatniego wyniku (tak jak w przypadku niejawnego wyniku)
  • Posługiwać się \u27ee⦃ᶈ0}\u27ef\n i zamknij blok kopiowania, aby zapobiec konfliktom z późniejszymi blokami kopiowania.
  • Użyj, ď2aby powtórzyć ciąg dwa razy.
Mama Fun Roll
źródło