Rosnąca sekwencja quine

18

Masz napisać sekwencję 10 programów, p1 p2 ... p10które spełniają następujące właściwości:

  • pKwydruki pK+1do Kod 1 do 9
  • p10 odbitki p10
  • Gdy pierwsze Kprogramy zostaną połączone, powstały program zostanie p1...pKwydrukowany p1...pK.
  • Każdy program pKmusi mieć większy rozmiar bajtów niż poprzedni program pK-1.
  • Wszystkie programy muszą być w tym samym języku.
  • Wbudowane funkcje quiningu (np. QW wielu językach) są dozwolone.

Twój wynik to suma liczby bajtów 10 programów. Ponieważ jest tylko dziesięć programów, kody muszą być jak najkrótsze. Powodzenia.

Conor O'Brien
źródło
„Każdy program pK musi być większy w bajtach niż poprzedni program pK-1” - co, dlaczego ten dziwny wymóg?
nicael
6
@nicael Ponieważ jest to rosnąca sekwencja quine.
Conor O'Brien
Dlaczego drukuje się p10, a nie p11? To sprawia, że ​​problem jest nieco trudniejszy.
SuperJedi224
@ SuperJedi224 Ponieważ po prostu nie ma p11.
Conor O'Brien
To wyzwanie byłoby o wiele bardziej interesujące, gdyby wbudowane funkcje quiningu były zabronione.
Dennis

Odpowiedzi:

15

Poważnie, 245 bajtów:

Wszystkie dziesięć programów zostało połączone:

Q9ucQc8<WX#dXεj0WX.Q9ucQc8<WX#dXεj0WX.
Q9ucQc8<WX#dXεj0WX.

Q9ucQc8<WX#dXεj0WX.


Q9ucQc8<WX#dXεj0WX.



Q9ucQc8<WX#dXεj0WX.




Q9ucQc8<WX#dXεj0WX.





Q9ucQc8<WX#dXεj0WX.






Q9ucQc8<WX#dXεj0WX.







Q9ucQc8<WX#dXεj0WX.









Istnieją niewidoczne znaki, które stają się widoczne po wykonaniu, dziwna właściwość bajtu 7F. Końcowe znaki nowej linii w każdym programie są znaczące. W rzeczywistości Poważnie automatycznie dodaje nowe wiersze do danych wyjściowych, niezależnie od tego, czy tego chcesz, czy nie. To tylko zlicza liczbę nowych wierszy na wyjściu, a gdy tylko liczba ta przekroczy 8, usuwa ostatni znak wyniku. Jako taki p1..pKwydrukuje p1..pKdla wszystkich K> 4.

Q                                  Push source code.
 9uc                               Push \n
    Qc                             Push the number of times it appears in source code.
      8<                           Check if it appears more than 8 times.
        WX     0WX                 If so, run the included code.
          #dX                      Convert string to list, dequeue and discard a newline.
             εj                    Join list back into string.
                  .                Print and halt. (Invisible byte here.)
kwintopia
źródło
1
Ciekawy! To jest rzeczywiście możliwe.
Conor O'Brien
7
Czy mogę wyjaśnić leik wat each char duz
Seadrus
3
Należy zauważyć, że używa to wbudowanego quiningu, Qktóry wypycha kod źródłowy programu.
Martin Ender
(I dalej zauważył, że całkowita długość byłaby gdzieś w pobliżu 150 bajtów dłużej bez wspomnianego wbudowanego).
quintopia
W tym wyzwaniu dozwolone są wbudowane funkcje quiningu.
Conor O'Brien
9

JavaScript (ES6), 985

function f(x){x<0||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(0);
 function f(x){x<1||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(1);
  function f(x){x<2||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(2);
   function f(x){x<3||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(3);
    function f(x){x<4||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(4);
     function f(x){x<5||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(5);
      function f(x){x<6||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(6);
       function f(x){x<7||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(7);
        function f(x){x<8||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(8);
         function f(x){x<9||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(9);

Wcześniej źle zrozumiałem zasady, więc moja poprzednia odpowiedź była niepoprawna.

Ten wykorzystuje funkcję podnoszenia zamiast podnoszenia zmiennego, więc nie zależy od programu 10. W rzeczywistości uważam, że jest to quine dla dowolnej kombinacji dwóch lub więcej połączonych programów.

Oświadczenie: jest teraz naprawdę późno, więc wszystko powyżej może być całkowicie błędne.

grc
źródło
Nie sądzę, żebyś potrzebował z alertpowodu wyjścia funkcji.
Mama Fun Roll
Och, rozumiem, nieważne.
Mama Fun Roll
Możesz usunąć końcowe średniki, oszczędzając ci 20 bajtów. (Pamiętaj również o zaktualizowaniu ciągu szablonu).
Mama Fun Roll
1
@ ՊՓԼՃՐՊՃՈԲՍԼ Myślę, że średniki są potrzebne do konkatenacji, ponieważ tak naprawdę nie uwzględniam znaków nowej linii.
grc
Znowu nieważne.
Mama Fun Roll
9

JavaScript ES6, 1935 bajtów

Dziesięć programów:

a=_=>{t=`a=${a};a()`;setTimeout(_=>alert(t.length>200?t:";".repeat(82)+'a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\\s)+g,"$0$1"):u)};a();'))};a()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*   */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*    */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*     */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*      */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*       */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*        */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*         */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*          */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
SuperJedi224
źródło
4
To jest piękne.
Conor O'Brien
4
Wszystkie te dodatkowe średniki, aby upewnić się, że program 2 jest dłuższy niż program 1 ...
SuperJedi224
Czy możesz użyć wyrażenia regularnego (\S)+i podstawienia, $0$1aby zapisać niektóre bajty?
Martin Ender
@ MartinBüttner Prawdopodobnie spróbuję dziś po południu
SuperJedi224
2

𝔼𝕊𝕄𝕚𝕟 2, 214 znaków / 334 bajty

ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
 ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
  ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
   ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
    ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
     ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
      ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
       ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
        ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
         ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)

Try it here (Firefox only).

Wyjaśnienie

ℹ)                // quine function: get source code
  đ ⬭ď9)          // are there 9 spaces in a row anywhere in the source?
        ?ℹ):      // if so, pass the source itself to implicit output
            ⬭+ℹ) // otherwise, add a leading space to the source and pass to implicit output

Program zlicza wyszukiwania 9 spacji z rzędu, co stanowi liczbę spacji wiodących w 10. programie. Jeśli znajdzie dopasowanie, wówczas generowany jest kod źródłowy; w przeciwnym razie generowany jest kod źródłowy, prowadzony spacją.

Mama Fun Roll
źródło
Jakiego kodowania używasz? Wydaje się, że kodowanie ISO 8859-1 ma 284 bajty. Testowany tutaj
Downgoat
Używam UTF-8.
Mama Fun Roll
Zapomniałem, że to ESmin 2, więc odczytałem liczbę znaków jako „2214 znaków”: P
Conor O'Brien