Piramida Besar Quine

11

Tugasnya adalah tantangan quine yang agak sederhana dengan twist, Anda harus menampilkan kode sumber Anda dalam bentuk piramida. Bentuk piramida didefinisikan di bawah ini:

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

Keterbatasan utama dari tantangan ini adalah bahwa quine Anda harus mengandung byte yang cukup tepat agar tidak menghalangi pola piramida. Misalnya, panjang program berikut akan berfungsi:

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

Jadi, jika program Anda adalah:

QWERTY

Itu tidak akan valid, karena akan mengatur seperti:

  Q
 WER
TY

Namun, jika program Anda adalah QWERTYUIO, tidak masalah:

  Q
 WER
TYUIO

Aturan

  • Kelonggaran standar jelas-jelas dilarang, tidak membaca sumber Anda sendiri.
  • Piramida harus dipusatkan, karakter tambahan diperbolehkan, tetapi tidak diperlukan.
    • Juga, karakter apa pun dapat digunakan untuk memusatkan piramida, tidak harus demikian (char)32.
  • Quine Anda harus dapat dibentuk menjadi piramida.
    • Itu harus mempertahankan pemesanan asli kode sumber Anda.
    • Kode sumber Anda TIDAK boleh berisi karakter yang digunakan untuk memformat piramida.
    • EG jika kode sumber Anda mengandung spasi, Anda perlu char lain untuk formatnya.
  • Anda dapat menggunakan komentar di quine Anda untuk "pad" ke ukuran yang benar.
    • Jelas, ini harus menjadi output sebagai bagian dari quine.
  • Jika program berisi baris baru / tab, mereka bukan bagian dari quine dan harus dihilangkan dalam output.
  • Bentuknya dihitung dalam karakter, bukan byte; jika bentuknya salah Anda tidak melakukannya dengan benar.

Skor serendah mungkin di sini adalah 4.

Guci Gurita Ajaib
sumber
Apakah quine asli harus dalam bentuk piramida, atau hanya output yang dibutuhkan?
KrystosTheOverlord
@KrystosTheOverlord output, yang asli tidak masalah. Jika dokumen asli memiliki tab atau baris baru Anda harus menghilangkan ini di output juga untuk mempertahankan bentuk output.
Magic Octopus Urn
Apakah valid jika output memiliki banyak spasi tambahan / baris baru?
Emigna
@Emigna seharusnya begitu? Saya tidak melihat masalah dengan itu kecuali orang lain melakukannya pada saat ini. Juga, tentukan "sekelompok", bukankah konsensus biasanya "satu baris baru dapat diterima"?
Magic Octopus Mm
1
Anda harus membuat tantangan di mana Anda perlu memiliki quine dalam format piramida :).
KrystosTheOverlord

Jawaban:

4

05AB1E , 36 byte

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

Cobalah online!

Jika trailing characters are allowedjuga berarti pada akhir output, 0"D34çýā·<£.c"D34çýā·<£.cadalah lapisan yang lebih pendek pada 25 byte.

Emigna
sumber
34çadalah dasar dari semua quines 05AB1E, bukankah haha? Juga, tidak yakin apa yang saya rasakan tentang jumlah acak dari trailing newlines ... Saya lebih suka orang lain untuk melakukan panggilan itu (apa normanya, 1 trailing / preceeding diperbolehkan?) Yang tampaknya super on-the-edge.
Magic Octopus Urn
@ MagicOctopusUrn: Ya, itu agak dipertanyakan. Saya menganggap versi saya yang lebih pendek tidak apa-apa, itulah sebabnya saya tidak menggunakannya sebagai program utama, tapi saya merasa saya harus bertanya karena itu akan menyelamatkan saya seluruh lapisan.
Emigna
Dang, kau kalahkan aku. Dan alih-alih ā·<saya menggunakan 9ÅÉ(dalam byter 25, tidak memikirkan tentang baris baru ..)
Kevin Cruijssen
@MagicOctopusUrn Btw, semua jawaban lain memiliki baris tambahan, sehingga semua akan menjadi tidak valid kecuali untuk 36-byter ini ..
Kevin Cruijssen
4

Java 11, 324 256 227 byte

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));}//

-29 byte berkat @ JoKing .

Keluaran dengan spasi terdepan untuk membuat segitiga. (Perhatikan bahwa spasi putih antara var sdan int iadalah tab, bukan spasi.)

Cobalah online.

Penjelasan:

:

  • var s berisi String kode sumber yang tidak diformat
  • %s digunakan untuk menempatkan String ini ke dalam dirinya dengan s.format(...)
  • %c, %1$cdan 34digunakan untuk memformat tanda kutip ganda ( ")
  • %% digunakan untuk memformat %
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Bagian tantangan:

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

Yang berhenti dengan java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226kesalahan untuk String#substring(int,int)metode ini, iterasi setelah itu mencetak hasilnya ( yang baik-baik saja sesuai dengan meta ).

Kevin Cruijssen
sumber
itu tidak menyelamatkan Anda apa pun benar-benar, tetapi Anda tidak perlu s=s.formatberpisah ketika Anda dapat memiliki format dalam loop sebagai gantinya
Jo King
@ Jo Ah, tentu saja. Terima kasih. Sayangnya saya harus mengurangi program dasar tanpa komentar untuk setidaknya 196 (14 2) untuk menyimpan byte (atau hanya golf ke 225 (15 2) dan menemukan solusi untuk memiliki jumlah ganjil byte entah bagaimana). Saat ini 228 tanpa komentar.
Kevin Cruijssen
1
Mencoba pendekatan yang berbeda dan berakhir hanya dengan dua byte dan hanya karena itu menjadi angka ganjil ... Solusi untuk panjang ganjil adalah %%dalam string dan hanya satu %dalam kode aktual, tetapi ini berarti komentar wajib
Jo Raja
1
@JoKing Pendekatan yang bagus dengan spasi diganti dengan tab sehingga kita dapat memiliki spasi terkemuka (dan menghilangkan tab dari output karena aturan tantangan). Saya sudah bisa mengolah kode Anda dengan ///di dalam string sehingga string cukup lama untuk pergi ke iterasi yang diharapkan untuk mencetak semuanya, sebelum berhenti dengan StringIndexOutOfBoundsExceptionuntuk .substring. Dan dengan hanya dua trailing //di akhir program yang sebenarnya, karena hanya mencetak dua trailing //juga. :)
Kevin Cruijssen
Oh wow, saya tidak mengharapkan jawaban Java! Bagus !!!
Magic Octopus Mm
4

Python 2 , 81 byte

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

Cobalah online!

Quine quine yang menggunakan spasi sebagai karakter pengisi.

Jo King
sumber
atau ... yah ... jelas dengan padding sebanyak itu Anda bisa menaruh tanda tangan (yaitu string yang lebih menarik daripada aaaaaaaaa) di dalamnya: P
ASCII-satunya
@ ASCII-only Poin bagus, lihat jawaban yang diperbarui;)
Jo King
3

Perl 6 , 67 byte

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

Cobalah online!

Saya menggunakan beberapa karakter unicode untuk memeras lapisan tambahan itu. Output menggunakan spasi:

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

Penjelasan:

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

Python 2 , 169 byte

Penggunaan 0untuk memformat piramida.

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

Cobalah online!


Python 2 , 147 byte

Ini menggunakan aturan Jika program berisi baris baru / tab, mereka bukan bagian dari quine dan harus dihilangkan dalam output.

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

Cobalah online!

ovs
sumber
2

Gol> <> , 36 byte

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

Cobalah online!

versi yang lebih muda, 36 byte

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

Saya merasa sangat dekat untuk mendapatkannya satu baris lebih pendek, grrrr ....

Cobalah online!

versi yang lebih muda, 36 byte

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

Kode yang satu ini lebih kecil, tetapi sayangnya masih keluar dengan jumlah yang sama, komentar mengambil sisa ruang.

Cobalah online!

versi yang sedikit lebih muda, 36 byte

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

Wowza! Heh, saya hanya menggunakan itu untuk mengisi beberapa ruang, tetapi program ini berfungsi, untuk mengurangi, saya menggunakan beberapa nilai prepushed daripada menggunakan variabel!

Cobalah online!

Versi lebih lama, 42 byte

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

Ini memiliki baris baru, dan memiliki lebih banyak karakter daripada yang saya inginkan ...

Saya akan bermain golf ini dengan sangat ...

Cobalah online!

KrystosTheOverlord
sumber
25 byte
Jo King
2

Bersih , 256 byte

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="

Cobalah online!

Cukup banyak quine standar, juga quine template, dengan fungsi format ditambahkan.

Suram
sumber
1
Meskipun ini kode-golf, saya suka jawaban yang lebih panjang ini. Sapi suci itu mengesankan.
Magic Octopus Mm
2

R , 169 144 byte

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

Cobalah online!

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

Berhasil mempersingkat dengan memindahkan ke string yang diurai daripada ekspresi yang pergi. Harus menggunakan redefinisi operator unary untuk mendapatkannya di bawah 144 sekalipun.

Nick Kennedy
sumber
1

C # (Visual C # Interactive Compiler) , 225 byte

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

Menggunakan STXarang sebagai pelapis. Tidak menyadari bahwa Kevin Cruijssen sudah mengirimkan salinan persis di java sebelum memposting sampai saya selesai, tapi saya memutuskan untuk memposting ini lagi.

Cobalah online!

Perwujudan Ketidaktahuan
sumber