Viết một bộ Quine


30

Chúng tôi đã có rất nhiều thử thách về , nhưng rất nhiều định dạng quine tương tự nhau, cho phép tạo ra một số phương sai trong các câu hỏi của chúng tôi.

Nhiệm vụ của bạn là tạo ra một lựa chọn các chương trình trong cùng một ngôn ngữ (ít nhất là 2), tất cả đều xuất mã nguồn riêng của họ, tuy nhiên, không có chương trình nào trong số này có thể chia sẻ bất kỳ ký tự nào.

Ví dụ: nếu bạn tạo chương trình bằng:

printf+qw(printf+qw(%s)x2)x2

Chương trình tiếp theo của bạn không thể bao gồm bất kỳ:

%()+2finpqrstwx

vân vân

Quy tắc

  • Bạn có thể sử dụng các ký tự unicode, nhưng bạn vẫn phải ghi bằng byte.
  • Tất cả các chương trình phải đáp ứng định nghĩa của cộng đồng về một câu hỏi thích hợp . Điều này có nghĩa là chuỗi rỗng không được tính là một giá trị hợp lệ, trong số những thứ khác.
  • Sơ hở tiêu chuẩn bị cấm.
  • Các chức năng hoặc chương trình đầy đủ được cho phép miễn là đáp ứng định nghĩa trên.
  • Các ngôn ngữ độc lập biểu tượng (bao gồm Lenguage và Headsecks) không được phép.
  • Hầu hết các chương trình đều thắng, với tổng số mã ngắn nhất là bộ ngắt kết nối.

Vì có số phiếu gần nên tôi sẽ hủy đăng bài trong hộp cát để thảo luận: codegolf.meta.stackexchange.com/a/16053/9365
Dom Hastings

Tôi nhận thấy rằng các bình luận hộp cát đề cập đến việc đệ trình chức năng được cho phép, nhưng thách thức không nói gì về điều đó - tôi đã giả sử ngược lại là mặc định cho các quines.
Ørjan Johansen

2
Liên quan (Loại thử thách ngược - các nhóm của bạn phải xuất ra thay vì chính họ)
Nathaniel

1
Những gì về dấu vết mới? Nếu một trong những câu hỏi của tôi in một, thì người kia có phải tránh làm như vậy không? (Tôi nghi ngờ rằng hầu hết các câu trả lời không làm điều này.)
Nathaniel

2
@DomHastings Tôi không thể tìm thấy một câu hỏi meta, vì vậy tôi đã hỏi một câu hỏi .
Nathaniel

Câu trả lời:


27

V , 3 , 5 quines, 46 byte

2A2A

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

Hexdump:

00000000: 3241 3241                                2A2A

Giải trình:

2     " 2 times...
 A    " (A)ppend the following text...
  2A  "   '2A'

5­­­a5­­­a

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

Hexdump:

00000000: 35ad adad 6135 adad ad61                 5...a5...a

Giải trình:

5---        " 5 - 3 times...
    a       " (a)ppend the following text...
     5---a  "   '5---a'

1«I1«I

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

Hexdump:

00000000: 31ab 4931 ab49                           1.I1.I

Giải trình:

1«      " 1 + 1 times...
  I     " (I)nsert the following text...
   1«I  "   '1«I'

Đây là nơi họ bắt đầu trở nên sôi nổi ...

ñi34x@-qPÉÑ~ÿ

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

Hexdump:

00000000: f169 1633 341b 7840 2d71 50c9 d17e ff    .i.34.x@-qP..~.

Giải trình:

ñ                       " Wrap all the following in macro '"q':
 i<C-v>34               "   Insert character code 34 `"`
         <esc>          "   Return to normal mode
              x         "   Delete the character we just inserted. Now, running `@-` will be equal to running `"`
                  P     "   Paste...
               @-       "   From Register...
                 q      "   "q
                   ÉÑ   "   Insert 'Ñ' at the beginning of this line
                     ~  "   Toggle the case of the character we just inserted
                      ÿ "   Black magic

:norm é:":p

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

Hexdump:

00000000: 3a6e 6f72 6d20 e93a 223a 70              :norm .:":p

Giải trình:

:norm       " Run the following commands as if typed:
      é:    "   insert ':'. Somehow also does black magic and resets the value of '":`
        ":p "   Paste the last ex command to be run ('norm é:":p')

Câu trả lời này chứa đầy ma thuật đen. Quines 1 và 4 không phải là mới, nhưng tất cả 3 cái còn lại chưa bao giờ được tìm thấy trước đây, vì vậy hơn một nửa số quines này mới được phát hiện ngày hôm nay.


8
Chương trình thứ ba là trolling. "Bạn là một normie :p"
mbomb007

4
@ mbomb007 Bắt buộcREEEEEE--
Bạch tuộc ma thuật Urn

17

Thạch , 2 3 4 5 quines, 14 18 81 65 59 56 326 265 247 229 216 byte

3 byte

”ṘṘ

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

Tiêu chuẩn quine. ”Ṙlà một ký tự theo nghĩa đen cho . in đại diện chuỗi này sau đó chuỗi được in ngầm.

4 byte

⁾⁾ḤḤ

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

bắt đầu một chuỗi hai ký tự theo nghĩa đen và nhân đôi đối số của nó. Với đầu vào chuỗi, được ánh xạ lên từng ký tự. Do đó, tác động lên ⁾Ḥnăng suất chuỗi ⁾⁾ḤḤ, mã nguồn.

11 byte

ȮṾṖƊ}“ȮṾṖƊ}

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

Ở phía bên tay phải, “ȮṾṖƊ}là chuỗi ký tự cho ȮṾṖƊ}. Ký tự đóng chuỗi được ngầm định thêm vào tại EOF.

Ở bên trái của chuỗi ký tự, Ɗkết thúc ȮṾṖthành một đơn nguyên và }biến nó thành một dyad sử dụng đối số bên phải của nó, chuỗi ký tự. Ȯin chuỗi ( ȮṾṖƊ}), tạo biểu diễn chuỗi của chuỗi ( “ȮṾṖƊ}”) và xóa ký tự. Chuỗi “ȮṾṖƊ}được để lại sau đơn nguyên và được in ngầm.

38 49 36 byte

32,52,52,7884,106,64,44,7884 44Ọj@,Ọ

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

Lần đầu tiên tôi từng sử dụng một không gian trong môn đánh gôn Jelly.

Danh sách các số ở đầu giữ ordphần còn lại của các ký tự trong mã. Sau đó:

jṛ44Ọ$,Ọ
j           Join this list with...
 ṛ          right argument. Avoiding using ¤ so I can use it in the next program.
  44Ọ       chr(44)==',': [106, ',', ...]
     $      Causes Ọ to act on 44 before j acts on it.
      ,     Pair this list with...
       Ọ    chr of each number in the list. Yields jṛ44Ọ$,Ọ

270 198 180 162 byte

⁽¢_;⁽⁽¤;⁽¡_;⁽⁽¡;⁽¡¤;⁽$+;⁽⁽y;⁽Ẹ$;⁽⁺$;⁽AƑ;⁽?€;⁽b⁽;⁽¢¡;⁽_⁽;⁽¡¡;⁽¤ị;⁽ØJ;⁽µṭ;⁽€⁽;⁽¡S;⁽;⁽;⁽¡ʠ;⁽¤ị;⁽ØJ;⁽¤F;⁽ḊṄ;⁽ȧF
¢_⁽¤¡_⁽¡¡¤$+⁽yẸ$⁺$AƑ?€b⁽¢¡_⁽¡¡¤ịØJµṭ€⁽¡S;⁽¡ʠ¤ịØJ¤FḊṄȧF

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

Sử dụng 250 số và chỉ mục cơ bản vào trang mã Jelly. Đã lưu 72 byte bằng cách thay đổi thuật toán. Đã sử dụng từng số để lập chỉ mục cho trang mã của Jelly nhưng hiện đang chuyển đổi số nguyên trở lại cơ sở 250 sau đó lập chỉ mục vào trang mã của Jelly, về cơ bản giảm một nửa số chữ tôi cần trong dòng đầu tiên. Điều này cũng làm giảm số lượng các ký tự duy nhất cần thiết, nhưng tôi không thể nghĩ ra cách nào để tạo ra bất kỳ giới hạn nào nữa.

Tôi đã sử dụng hết ⁾“”mà tạo xâu và ØJđó tạo ra chuỗi từ con số. Tôi không thể nghĩ ra bất kỳ cách tạo chuỗi nào khác. Tôi vẫn còn chữ số 9‘’có sẵn, vì vậy nếu có một cách khác để tạo chuỗi từ số thì có thể tạo ra một câu hỏi khác.


13

Haskell , 3 quines, 1119 byte

Câu 1, 51 byte

Một IOhành động ẩn danh in trực tiếp đến thiết bị xuất chuẩn.

putStr`mappend`print`id`"putStr`mappend`print`id`"

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

Quine 2, 265 byte

Hàm flấy một đối số giả và trả về một chuỗi.

f	c=[b=<<g]!!0++show	g;b	c=[[[show	9!!0,show	1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]

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

Quine 3, 803 byte

Tất cả mọi thứ sau LANGUAGEpragma là một hàm bất thường lấy một đối số giả và trả về một chuỗi.

{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'

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

Nhân vật

Câu 1:


"S`adeimnprtu

Câu 2:

	!+,.0123456789;<=[]bcfghosw

Câu 3:

 #$%&'()-:>?ACEGILMNPTU\_kqvxyz{}

Làm thế nào nó hoạt động

Câu 1

putStr`mappend`print`id`"putStr`mappend`print`id`"

Quine 1 là phiên bản sửa đổi của Golf gần đây của tôi , bạn trả lời câu hỏi (với những cải tiến của H.PWiz):

  • Vì các chương trình đầy đủ là không cần thiết, main= đã được gỡ bỏ.
  • <>$đã được thay thế bởi các từ đồng nghĩa gần mappendid.

Điều này giải phóng các nhân vật quan trọng =<>và toán tử hữu ích $cho các nhiệm vụ khác.

Câu 2

f	c=[b=<<g]!!0++show	g;b	c=[[[show	9!!0,show	1!!0..]!!6..]!!c];g=[93,0,......]

Quine 2 sử dụng các phương thức hơi giống với chương trình 2 trong câu trả lời Quines độc quyền gần đây của tôi , nhưng được điều chỉnh theo cách trực tiếp và đặc biệt là để tránh sử dụng các ký tự, cần thiết cho quine 3. Cả hai đều đạt được với sự trợ giúp của showhàm, mà may mắn là chưa có nhân vật nào được sử dụng.

Câu hỏi này sử dụng các tab thay vì khoảng trắng, nhưng tôi đã sử dụng khoảng trắng bên dưới để dễ đọc.

  • glà dữ liệu quine, như một danh sách các số nguyên ở cuối mã. Mỗi số đại diện cho một ký tự từ phần còn lại của mã.
    • Các số được dịch chuyển theo 9, vì vậy đó là tab 0. Điều này làm cho mã hóa ngắn hơn một chút bằng cách cho phép các chữ cái viết thường cho hàm và tên biến phù hợp với 2 chữ số.
  • b c=[[[show 9!!0,show 1!!0..]!!6..]!!c] là một hàm để chuyển đổi một số thành một ký tự (thực ra là một chuỗi một ký tự).
    • [[show 9!!0,show 1!!0..]!!6..]là một phạm vi ký tự bắt đầu bằng một ký tự tab, được lập chỉ mục với !!c.
    • Các ký tự tab riêng của mình được sản xuất bởi lập chỉ mục vào phạm vi khác [show 9!!0,show 1!!0..], bắt đầu với ký tự chữ số '9''1'và nhảy xuống trong bước 8.
    • Các ký tự chữ số được tạo ra bằng cách lập chỉ mục vào showchuỗi của chữ số tương ứng.
  • f c=[b=<<g]!!0++show glà chức năng chính. clà một đối số giả.
    • b=<<gsử dụng =<<để chuyển đổi từng số gthành ký tự của nó. (Việc sử dụng =<<chứ không phải là ví dụ maplà tại sao bcần phải bọc ký tự trả về của nó trong danh sách.)
    • show gđưa ra biểu diễn chuỗi của gdanh sách và ++nối các chuỗi.
    • Bởi vì =<<có quyền ưu tiên thấp hơn ++, một số dấu ngoặc là cần thiết. Để tránh sử dụng ()(dành riêng cho quine 3), hãy [...]!!0lập chỉ mục vào một danh sách với một thành phần.

Câu 3

Theo thiết kế của các quine khác, quine 3 vẫn có quyền truy cập vào dấu ngoặc đơn, biểu thức lambda, ký tự ký tự và hàm tạo chuỗi / danh sách :. Đây sẽ là đủ để xây dựng một hàm prepends mã của Quine thành một chuỗi.

Thật không may, tất cả các nguyên âm chữ thường (trừ đôi khi y) đã được sử dụng, không để lại các hàm dựng sẵn chữ và số hữu ích. Cũng []""đã biến mất. Điều này không có cách bình thường để xây dựng một chuỗi trống để bắt đầu giả vờ mã.

Tuy nhiên, gần như tất cả các chữ cái viết hoa vẫn có sẵn, do đó, một LANGUAGEpragma để có được một phần mở rộng ngôn ngữ là có thể. Một lần nữa bởi may mắn, CPP(kích hoạt bộ tiền xử lý C) là phần mở rộng ngôn ngữ duy nhất được đặt tên chỉ bằng chữ in hoa. Và các macro CPP thường có tên viết hoa.

Vì vậy, để có được chuỗi rỗng thiết yếu, quine cho phép CPP, sử dụng __TIME__macro để lấy hằng số chuỗi có dạng "??:??:??"(được đảm bảo thuận tiện để luôn có cùng độ dài) và mẫu khớp với nó.

{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......

Sau pragma ngôn ngữ, quine bao gồm một biểu thức lambda ràng buộc các tham số của nó với bốn đối số này (để lại một tham số giả cuối cùng _sẽ được áp dụng sau):

  • qràng buộc '\'', đưa ra một nhân vật trích dẫn duy nhất;
  • _:_:_:_:_:_:_:_:zbị ràng buộc __TIME__, hay còn gọi là một chuỗi như "??:??:??"vậy, do đó tạo ra zmột chuỗi rỗng;
  • ybị ràng buộc với (\(?)v k x->v$k?x), một bộ kết hợp lambda được sử dụng để giúp chuyển đổi dữ liệu quine từ dạng liên kết trái ("Foldl") sang dạng liên kết phải ("Foldr");
  • Toán tử (#)ràng buộc với\(&)(%)v->v&'{'&'-'&... , dữ liệu quine chính nó.

Dữ liệu quine được đưa ra dưới dạng mã hóa Church, biểu thức lambda với các tham số (&)(%)v .

  • Bằng cách áp dụng biểu thức cho các giá trị cụ thể để khởi tạo (&),(%)v, mã hóa này có thể được sử dụng một trong hai để xây dựng mã cốt lõi của Quine hoặc để xây dựng lại biểu diễn dữ liệu Quine riêng của mình.
  • Theo quy tắc sửa lỗi mặc định của Haskell &% trở thành các nhà khai thác liên kết bên trong lambda. Do đó, các tham số ký tự được kết hợp với vbắt đầu từ bên trái.
  • Đối với hầu hết các nhân vật k, có một tương ứng&'k' .
  • Khi k'hay \, mà cần phải được thoát bên literals nhân vật, mã hóa là thay %'\k'.

Vì mã hóa dữ liệu là liên kết trái, nhưng các chuỗi được xây dựng theo cách kết hợp phải, nên bộ kết hợp y = (\(?)v k x->v$k?x)được giới thiệu để làm cầu nối không khớp.

  • y(...)được dự định để xây dựng các chức năng phù hợp để sử dụng như các toán tử (&)(%)toán tử quine .
  • vlà một hàm từ chuỗi đến chuỗi ( vví dụ dự định của dữ liệu quine ).
  • klà một ký tự, xmột chuỗi và ?một toán tử kết hợp chúng thành một chuỗi mới. (Đối với mã lõi,(?)=(:) . Để thực sự tái cấu trúc biểu diễn dữ liệu quine, nó phức tạp hơn.)
  • Vì vậy, y(?)v k = \x->v$k?xlà một chức năng khác từ chuỗi đến chuỗi.
  • Như một ví dụ về cách điều này thay đổi tính kết hợp, nếu (&)=y(:):

    (v&k1&k2&k3) x
    = (((v&k1)&k2)&k3) x
    = y(:)(y(:)(y(:)v k1)k2)k3 x
    = y(:)(y(:)v k1)k2 (k3:x)
    = y(:)v k1 (k2:(k3:x))
    = v (k1:(k2:(k3:x)))
    = v (k1:k2:k3:x)

Tổng quát hơn, khi nào (#)là hàm dữ liệu quine và f1,f2là các hàm kết hợp các ký tự với chuỗi:

(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))

áp dụng hàm dữ liệu quine với (&)=y(f1)(%)=y(f2), và điều này sử dụng quy định f1f2để kết hợp các ký tự của dữ liệu quine với x, và sau đó chuyển chuỗi kết quả tớiv .

Phần thân của biểu thức lambda chính đặt tất cả lại với nhau:

(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
  • '&':q:k:q:xcho một nhân vật kprepends &'k'vào chuỗi x, trong khi '%':q:'\\':k:q:xprepends %'\k', đó là hình thức dữ liệu Quine ban đầu của họ.
  • Do đó, y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:xlà các tham số phù hợp để xây dựng lại biểu diễn dữ liệu quine, được thêm vào cuối cùng z(chuỗi trống), và sau đó được chuyển sang hàm sau.
  • y(:)#y(:) là các tham số phù hợp để thêm mã lõi của quine vào chuỗi, mà không cần sửa đổi khác.
  • Cuối cùng, không \x->xđược làm gì với quine được xây dựng, được trả lại.

9

Perl 6 , 3 quines, 274 byte

Quine 1, 52 byte

my&d={S{\d}=$_};say
d
Q{my&d={S{\d}=$_};say
d
Q{4}}

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

Quine 2, 102 byte

printf	|(q[printf	|(q[@]xx	2	Z~|(q[printf	|(q[!3]]Xx	qw[1	0]))]xx	2	Z~|(q[printf	|(q[!3]]Xx	qw[1	0]))

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

Quine 3, 120 byte

<'.EVAL'.UC,' GIVEN ',「「PRINT "<'.EVAL'.UC,' GIVEN ',「「".UC,.UC,"」」>.LC",".EVAL.EVAL".UC」」>.lc.EVAL.EVAL

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

Xác minh các bộ byte riêng biệt

Có rất nhiều thao tác để có được câu hỏi thứ ba đó. Perl 6 có 4 phương pháp đầu ra (mà tôi biết), say, put, printprintf. Cả hai sayputđầu ra mới, vì tôi không thể sử dụng cả hai. put, print, printfTất cả đều chứa pt. Chúng ta có thể khắc phục điều này một phần bằng cách EVALsử dụng chữ hoa PRINT. Từ đó, tôi không nghĩ có thể có được 4 quines ... (mặc dù có lẽ giống nhưshell "echo 'quine'" có thể hoạt động)

Sau đó, chúng ta có thể giải quyết các vấn đề về khoảng cách bằng cách sử dụng các loại khoảng trắng khác nhau để tách các toán tử, khoảng trắng, tab và dòng mới.

Giải thích:

Câu 1:

my&d={        };         # Declare a function d which 
      S{\d}=$_           # Which substitutes a digit with the string again
                say      # Print with a newline
d                        # The function
Q{my&d={S{\d}=$_};say    # Applied to the string with the program
d
Q{4}}                    # With a digit where the it should be inserted again

Câu 2:

Đây là một quine trong định dạng printf |(q[printf q[%s]]xx 2), tức là nó định dạng một bản sao của chuỗi vào chính nó. Tuy nhiên, chúng tôi không thể sử dụng svì nó được sử dụng trong các câu hỏi trước say. Vì vậy, chúng tôi sử dụng toán tử OR chuỗi ( ~|) trên @!3, để tạo ra %sphần, nhưng chúng tôi không thể làm điều đó cho cả chuỗi định dạng và chuỗi được chèn, vì vậy chúng tôi phải thực hiện Z~với chuỗi bổ sung và chuỗi trống, mặc dù sau đó chúng tôi không thể sử dụng ,để tách hai phần, vì vậy chúng tôi sẽ thực hiện Xx qw[1 0]chuỗi nhân với 1 và 0.

printf |(                                  )      # Print with formatting
         q[...]       # The string of the program
               xx 2   # Duplicated
                    Z~| (                 )     # String or'd with
                         q[...]                 # A copy to insert the %s
                                Xx              # String multiplied to
                                   qw[1 0]      # itself and an empty string

Câu 3:

Đây là một quine EVAL cố gắng hết sức để làm cho mọi thứ viết hoa để tránh xung đột với các quine khác. Điều này bao gồm một nhiều của EVALs cũng như khá nhiều lcucđể chuyển đổi giữa các trường hợp.

<...>.lc.EVAL        # Evaluate the lowercase version of the string which results in
.EVAL  given  「print "<'.eval'.uc,' given ',「「".uc,.uc,"」」>.lc",".eval.eval".uc」
             .EVAL   # Evaluate again 

.EVAL  given  「...」   # Set the string to $_ and pass it to .EVAL
print "<'.eval'.uc,' given ',「「".uc       # Print the first half of the quine uppercased
                                   ,.uc   # Print the string uppercased
                                       ,"」」>.lc"  # Print the .lc part lowercased
                                                ,".eval.eval".uc # Print the EVAL part uppercased

9

MathGolf , 4 5 6 quines, 193,535 byte

9 byte

ÿ'ÿ⌐_'ÿ⌐_

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

45 byte

û]∙ûxôû¬ûûûûû╡¬ûô╡û╡xûxxû¬ô]∙xô¬ûûû╡¬ô╡╡xxx¬ô

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

49 byte

ùa6æù\a\ù+6┼ù\ùùùùù\ù§\+ùΣ\Σa6æ\a\+6┼\ùùùù\§\+Σ\Σ

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

99 byte

"""▐ ⌠▌ ⌠▌ ⌠▌ ⌠ ⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠ ⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠"`~

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

4488 byte

♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((♠((((((((((((((((((((((((((((((((((((((((((((DÄß─·ö♠,♦M-$*DÄß─ö7($$$qq$Äq╘

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

188.845 byte

Tôi thực sự không thể liên kết với cái này, vì vậy đây là chương trình Perl 6 tạo ra quine thực tế

Xác minh tính khác biệt

Tôi chắc chắn có thể vắt kiệt một thứ khác trong số này, mặc dù tôi nghĩ rằng tôi đã hết cách để đẩy dây thẳng vào ngăn xếp, vì vậy tôi sẽ phải dùng đến các phương pháp lạ. Ngay cả các phương pháp lạ cũng đến khi tôi thử lần thứ sáu. Trong một số trường hợp, các quines có thể ngắn hơn, nhưng tôi đang giảm các byte đã sử dụng để chuẩn bị.

Được rồi, về mặt kỹ thuật tôi có thể thực hiện thêm một câu hỏi nữa, vì tôi vẫn có một vài toán tử mà tôi cần (chuỗi đẩy, chuỗi tăng, sao chép, ánh xạ, bật), đó là vòng lặp hạn chế chúng tôi. Các {}toán tử duy nhất có thể chỉ ra một khối mã có độ dài tùy ý và tôi thực sự cần chúng trong quine thứ 6. Tôi có thể sử dụng một số khối mã khác, nhưng chúng bị giới hạn và tôi nghi ngờ các phần lặp sẽ ngắn như vậy, vì chúng tôi sắp hết các toán tử dễ dàng.

Được rồi, một số giải thích muộn màng:

Tất cả các quines có cấu trúc gần như giống nhau:

  • Đẩy một chuỗi hoặc danh sách các chuỗi hoặc danh sách các ký tự vào ngăn xếp.
  • Kết hợp tất cả vào một danh sách
  • Sao y danh sách
  • Ánh xạ qua bản sao, in / đẩy các ký tự được sử dụng để lấy các ký tự gốc
  • In danh sách ban đầu của các ký tự dưới dạng chuỗi

Câu 1:

Điều này về cơ bản giống như câu tôi đã đăng trong câu hỏi quine bình thường.

ÿ'ÿ⌐_'ÿ⌐_
ÿ            Push the next 4 bytes as a string
 'ÿ⌐_        Stack ["'ÿ⌐_"]
     'ÿ      Push the byte ÿ (I realise I could have used this in a later quine)
       ⌐     Rotate the ÿ to the bottom of the stack : ["ÿ", "'ÿ⌐_"]
        _    Duplicate top of stack: ["ÿ", "'ÿ⌐_", "'ÿ⌐_"]
             Implicitly print stack joined together : ÿ'ÿ⌐_'ÿ⌐_

Câu 2

û                Push the next 2 bytes as a string
 ]∙              Stack: ["]∙û"]
   û  û...      Repeat this for the rest of the code
           ]              Wrap the stack in an array : [["]∙","xô"...]]
            ∙             Triplicate                 : [[..],[..],[..]]
             x            Reverse the top array
              ô           Loop over the array, executing the next 6 instructions
                          Stack: [[..],[..],str]
               ¬          Rotate the stack : [str,[..],[..]]
                ûûû╡      Push the string "ûû" and discard the left character
                    ¬     Rotate the "û" to the bottom : ["û",str,[..],[..]]
                          This produces the initialisation part
                     ô    Loop over the array with the next 6 characters again
                      ╡╡xxx¬      Basically discard the string
                            ô     Flatten the last copy of the array onto the stack
                                  Implicitly output the code

Câu 3:

ùa6æù\a\ù+6┼ù\ùùùùù\ù§\+ùΣ\Σa6æ\a\+6┼\ùùùù\§\+Σ\Σ
ù...          Push the next 3 bytes as a string
              You know how this goes
    a         Wrap the top element in an array
     6æ       Repeat the next 4 instructions 6 times
       \      Swap the two top items
        a     Wrap the top item in an array
         \    Swap back
          +   Combine the two arrays
              This puts all the strings into a single array
           6            Push a 6
            ┼           Push the element two items down (the array)
             \          Swap with the 6 (this basically duplicates the array)
              ùùùù      Push "ùùù"
                  \§    Swap and get the 6th character (wrapping)
                    \   Swap with array : ["ù", [..]]
                     +  Prepend to array (implicitly mapping)
                      Σ\Σ     Join both the lists to strings and output

Câu 4:

"""▐ ⌠▌ ⌠▌ ⌠▌ ⌠ ⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠ ⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠⌠"`~
""             Push the empty string
  "..."        Push some code : ['','...']
       `       Copy the top two elements of the stack : ['','...','','...']
        ~      Evaluate the top element as code : ['','...','']
▐              Prepend the empty string to the code
  ⌠            Push a space and increment by 2 to get a quote
   ▌           Prepend to the array
     ⌠▌ ⌠▌ ⌠   Repeat three more times, leaving the last on top : ['', '""...','"']
              ⌠⌠...       Push a space and increment until it reaches a '`'
                    ⌠⌠... Repeat for the '~' : ['','"""...','"','`','~']
                          Implicitly output

Câu 5:

♠              Push 256
 ((...         Decrement until it reaches the correct byte representing the code
               Repeat for each character of the code
      DÄ       Repeat the next instruction 14 times
        ß      Wrap the top 4 elements in an array
         ─     Flatten the resulting monstrosity
          ·    Triplicate the array
           ö   Map the next 7 instructions over the array
                      Stack : [[..],[..],num]
            ♠         Push 128
             ,        Reverse subtraction : [[..],[..],128-num
              ♦M-$    Push the ( character
                  *   Repeat it 128-num times
                   DÄß─         Gather that up in an array and flatten again
                       ö        Map the next 6 instructions
                        7($$$qq
                    7($$$q    Print a ♠, without newline
                              q   Print the brackets without newline
                                  Stack : [[..],[..]]
                               $     Map the number to their values in the code page
                                Äq   Map print over each element
                                  ╘  Discard the last element of the stack

Câu 6:

Lý do Quine này là quá nhiều thời gian hơn so với những người khác là incrementing dây sử dụng cơ quan đại diện unicode, mà thực sự hút cho một số nhân vật trong các mã, đặc biệt là khi chúng ta đang cố gắng để tạo ra các nhân vật trong các mã, mà thổi phồng mã với hơn 8000 ký tự, sau đó làm tăng phần đại diện một lượng rất lớn.

⌂         Push an * character
 ))...    Increment until we reach the right character + 8
      ♫{ }            Repeat 10000 times
        α             Wrap the top two elements in an array
          ♫{     }    Then repeat 10000 times
            m{{}}     Shallowly flatten the array
                  h∞<     Double the array
                     m{          Map the doubled array to
                       ïí½<¿{    If it is the first half of the array
                             ⌂⌂  Push two asterisks
                               )))...    Increment into a '⌂' (there are something like 8000 )s here, with a couple of ! to help
                                     @   Rotate the top three elements
                                         Stack : ["⌂",char,"*"]
                                      0{     α4<{}=}←  Repeat while the asterisk is not the char
                                        ⌂⌡)   Push a )
                                           @  Rotate it under the char
                                            ) Increment the asterisk
                                                     ;;   Pop the extra copies of the character
                                                       }{  Else
                                                         ⌡⌡⌡⌡}   Subtract 8 from the character
                                                              }{}  End map and flatten array
                                                                   Print implicitly

Câu hỏi cuối cùng này sẽ được giảm đáng kể nếu MathGolf nhất quán về việc các chuỗi có sử dụng trang mã gốc hay không.


Tôi ngạc nhiên bởi sự khéo léo của bạn, tôi thích một số lời giải thích về cách bạn xoay sở để đưa ra những điều này. Người đầu tiên tôi nhận ra từ thử thách quine ban đầu, nhưng phần còn lại trông giống như họ đã mất mãi mãi để đưa ra.
maxb

@maxb Tôi đang làm việc trên một quine thứ sáu, và tôi sẽ đăng giải thích một khi tôi đăng nó hoặc từ bỏ nó. btw, các lệnh chr / ord và các ký tự tăng dần có vẻ không nhất quán. Cái đầu tiên sử dụng trang mã, trong đó cái thứ hai sử dụng unicode điển hình (đó là thứ khiến cho quin thứ 6 trở nên dài)
Jo King

Tôi nhận ra rằng một thời gian sau khi thực hiện nó, tôi chỉ sử dụng chr/ordcho một trong số họ, tôi nên làm cho cả hai sử dụng trang mã thay vì tôi nghĩ.
maxb

6

Python 2, 2 quines, 434 353 349 446 byte

Điều này chủ yếu chỉ để xem liệu tôi có thể làm điều đó trong Python không.

30 byte (bao gồm cả một dòng mới):

z='z=%r;print z%%z';print z%z

và 416 byte, không có dòng mới:

exec"696d706f7274207379730a793d222222696d706f7274207379730a793d7b7d0a7379732e7374646f75742e777269746528276578656322272b792e666f726d6174282722272a332b792b2722272a33292e656e636f6465282268657822292b27222e6465636f64652822686578222927292222220a7379732e7374646f75742e777269746528276578656322272b792e666f726d6174282722272a332b792b2722272a33292e656e636f6465282268657822292b27222e6465636f6465282268657822292729".decode("hex")

(Đã đánh gôn 81 byte nhờ Lynn nhưng đã thêm tải do quan tâm đến dòng mới.)

Giải trình

Cái đầu tiên chỉ là quine Python ngắn tiêu chuẩn , nhưng không được sửa đổi _. Vì đây là Python 2 nên nó cũng không sử dụng (hoặc ).

Cái thứ hai lấy một số suy nghĩ. Chuỗi dài được mã hóa bằng cách sử dụng hexcodec (do đó đảm bảo rằng nó sẽ chỉ chứa 0- 9a- f) và giải mã thành

import sys
y="""import sys
y={}
sys.stdout.write('exec"'+y.format('"'*3+y+'"'*3).encode("hex")+'".decode("hex")')"""
sys.stdout.write('exec"'+y.format('"'*3+y+'"'*3).encode("hex")+'".decode("hex")')

Điều này sử dụng thủ thuật quine để lấy mã nguồn riêng, sau đó mã hóa nó bằng cách sử dụng hex_codecvà sau đó in nó được bao quanh exec"".decode("hex"), sử dụng sys.stdout.writeđể tránh in một dòng mới. Chạy mã này sẽ tạo ra quine thứ hai, đó là cách tôi tạo ra nó.

Tôi nghi ngờ rằng nhiều hơn hai là không thể trong Python, mặc dù tôi muốn thấy nó nếu tôi sai!

Nếu bạn không nhớ quines

Rjan Johansen đã đề xuất những điều sau đây cho câu hỏi thứ hai được mã hóa trước

y="""import sys
sys.stdout.write('exec"'+('y='+'"'*3+y+'"'*3+';exec y').encode("hex")+'".decode("hex")')""";exec y

sẽ ghi được 30 + 248 = 278 byte cho đầu ra sau:

exec"793d222222696d706f7274207379730a7379732e7374646f75742e777269746528276578656322272b2827793d272b2722272a332b792b2722272a332b273b65786563207927292e656e636f6465282268657822292b27222e6465636f64652822686578222927292222223b657865632079".decode("hex")

Việc sử dụng exectheo cách này không phải là gian lận theo quy tắc chính xác của PPCG nhưng nó cảm thấy hơi gian lận đối với tôi (thanh lịch và thông minh, nhưng vẫn gian lận), bởi vì một số ký tự đang được sử dụng làm cả mã và dữ liệu. (Mặc dù phiên bản của tôi không sử dụng exec, mã và dữ liệu là riêng biệt.) Vì vậy, tôi sẽ giữ điểm của mình ở mức 446.


1
"hex"hoạt động thay vì "hex_codec", sẽ giúp bạn tiết kiệm một vài byte!
Lynn

1
Tại sao bạn không chỉ thêm một dòng trống vào cuối câu hỏi đầu tiên nếu theo dõi dòng mới có vấn đề ...?
mbomb007

1
Như thế này . Tôi hiểu đây là một thủ thuật quine khá chuẩn trong các ngôn ngữ với exec / eval.
Ørjan Johansen

1
Tại sao không sử dụng lại định dạng giống như quine đầu tiên? Như thế này?
Jo King

2
print '<tab>',không thêm một khoảng trống cuối cùng. Sử dụng điều này, bạn có thể giảm 85 byte khỏi đề xuất của Jo King: tio.run/ từ
ovs

5

Japt , 2 3 quines, 106 172 byte

Cái đầu tiên là một phiên bản dài dòng của câu trả lời N char quine của tôi .

[91,57,49,100,185,44,85,44,186,57,51,100,185,44,186,49,48,100,185,44,186,85,109,100,185,172,93,172]
[91d¹,U,º93d¹,º10d¹,ºUmd¹¬]¬

Hãy thử nó ở đây .

Quine thứ hai là quine tốt hơn của ETH Producttion , đây là một tiêu chuẩn tốt cho Japt.

"iQ ²"iQ ²

Hãy thử nó ở đây .

Cái thứ ba sử dụng ``và XORing mã char để lưu trữ dữ liệu.

T=`f=fR;Zff-R-ReX%`;`T=\``+T+Tc^#

Hãy thử nó ở đây .

()'vẫn còn có sẵn, nên thể vắt thêm một lần nữa.


1
Tôi thực sự, thực sự muốn thử chơi gôn đầu tiên nhưng tôi biết rằng, với một vài loại bia trên tàu, ngay khi tôi cố gắng thay đổi một nhân vật duy nhất, não tôi sẽ nổ tung! Quines chết tiệt!
Shaggy

@Shaggy Lấy dòng dưới cùng và chạy qua "'[+U+']+R+(Umd)¬"q mccung cấp cho bạn dòng đầu tiên để cập nhật nhanh, nếu đó là bất kỳ trợ giúp.
Nit

Tôi cũng đã tái cấu trúc giải pháp đầu tiên để có sẵn nhiều biểu tượng cốt lõi hơn, thực tế có thể thêm một câu hỏi nữa.
Nit

Đợi đã, bây giờ điểm của bạn cao hơn!
Xù xì

@Shaggy Cố tình như vậy, tôi đang cố gắng nhường chỗ cho một câu hỏi khác, không làm cho nó ngắn hơn.
Nit

4

Gol> <> , 2 3 quines, 17 28 27 26 byte

6 byte

"r2ssH

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

11 10 9 byte

'3d*Wo{|;

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

11 byte

Eh`#Ma0piS0

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

Gol> <> có ba cách để in bất kỳ char nào:

  • o Pop một giá trị và in dưới dạng char
  • H Pop mọi thứ, in dưới dạng char và tạm dừng
  • S"..." In chuỗi ký tự mà không ảnh hưởng đến ngăn xếp

Nhưng tôi không thể tìm ra cách viết một quine bằng cách sử dụng S"..."như phương thức đầu ra duy nhất, vì vậy tôi đã đưa ra hai cách trên, sử dụng hai loại chuỗi ký tự.

Người thứ ba (do Jo Vua) sử dụng plệnh để tạo ra "trong S"khi đang bay, mà lần lượt in tất cả mọi thứ trừ số không ở cuối. Sau đó Ehin số không và thoát.

Bây giờ chúng tôi đã sử dụng hết tất cả các lệnh đầu ra VÀ plệnh này, tôi tin rằng không thể tạo ra một quine khác (trừ khi có ai đó đưa ra S"quine mà không có p).


Làm thế nào về điều này cho S"..."?
Jo King

3

Ruby , 2 quines, 27 + 44 = 71 byte

$><<<<2*2<<2
$><<<<2*2<<2
2

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

s=%q{s=%q{S};s[?S]=s;puts s};s[?S]=s;puts s

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

Tôi chủ yếu bị giới hạn bởi các phương thức đầu ra, ở đây. Có khá nhiều cách để thao tác các chuỗi, nhưng ngoài $><<tất cả các phương thức đầu ra có thể sử dụng dường như giao nhau quá nhiều. Tôi nghĩ rằng có thể có một lối thoát evalnhưng thật khó khăn khi phải lồng nhiều thao tác chuỗi khác nhau.


3

Javascript ES6, 2 quines, 43 + 22 = 65 byte

Câu 1:

(function f(){return[,f,'))'].join('(')}())

Câu 2:

g=z=>"g="+g+";g``";g``

Bạn có thể lưu một vài byte bằng cách không gọi các hàm và sau đó bằng cách sử dụng một mẫu bằng chữ trong cái thứ hai.
Xù xì

2
Vì vậy, JavaScript outgolfs japt
dylnan

@dylnan Mãi cho đến khi nó thêm một quine thứ ba.
Nit

@Shaggy này, cảm ơn bạn đã đóng góp, nhưng tôi bối rối - không nên là một chương trình hoàn chỉnh? Nếu nó có thể là một chức năng, nó phải chỉ in chính nó? Vì vậy, sẽ g=z=>"g="+glà một quine JS hợp lệ?
Pedro A

1
@Nit Tôi sẽ xem những gì tôi có thể làm: P khi dylnan nhận xét, japt chỉ có 2 quines
Pedro A

3

> <> , 2 quines, 8 + 16 = 24 byte

8 byte

#o<}-1:"

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

Lấy từ câu trả lời này .


16 byte

'r3d*d8*7+e0p>>|

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

Này được dựa trên 'r3d*>o<Quine, trừ o<không thể được sử dụng, vì vậy tôi thay thế <bằng |và tự động tạo ra o(111 = 8 * 13 + 7) và đặt nó nơi thứ 2 >là.


2 quines là giới hạn

Thật không may, chúng tôi bị giới hạn bởi số lượng lệnh đầu ra. nkhông hữu ích vì nó chỉ xuất ra các số, vì vậy ophải được thực hiện trong bất kỳ quine nào. Cách duy nhất để tự động tạo olà với p. Vì vậy, một quine có thể sử dụng o, và một quine khác có thể tạo ra nó p, nhưng không thể có quine thứ 3.

Có thể có một quine thứ ba để lại mã nguồn trên ngăn xếp nếu số đó được tính.


2

Java 10, 2 quines, 1448 1248 byte

1350 1122 byte

\u0076\u002D\u003E\u007B\u0076\u0061\u0072\u0020\u0072\u003D\u0022\u0076\u002D\u003E\u007B\u0076\u0061\u0072\u0020\u0072\u003D\u0025\u0063\u0025\u0073\u0025\u0031\u0024\u0063\u003B\u0072\u002E\u0066\u006F\u0072\u006D\u0061\u0074\u0028\u0072\u002C\u0033\u0034\u002C\u0072\u002C\u0039\u0032\u0029\u002E\u0063\u0068\u0061\u0072\u0073\u0028\u0029\u002E\u0066\u006F\u0072\u0045\u0061\u0063\u0068\u0028\u0063\u002D\u003E\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0066\u0028\u0025\u0031\u0024\u0063\u0025\u0063\u0025\u0033\u0024\u0063\u0075\u0025\u0025\u0030\u0034\u0058\u0025\u0031\u0024\u0063\u002C\u0063\u0029\u0029\u003B\u007D\u0022\u003B\u0072\u002E\u0066\u006F\u0072\u006D\u0061\u0074\u0028\u0072\u002C\u0033\u0034\u002C\u0072\u002C\u0039\u0032\u0029\u002E\u0063\u0068\u0061\u0072\u0073\u0028\u0029\u002E\u0066\u006F\u0072\u0045\u0061\u0063\u0068\u0028\u0063\u002D\u003E\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0066\u0028\u0022\u005C\u005C\u0075\u0025\u0030\u0034\u0058\u0022\u002C\u0063\u0029\u0029\u003B\u007D

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

Tương đương với:

v->{var r="v->{var r=%c%s%1$c;r.format(r,34,r,92).chars().forEach(c->System.out.printf(%1$c%c%3$cu%%04X%1$c,c));}";r.format(r,34,r,92).chars().forEach(c->System.out.printf("\\u%04X",c));}

Giải trình:

v->{                   // Method with empty unused parameter and no return-type
  var r="v->{var r=%c%s%1$c;r.format(r,34,r,92).chars().forEach(c->System.out.printf(%1$c%c%3$cu%%04X%1$c,c));}";
                       //  Unformatted source code
  r.format(r,34,r,92)  //  Formatted quine
   .chars()            //  Loop over the characters as integers
   .forEach(c->System.out.printf("\\u%04X",c));}
                       //   Print "\u" with hexadecimal value of these characters

126 byte

v->{int i='}'-'[';var s="v->{int i='}'-'[';var s=%c%s%c;System.console().printf(s,i,s,i);}";System.console().printf(s,i,s,i);}

System.console()sẽ trả về nullkhi không được cung cấp, vì vậy TIO trả về a NullPointerExceptiontrong trường hợp này .

Để chứng minh đó là một câu hỏi hay, hãy thay thế System.console()bằng System.out: Hãy thử trực tuyến.

Giải trình:

v->{              // Method with empty unused parameter and no return-type
  int i='}'-'[';  //  Integer `i` = 34 (unicode value for double-quote)
  var s="v->{int i='}'-'[';var s=%c%s%c;System.console().printf(s,i,s,i);}";
                  //  Unformatted source code
  System.console().printf(s,i,s,i);}
                  //  Print formatted quine

Giải thích chung:

Trong Java, một thường được thực hiện như thế này:

  • String schứa mã nguồn chưa được định dạng.
  • %sđược sử dụng để nhập 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.
  • s.format(s,34,s) đặt tất cả lại với nhau

Trong trường hợp đó, hàm lambda quine ngắn nhất trong Java 10 sẽ là ( 82 byte ):

v->{var s="v->{var s=%c%s%1$c;return s.format(s,34,s);}";return s.format(s,34,s);}

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

Vì cách duy nhất để có hai quine trong Java là sử dụng phiên bản unicode \uHEXA, được chuyển đổi thành các ký tự trong quá trình biên dịch, tôi không thể sử dụng các ký tự 0123456789ABCDEF\utrong phiên bản không unicode. Vì vậy, phiên bản không unicode nhỏ hơn sẽ sử dụng System.console()thay vì returnhoặc System.out(cả hai đều chứa 'u'), và sẽ sử dụng '}'-'['và hai lần %cthay vì 34%1$c.

Một số điều cần lưu ý về phiên bản unicode:

  • Tôi đang có mục đích sử dụng %04Xthay vì %04x(cho chữ hoa lục giác thay vì chữ thường).
  • Tôi đang sử dụng 92, %c%3$cđể định dạng dấu gạch chéo.
  • Rõ ràng, việc sử dụng vốn \Uthay vì chữ thường \ukhông được phép, nếu không tôi sẽ chỉ sử dụng returntrong phiên bản không có mã ngắn hơ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.