Kim tự tháp vĩ đại của Quine


11

Nhiệm vụ này là một thử thách quine khá đơn giản với một vòng xoắn, bạn phải xuất mã nguồn của mình theo hình kim tự tháp. Hình dạng của một kim tự tháp được xác định dưới đây:

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

Hạn chế chính của thử thách này là quine của bạn phải chứa đủ byte chính xác để không cản trở mô hình của kim tự tháp. Chẳng hạn, độ dài chương trình sau sẽ hoạt động:

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

Vì vậy, nếu chương trình của bạn là:

QWERTY

Nó sẽ không hợp lệ, bởi vì nó sẽ sắp xếp như sau:

  Q
 WER
TY

Tuy nhiên, nếu chương trình của bạn là QWERTYUIO, nó sẽ ổn:

  Q
 WER
TYUIO

Quy tắc

  • Các sơ hở tiêu chuẩn rõ ràng là không được phép, không đọc nguồn của riêng bạn.
  • Kim tự tháp phải được đặt ở giữa, các ký tự dấu được phép, nhưng không bắt buộc.
    • Ngoài ra, bất kỳ nhân vật nào cũng có thể được sử dụng để tập trung vào kim tự tháp, không cần phải như vậy (char)32.
  • Quine của bạn phải có thể được định hình thành một kim tự tháp.
    • Nó phải giữ lại thứ tự ban đầu của mã nguồn của bạn.
    • Mã nguồn của bạn KHÔNG được chứa ký tự đang được sử dụng để định dạng kim tự tháp.
    • EG nếu mã nguồn của bạn chứa một khoảng trắng, bạn sẽ cần một char khác cho định dạng.
  • Bạn có thể sử dụng các bình luận trong quine của bạn để "pad" đến kích thước chính xác.
    • Rõ ràng, đây phải là đầu ra như là một phần của quine.
  • Nếu chương trình chứa các dòng / tab mới, chúng không phải là một phần của quine và nên được bỏ qua trong đầu ra.
  • Hình dạng được tính bằng ký tự, không phải byte; nếu hình dạng không đúng, bạn không làm đúng.

Điểm thấp nhất có thể ở đây phải là 4.


Liệu quine ban đầu cần phải có hình dạng của một kim tự tháp, hay chỉ là đầu ra cần phải có?
KrystosTheOverlord

@KrystosTheOverlord đầu ra, bản gốc không thành vấn đề. Nếu bản gốc có các tab hoặc dòng mới, bạn cũng nên bỏ qua các mục này trong đầu ra để giữ lại hình dạng của đầu ra.
Bạch tuộc ma thuật Urn

Có hợp lệ không nếu đầu ra có một loạt các khoảng trắng / dòng mới?
Emigna

@Emigna có nên không? Tôi không thấy vấn đề gì với nó trừ khi những người khác làm vào thời điểm này. Ngoài ra, định nghĩa "một bó", không phải sự đồng thuận thường là "một dòng mới duy nhất có thể chấp nhận được"?
Bạch tuộc ma thuật Urn

1
Bạn nên thực hiện một thử thách trong đó bạn cần phải có quine theo định dạng của một kim tự tháp :).
KrystosTheOverlord

Câu trả lời:


4

05AB1E , 36 byte

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

Hãy thử trực tuyến!

Nếu trailing characters are allowedcũng có nghĩa là ở cuối đầu ra, 0"D34çýā·<£.c"D34çýā·<£.clà một lớp ngắn hơn ở mức 25 byte.


34çlà cơ sở của tất cả các câu hỏi 05AB1E, phải không haha? Ngoài ra, không chắc chắn tôi cảm thấy như thế nào về số lượng dòng mới ngẫu nhiên ... Tôi muốn người khác thực hiện cuộc gọi đó (định mức, 1 dấu vết / tiền được phép là gì?) Có vẻ siêu cạnh.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Vâng, thật đáng nghi ngờ. Tôi cho rằng phiên bản ngắn hơn của tôi không ổn, đó là lý do tại sao tôi không sử dụng nó làm chương trình chính, nhưng tôi cảm thấy nên hỏi vì nó sẽ tiết kiệm cho tôi cả một lớp.
Emigna

Dang, bạn đánh tôi với nó. Và thay vì ā·<tôi đã sử dụng 9ÅÉ(trong 25 byter, tôi đã không nghĩ về dòng mới này ..)
Kevin Cruijssen 16/2/19

@MagicOctopusUrn Btw, tất cả các câu trả lời khác đều có dòng mới, vì vậy tất cả sẽ không hợp lệ ngoại trừ 36-byter này ..
Kevin Cruijssen 16/2/19

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 nhờ @JoKing .

Đầu ra với không gian hàng đầu để làm cho tam giác. (Lưu ý rằng khoảng trắng giữa var sint ilà các tab, không phải khoảng trắng.)

Hãy thử trực tuyến.

Giải trình:

-part:

  • var s chứa chuỗi mã nguồn chưa được định dạng
  • %s được sử dụng để đặt Chuỗi này vào chính nó với s.format(...)
  • %c, %1$c34được sử dụng để định dạng dấu nháy kép ( ")
  • %% được sử dụng để định dạng %
  • s.format(s,34,s) đặt tất cả lại với nhau

Phần thử thách:

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

Mà dừng lại với một java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226lỗi cho String#substring(int,int)phương thức, lặp đi lặp lại sau khi nó đã in kết quả ( điều này là tốt theo meta ).


nó thực sự không tiết kiệm cho bạn bất cứ điều gì, nhưng bạn không cần phải chia tay s=s.formatkhi bạn có thể có định dạng trong vòng lặp
Jo King

@JoKing Ah tất nhiên. Cảm ơn. Thật không may, tôi phải giảm chương trình cơ sở mà không có ý kiến ​​xuống ít nhất là 196 (14 2) để lưu byte (hoặc chỉ đánh gôn xuống 225 (15 2) và tìm cách khắc phục để có số byte lẻ bằng cách nào đó). Hiện tại là 228 mà không có ý kiến.
Kevin Cruijssen

1
Đã thử một cách tiếp cận khác và cuối cùng chỉ tắt hai byte và chỉ vì nó là một số lẻ ... Cách giải quyết cho độ dài lẻ là một %%chuỗi và chỉ có một %trong mã thực tế, nhưng điều này có nghĩa là các nhận xét là bắt buộc
Jo Vua

1
@JoKing Cách tiếp cận đẹp với các khoảng trắng được thay thế bằng các tab để chúng ta có thể có các khoảng trắng hàng đầu (và bỏ qua các tab từ đầu ra do các quy tắc thách thức). Tôi đã có thể làm lại mã của bạn với ///trong chuỗi nên chuỗi là đủ lâu để nó đi đến lặp dự kiến sẽ in tất cả mọi thứ, trước khi dừng lại với StringIndexOutOfBoundsExceptioncho .substring. Và chỉ có hai dấu //ở cuối chương trình thực tế, vì nó chỉ in hai dấu //. :)
Kevin Cruijssen

Ồ wow, tôi không mong đợi một câu trả lời Java! Đẹp một !!!
Bạch tuộc ma thuật Urn

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)

Hãy thử trực tuyến!

Một quine eval sử dụng khoảng trắng làm ký tự phụ.




hoặc ... tốt ... rõ ràng với phần đệm nhiều như vậy, bạn có thể đặt một chữ ký (nghĩa là một chuỗi thú vị hơn đó là aaaaaaaaa) trong đó: P
ASCII - chỉ

@ Chỉ ASCII Điểm tốt, xem câu trả lời được cập nhật;)
Jo King

3

Perl 6 , 67 byte

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

Hãy thử trực tuyến!

Tôi đã sử dụng một vài ký tự unicode để vắt kiệt lớp đó. Đầu ra sử dụng khoảng trắng:

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

Giải trình:

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

3

Python 2 , 169 byte

Sử dụng 0để định dạng kim tự tháp.

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

Hãy thử trực tuyến!


Python 2 , 147 byte

Điều này sử dụng quy tắc Nếu chương trình chứa các dòng / tab mới, chúng không phải là một phần của quine và nên được bỏ qua trong đầu ra.

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

Hãy thử trực tuyến!


2

Gol> <> , 36 byte

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

Hãy thử trực tuyến!

một phiên bản thậm chí còn trẻ hơn, 36 byte

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

Tôi cảm thấy rất gần để có được nó một dòng ngắn hơn, grrrr ....

Hãy thử trực tuyến!

thậm chí phiên bản trẻ hơn, 36 byte

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

Mã này nhỏ hơn, nhưng nó vẫn xuất hiện cùng một số tiền đáng buồn, bình luận chiếm phần còn lại của không gian.

Hãy thử trực tuyến!

phiên bản trẻ hơn một chút, 36 byte

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

Wowza! Heh, tôi chỉ sử dụng nó để lấp đầy không gian, nhưng chương trình hoạt động, để đánh golf, tôi đã sử dụng một vài giá trị được chuẩn bị trước thay vì sử dụng các biến!

Hãy thử trực tuyến!

Phiên bản cũ hơn, 42 byte

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

Điều này có một dòng mới, và có nhiều ký tự hơn tôi muốn ...

Tôi sẽ chơi golf này một cách nghiêm túc ...

Hãy thử trực tuyến!



2

Sạch sẽ , 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="

Hãy thử trực tuyến!

Khá nhiều quine tiêu chuẩn, thuận tiện cũng là một quine mẫu, với chức năng định dạng được thêm vào.


1
Mặc dù đó là môn đánh gôn, tôi thích những câu trả lời dài hơn này. Bò thần thật ấn tượng.
Bạch tuộc ma thuật Urn

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

Hãy thử trực tuyến!

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

Quản lý để rút ngắn nó bằng cách di chuyển đến một chuỗi được phân tích cú pháp thay vì một biểu thức đã khởi hành. Phải sử dụng một định nghĩa lại của một toán tử đơn nguyên để có được nó dưới 144 mặc dù.


1

C # (Trình biên dịch tương tác Visual C #) , 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));//

Sử dụng một STXchar như đệm. Không nhận ra Kevin Cruijssen đã gửi một bản sao chính xác trong java trước khi đăng cho đến khi tôi hoàn thành, nhưng tôi đã quyết định đăng bài này.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.