Büyüyen Quine Dizisi


18

p1 p2 ... p10Aşağıdaki özellikleri karşılayan 10 programlık bir sıra yazmalısınız :

  • pKbaskılar pK+1için K1 ila 9'a
  • p10 baskılar p10
  • İlk Kprogramlar birleştirildiğinde, ortaya çıkan program p1...pKyazdırılır p1...pK.
  • Her program bir pKönceki programdan daha büyük bayt boyutunda olmalıdır pK-1.
  • Tüm programlar aynı dilde olmalıdır.
  • Yerleşik sorgulama işlevlerine (örneğin Qbirçok dilde) izin verilir.

Skorunuz 10 programın bayt sayımlarının toplamıdır. Yalnızca on program olduğundan, kodlarınızı mümkün olduğunca kısa yapmanız gerekir. İyi şanslar.


"Her pK programı bayt boyutunda bir önceki pK-1 programından daha büyük olmalıdır" - ha, neden bu garip gereklilik?
nicael

6
@nicael Çünkü büyüyen bir quine dizisi.
Conor O'Brien

P10 neden p11'i değil, kendisini yazdırıyor? Bu sorunu biraz daha zorlaştırıyor.
SuperJedi224

@ SuperJedi224 Çünkü sadece p11 yoktur.
Conor O'Brien

Yerleşik sorgulama işlevleri yasaklanmış olsaydı bu zorluk çok daha ilginç olurdu.
Dennis

Yanıtlar:


15

Ciddi, 245 bayt:

Tüm on program birleştirildi:

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.









Yürütüldüğünde görünür hale gelen görünmez karakterler vardır, bayt 7F'nin garip bir özelliği. Her programın sondaki satır sonları önemlidir. Aslında, ister istemeseniz de istemeseniz de yeni satırları çıkışına otomatik olarak ekler. Bu, çıktıdaki yeni satır sayısını sayar ve bu sayı 8'i aşar aşmaz, çıktının son karakterini siler. Bu nedenle, tüm K> 4 için p1..pKyazdıracaktır p1..pK.

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.)

1
İlginç! Gerçekten mümkün.
Conor O'Brien

7
Açıklama Ben her char duz wat açıklayabilir miyim
Seadrus

3
Bunun Q, programın kaynak kodunu iten yerleşik sorgulamayı kullandığına dikkat edilmelidir .
Martin Ender

(Ve ayrıca, toplam uzunluğun, yerleşik olmadan 150 bayt civarında bir yerde olacağını belirtti.)
quintopia

Bu sorgulama için yerleşik sorgulama işlevlerine izin verilir.
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);

Kuralları daha önce yanlış anladım, bu yüzden önceki cevabım yanlıştı.

Bu, değişken kaldırma yerine işlev kaldırma kullanır, bu nedenle program 10'a bağlı değildir. Aslında, iki veya daha fazla birleştirilmiş programın herhangi bir kombinasyonu için bir quine olduğunu düşünüyorum.

Feragatname: şu anda gerçekten geç, bu yüzden yukarıdaki her şey tamamen yanlış olabilir.


alertİşlev çıktısı nedeniyle ihtiyacınız olduğunu sanmıyorum .
Mama Fun Roll

Anlıyorum, boş ver.
Mama Fun Roll

Sonunda noktalı virgül çıkararak 20 bayt tasarruf edebilirsiniz. (İçerideki şablon dizesini de güncellediğinizden emin olun.)
Mama Fun Roll

1
@ ՊՓԼՃՐՊՃՈԲՍԼ Ben aslında noktalı virgüllerin birleştirme için gerekli olduğunu düşünüyorum, çünkü aslında yeni satırları dahil etmiyorum.
grc

Yine boşver o zaman.
Mama Fun Roll

9

Javascript ES6, 1935 bayt

On program:

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();

4
Bakmak çok güzel.
Conor O'Brien

4
Tüm bu ekstra noktalı virgüller sadece program 2'nin program 1'den daha uzun olmasını sağlamak için ...
SuperJedi224

Regex (\S)+ve yerine koymayı $0$1bazı baytları kurtarmak için kullanabilir misiniz ?
Martin Ender

@ MartinBüttner Muhtemelen, bu öğleden sonra deneyeceğim
SuperJedi224

2

𝔼𝕊𝕄𝕚𝕟 2, 214 karakter / 334 bayt

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

Try it here (Firefox only).

açıklama

ℹ)                // 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, 10 programdaki önde gelen alanların miktarı olan arka arkaya 9 boşluk aramasını sayar. Bir eşleşme bulursa, kaynak kodu verilir; aksi halde, boşluk tarafından yönlendirilen kaynak kodu çıkarılır.


Hangi kodlamayı kullanıyorsunuz? ISO 8859-1 kodlamasında 284 bayt gibi görünüyor. Burada
Downgoat

UTF-8 kullanıyorum.
Mama Fun Roll

ESmin 2 olduğunu unuttum, bu yüzden karakter sayısını "2.214 karakter" olarak okudum: P
Conor O'Brien
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.