Büyük Quine Piramidi


11

Görev, bir bükülme ile oldukça basit bir soru mücadelesi, kaynak kodunuzu bir piramit şeklinde çıkarmalısınız. Bir piramidin şekli aşağıda tanımlanmıştır:

       1
      234
     56789
    ABCDEFG
   HIJKLMNOP
  QRSTUVWXYZa
 bcdefghijklmn
......etc......

Bu zorluğun ana sınırlaması, kininizin piramidin desenini engellemeyecek kadar bayt içermesi gerektiğidir. Örneğin, aşağıdaki program uzunlukları işe yarar:

1-byter: 1st layer of the pyramid (not allowed by definition of a quine).
4-byter: 1st and 2nd layers of the pyramid.
9-byter: 1st, 2nd and 3rd layers of the pyramid.
etc...

Yani, eğer programınız:

QWERTY

Geçerli olmaz, çünkü şu şekilde düzenlenir:

  Q
 WER
TY

Ancak, programınız QWERTYUIO olsaydı, iyi olurdu:

  Q
 WER
TYUIO

kurallar

  • Standart boşluklar kesinlikle izin verilmiyor, kendi kaynağınızı okumuyor.
  • Piramit ortalanmalıdır, sondaki karakterlere izin verilir, ancak gerekli değildir.
    • Ayrıca, piramidi ortalamak için herhangi bir karakter kullanılabilir, olması gerekmez (char)32.
  • Ayranınız bir piramit şeklinde şekillendirilebilmelidir.
    • Kaynak kodunuzun orijinal sırasını korumalıdır.
    • Kaynak kodunuz piramidi biçimlendirmek için kullanılan karakteri İÇERMEZ .
    • Kaynak kodunuzda boşluk varsa, biçim için başka bir karakter gerekir.
  • Doğru boyutta "yastık" yapmak için, alıntıdaki yorumları kullanabilirsiniz.
    • Açıkçası, bunlar çıktının bir parçası olarak çıkarılmalıdır.
  • Program yeni satırlar / sekmeler içeriyorsa, bunlar satırın bir parçası değildir ve çıktıya dahil edilmemelidir.
  • Şekil bayt değil, karakter olarak sayılır; şekil bozuksa, doğru yapmıyorsunuz demektir.

Burada mümkün olan en düşük puan 4 olmalıdır.


Orijinal kinin bir piramit şeklinde mi olması gerekiyor, yoksa sadece çıktının mı olması gerekiyor?
KrystosTheOverlord

@KrystosTheOver çıktısı, orijinal önemli değil. Orijinalde sekmeler veya yeni satırlar varsa, çıktının şeklini korumak için bunları çıktıda da atlamanız gerekir.
Sihirli Ahtapot Urn

Çıktının bir sürü boşluk / satırsonu varsa geçerli mi?
Emigna

@Emigna olmalı mı? Başkaları bu noktada yapmadığı sürece onunla ilgili bir sorun görmüyorum. Ayrıca, "bir demet" tanımlayın, fikir birliği genellikle "tek bir satırsonu kabul edilebilir" değil mi?
Sihirli Ahtapot Urn

1
Bir piramit biçiminde quine olması gereken yerde bir meydan okuma yapmalısınız :).
'19

Yanıtlar:


4

05AB1E , 36 bayt

"34çs«DJā·<£õK.cJ?"34çs«DJā·<£õK.cJ?

Çevrimiçi deneyin!

trailing characters are allowedÇıktının sonunda da anlamına gelirse 0"D34çýā·<£.c"D34çýā·<£.c, 25 baytta daha kısa bir katmandır.


34ç05AB1E sorgularının temeli nedir, değil mi? Ayrıca, takip eden yeni satırların rastgele miktarı hakkında nasıl hissettiğimden emin değilim ... Bir başkasının bu çağrıyı yapmasını tercih ederim (kenarda süper gibi görünen norm nedir, 1 iz / ön izin verilir?).
Sihirli Ahtapot Urn

@MagicOctopusUrn: Evet, biraz tartışmalı. Kısa versiyonumun iyi olmadığını varsayıyorum, bu yüzden onu birincil program olarak kullanmadım, ancak bana tüm katmanı kurtaracağından sormam gerektiğini hissettim.
Emigna

Dang, beni dövüyorsun. Ve yerine ā·<kullandım 9ÅÉ(25 byter'da, sondaki yeni satır hakkında düşünmedim ..)
Kevin Cruijssen

@MagicOctopusUrn Btw, diğer tüm cevapların sondaki yeni bir satırı var, bu yüzden bu 36 byter hariç hepsi geçersiz olacaktır ..
Kevin Cruijssen

4

Java 11, 324 256 227 bayt

v->{var s="v->{vars=%c%s%1$c;for(inti=0;;)System.out.printf(%1$c%%%1$c+(15+i)+%1$cs%%n%1$c,s.format(s,34,s).substring(i*i,++i*i));}///";for(int i=0;;)System.out.printf("%"+(15+i)+"s%n",s.format(s,34,s).substring(i*i,++i*i));}//

@JoKing sayesinde -29 bayt .

Üçgeni yapmak için önde gelen boşluklarla çıktılar. (Boşluk arasındaki Not var sve int iolan sekme değil, boşluk).

Çevrimiçi deneyin.

Açıklama:

-part:

  • var s biçimlendirilmemiş kaynak kodunu içerir Dize
  • %s bu String'i kendi içine koymak için kullanılır s.format(...)
  • %c, %1$cve 34çift ​​tırnak işaretlerini ( ") biçimlendirmek için kullanılır
  • %% biçimlendirmek için kullanılır %
  • s.format(s,34,s) hepsini bir araya getirir

Zorluk bölümü:

for(int i=0;;)         // Loop `i` indefinitely upwards from 0
  System.out.printf(   //  Print with format:
    "%"+(15+i)+"s      //   Add leading spaces to make the line length size 15+`i`
                 %n",  //   And include a trailing newline
    s.format(s,34,s).substring(
                       //   And append a substring of the source code-String
       i*i,            //    From index `i` squared
       ++i*i));}       //    To index `i+1` squared

Hangi yöntem java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226için bir hata ile durur String#substring(int,int), sonuç yazdırıldıktan sonra yineleme ( meta göre iyi ).


size gerçekten hiçbir şey kaydetmez, ancak s=s.formatbunun yerine döngüde ne zaman olabileceğinize
Jo King

@JoKing Ah elbette. Teşekkürler. Maalesef baytları kaydetmek için temel programı en az 196 (14 2) 'e indirmem gerekiyor (ya da sadece 225'e (15 2) golf yapıyorum ve bir şekilde tek bir bayt sayısı için bir çözüm bulmalıyım). Şu anda yorum yapılmamış 228.
Kevin Cruijssen

1
Farklı bir yaklaşım denedim ve sadece iki bayt kapalı ve sadece tek bir sayı olduğu için sona erdi ... Tek uzunluklar için geçici çözüm %%dizede bir ve %gerçek kodda sadece bir tane , ancak bu yorumların zorunlu olduğu anlamına gelir
Jo King

1
@JoKing Önde gelen boşluklara sahip olabilmemiz için sekmelerle değiştirilen boşluklara hoş bir yaklaşım (ve meydan okuma kuralları nedeniyle sekmeleri çıktıdan çıkarırız). Ben kodunuzu yeniden işleme başardık ///onunla durmadan önce, herşeyi yazdırmak için beklenen yineleme gitmek için dize yeterince uzun yani dizede StringIndexOutOfBoundsExceptioniçin .substring. Ve //gerçek programın sonunda sadece iki iz ile, çünkü sadece iki iz yazdırıyor //. :)
Kevin Cruijssen

Vay canına, Java yanıtı beklemiyordum! Güzel bir!!!
Sihirli Ahtapot Urn

4

Python 2 , 81 bayt

s='n=0;\nprint(8-n)*chr(32)+("s=%r;exec(s*9)"%s)[n*n:][:n-~n];n+=1;#JK';exec(s*9)

Çevrimiçi deneyin!

Boşlukları dolgu karakteri olarak kullanan bir değerlendirme sorgusu.




veya ... iyi ... açıkça bu kadar dolgu ile içine bir imza (yani aaaaaaaaa olan daha ilginç bir dize) koyabilirsiniz: P
sadece ASCII-sadece 8

@ Sadece ASCII İyi bir nokta, güncellenmiş cevaba bakınız;)
Jo King

3

Perl 6 , 67 bayt

<say("<$_>~~.EVAL".substr($!++²,$!*2-1).indent(8-$!))xx⁸>~~.EVAL

Çevrimiçi deneyin!

Bu ekstra katmanı sıkıştırmak için birkaç unicode karakter kullandım. Boşluk kullanan çıktılar:

       <
      say
     ("<$_
    >~~.EVA
   L".substr
  ($!++²,$!*2
 -1).indent(8-
$!))xx⁸>~~.EVAL

Açıklama:

<say("<$_>~~.EVAL"                                  )   >~~.EVAL   # Normal quine
                  .substr($!++²,$!*2-1)              xx⁸  # Split into layered substrings
                                       .indent(8-$!)      # And indent each one

3

Python 2 , 169 bayt

0Piramidi biçimlendirmek için kullanır .

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))#######################';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))

Çevrimiçi deneyin!


Python 2 , 147 bayt

Bu kuralı kullanır Program yeni satırlar / sekmeler içeriyorsa, bunlar satırın bir parçası değildir ve çıktıya dahil edilmemelidir.

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]forninrange(13))##';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for	n	in	range(13))##

Çevrimiçi deneyin!


2

Gol> <> , 36 bayt

":P}r6&56F:M}F0ss|&:P&Roao{|;Nooooo!

Çevrimiçi deneyin!

daha genç bir versiyon, 36 bayt

":P}r6&56F:M}R` &:P&Fo|ao{|;Noooooo!

Bir satır daha kısa, grrrr almak için çok yakın hissediyorum ....

Çevrimiçi deneyin!

daha genç versiyon, 36 bayt

"r2ss6&56F:M}R` &:P&Fo|ao{|;what????

Bu kod daha küçüktür, ancak yine de ne yazık ki aynı miktarda ortaya çıkıyor, yorum alanın geri kalanını kaplıyor.

Çevrimiçi deneyin!

biraz daha genç versiyonu, 36 bayt

"r2ss156F:M}F` o|:PP}Fo|ao{{|;Wowza!

Wowza! Heh, sadece biraz yer doldurmak için kullandım, ama program işe yarıyor, golf oynamak için, değişkenleri kullanmak yerine önceden hazırlanmış birkaç değer kullandım!

Çevrimiçi deneyin!

Eski versiyon, 42 bayt

"r2ss0V_~6:&F&:M&F` o|_PPV_Fo|ao|;empty...

Bu sondaki bir satırsonu ve istediğimden daha fazla karakter var ...

Bunu ciddi şekilde golf oynayacağım ...

Çevrimiçi deneyin!



2

Temiz , 256 bayt

module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="

Çevrimiçi deneyin!

Biçimlendirme işlevi eklendi, hemen hemen standart quine, ayrıca bir şablon quine.


1
Kod golf olmasına rağmen, bu daha uzun cevapları seviyorum. Etkileyici kutsal inek.
Sihirli Ahtapot Urn

2

R , 169144 bayt

s='`!`=intToUtf8;cat(sprintf("%*s",11+(i=1:12),substring(paste0("s=",q<-!39,s,q,";eval(parse(t=s))"),(i-1)^2+1,i^2)),sep=!010)';eval(parse(t=s))

Çevrimiçi deneyin!

           s
          ='`
         !`=in
        tToUtf8
       ;cat(spri
      ntf("%*s",1
     1+(i=1:12),su
    bstring(paste0(
   "s=",q<-!39,s,q,"
  ;eval(parse(t=s))")
 ,(i-1)^2+1,i^2)),sep=
!010)';eval(parse(t=s))

Ayrılmış bir ifade yerine ayrıştırılan bir dizeye geçerek onu kısaltmayı başardı. 144 altında almak için tek bir operatörün yeniden tanımlamak zorunda kaldı.


1

C # (Visual C # Etkileşimli Derleyici) , 225 bayt

var s="var s={0}{1}{0};for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//";for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//

STXDolgu olarak bir karakter kullanır . Kevin Cruijssen, yapılana kadar yayınlanmadan önce java'da tam bir kopya gönderdiğini fark etmedim, ama yine de göndermeye karar verdim.

Çevrimiçi deneyin!

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.