In miếng Polyglot


22

Thông thường, các đa âm được xây dựng theo cách mà mỗi ngôn ngữ có thể bỏ qua các phần của mã hiện diện cho các ngôn ngữ khác, bằng cách gói chúng trong chuỗi ký tự, sử dụng cú pháp nhận xét hoặc các thủ thuật tương tự khác.

Mục tiêu của bạn là viết một polyglot trong đó đầu ra cho mỗi ngôn ngữ là mã từ polyglot tạo ra đầu ra đó. Cụ thể, đầu ra phải được xây dựng từ mã polyglot chỉ với việc xóa và nó phải là một quine trong ngôn ngữ đã cho.

Quy tắc

  • Chỉ cho phép các quines thích hợp (không đọc mã nguồn, không lấy đầu vào, đầu ra phải ở STDOUT hoặc thay thế gần nhất nếu STDOUT không phải là một tùy chọn và các chương trình phải bao gồm nhiều hơn chỉ là chữ được in ngầm).
  • Vì các ngôn ngữ khác nhau có thể sử dụng các bảng mã khác nhau, các byte thô là vấn đề quan trọng ở đây. Ví dụ: nếu ngôn ngữ A sử dụng UTF-8 và ngôn ngữ B sử dụng CP437, mã (hex) C3 88 46 47sẽ ÈFGdành cho ngôn ngữ A và ├êFGngôn ngữ B.
  • Tất cả các đầu ra phải khác biệt (một lần nữa, so sánh các byte thô). Điều này tránh sự phức tạp khi cố gắng hạn chế các phiên bản ngôn ngữ nhỏ - nếu hai ngôn ngữ sử dụng cùng một phần mã để làm điều tương tự, bạn không thể yêu cầu cả hai.
    • Nếu bạn có hai ngôn ngữ A và B XYlà đầu ra hợp lệ ở cả hai, nhưng YZcũng hợp lệ trong B, bạn có thể chọn XYlàm đầu ra cho A và YZlàm đầu ra cho B, vì vậy bạn có thể yêu cầu cả hai ngôn ngữ đó trong điểm của mình ( nhưng bạn không thể yêu cầu XYcả hai ngôn ngữ vì quy tắc trên).
  • Tất cả các đầu ra phải càng ngắn càng tốt. Ví dụ: nếu mã của bạn là print('foo')#something, đối với Python 3 (bỏ qua thực tế là đầu ra không đúng), mã bạn cần xuất sẽ là print('foo'), và print('foo')#sẽ không được phép. Nếu có nhiều chuỗi có độ dài bằng nhau (tối thiểu) tạo ra đầu ra chính xác, bạn có thể chọn bất kỳ chuỗi nào trong số chúng.
  • Đệ trình phải là đa âm trong ít nhất 2 ngôn ngữ.
  • Điểm của bạn sẽ được đưa ra bởi (number of programming languages with distinct outputs)**3/(total byte size of polyglot). Điểm cao nhất sẽ thắng. Trong trường hợp hai bài nộp đạt được cùng số điểm, bài nộp đạt được điểm đó trước sẽ giành chiến thắng.

2
Quy tắc thứ hai đến cuối cùng có vẻ như chúng ta cần chứng minh rằng không thể đánh golf kết quả cuối cùng bằng bất kỳ cách xóa có thể nào khác. Đó có phải là cố ý?
Martin Ender


Làm thế nào để bạn xác định "xóa" trong trường hợp ngôn ngữ có các lệnh không dài 8 bit? Bạn có xóa từ nguồn một lệnh tại một thời điểm hoặc một byte tại một thời điểm không?

@MartinEnder Lòng tin tốt có thể được giả định. Trừ khi ai đó tìm thấy một quine ngắn hơn có thể được hình thành từ polyglot, câu trả lời được tin cậy là hợp lệ.
Mego

@ ais523 Mọi thứ đều được thực hiện ở mức byte.
Mego

Câu trả lời:


11

GolfScript + CJam + Phân hạch 2 + Jelly , 4 ngôn ngữ, 24 byte, điểm 2.667

Hãy bắt đầu với kết xuất hex:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

Đối với GolfScript, CJam và Fudge 2, chúng tôi diễn giải điều này trong một số mã hóa byte đơn tương thích ASCII như ISO 8859-1 (mã hóa chính xác không thực sự quan trọng, vì dù sao ngôn ngữ chỉ xác định toán tử cho các ký tự ASCII):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

Đâu <DEL>là nhân vật điều khiển 0x7f.

Trong Jelly, điều này được coi là trong trang mã riêng của Jelly, nơi nó trông giống như thế này:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

Dòng etrên cùng là một biến không xác định và #nhận xét phần còn lại của dòng, vì vậy bản in này

"0$p"
0$p

với một linefeed trailing. Đây là phiên bản polyglot GolfScript / CJam của quine tiêu chuẩn:

".p"
.p

Hãy thử đa âm.| Hãy thử quine.

Camam

Ở đây, e#nhận xét dòng cuối cùng, vì vậy hầu như giống hệt, bản in này

"0$p"
0$p

không có một linefeed trailing.

Hãy thử đa âm |Hãy thử quine.

Phân hạch

Phân hạch chỉ nhìn thấy dòng thứ hai tiêu chuẩn phân hạch, nên nó in

'!+OR"

Tôi không thể cung cấp một liên kết trực tuyến cho polyglot ở đây, vì TIO gửi tệp tới Fudge dưới dạng UTF-8, nhưng Fudge đọc byte nguồn theo byte, khiến dòng cuối quá dài. Tuy nhiên, tôi đã thử nghiệm cục bộ này với tệp được mã hóa ISO 8859-1 (trong đó dòng cuối cùng có cùng độ dài với dòng thứ hai), để xác nhận rằng nó hoạt động.

Hãy thử quine.

Thạch

Pilcrow là một bí danh cho các nguồn cấp dữ liệu trong Jelly, vì vậy nguồn này tương đương với:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

Tất cả trừ dòng cuối cùng của chương trình Jelly là "liên kết trợ giúp" (nghĩa là các hàm) có thể bị bỏ qua trừ khi chúng được gọi, miễn là chúng có giá trị về mặt cú pháp. Đây thực sự là lý do 3xuất hiện đầu tiên trong các chương trình của CJam và GolfScript, bởi vì nếu không thì" không thể phân tích cú pháp trong Jelly.

Mặt khác, vì hàm này không được gọi, nên chương trình chỉ tương đương với dòng thứ hai của nó, đó là quine Jelly tiêu chuẩn.

Hãy thử đa âm. | Hãy thử quine.


9

> <> + Python, 2 ngôn ngữ, 51 46 byte, điểm ~ = 0,16 0,17

Vì chưa có câu trả lời nào, tôi sẽ bắt đầu với một câu hỏi đơn giản

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

Dùng thử cho > <>Python

Đối với> <> dòng đầu tiên là một quine (# phản ánh, "đặt toàn bộ dòng trên ngăn xếp, sau đó chúng tôi đẩy 34 (ký tự mã cho") và in mọi thứ), thực thi không bao giờ di chuyển khỏi nó, vì vậy nó thực sự bỏ qua phần còn lại của mật mã.

Đối với Python, dòng đầu tiên là một nhận xét, trong khi dòng thứ hai là một quine (cách tiếp cận tiêu chuẩn trong python, sử dụng thay thế chuỗi bằng cùng một chuỗi như cả hai đối số).


1
Thích ứng nhẹ trên câu trả lời> <> có thể giúp bạn tiết kiệm một số byte: - # "~ r10gol?!; 60. |!
Teal pelican

@Tealpelican Cảm ơn bạn đã nhắc nhở tôi sử dụng .! Tôi đã điều chỉnh quine của mình bằng cách sử dụng phương pháp này, mặc dù tôi thích giữ chuỗi ngược lại (vì cách này tiết kiệm byte) và tránh sử dụng g(vì nó có thể được hiểu là "đọc mã nguồn")
Leo

Đó là một điểm khá công bằng cho việc không sử dụng g. Có một cái nhìn và suy nghĩ một chút về nó, bạn có thể giảm hơn nữa bằng cách sử dụng # (ascii 35) từ ngăn xếp để có được "like; # .09;!? Lo} -1"
Teal pelican

7

JavaScript + Python 2 + Japt, 3 ngôn ngữ, 132 byte, điểm ~ = 0,205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

Bản in này

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

trong JavaScript (chỉ trong Firefox),

S='S=%r;print S%%S';print S%S

trong Python 2 và

`i96d)p2`i96d)p2

trong Japt. ( Kiểm tra trực tuyến! )

JavaScript

Đây là những gì JavaScript thấy:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

Dòng đầu tiên là không có op vì Akhông được sử dụng dưới bất kỳ hình thức nào. Dòng thứ hai đặt Sthành chuỗi S=%s;console.log(S,uneval(S))và dòng thứ ba in nó sau khi thay thế %sbằng unevalđại diện ed củaS (chỉS được gói trong dấu ngoặc kép). Kết quả là một quine trong JavaScript.

Con trăn

Về cơ bản, đây là những gì Python thấy:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

Dòng đầu tiên là khá nhiều không có op; phần quan trọng duy nhất làA=1 ở cuối Điều này biến Athành một số để phép chia số nguyên A//2trên dòng thứ hai không gây ra lỗi.

Dòng thứ hai chủ yếu là cùng một cách, ngoại trừ nó đặt Sthành chuỗi S=%r;print S%%S. Dòng in thứ baS sau khi thay thế %rbằng đại diện thô của S(chỉS được gói trong dấu ngoặc đơn). Kết quả là một quine trong Python 2.

Japt

Đây là mã JavaScript mà trình thông dịch Japt nhìn thấy:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

Như bạn có thể thấy, nó hầu như giống với câu trả lời JavaScript, với một ngoại lệ chính: hai dòng cuối cùng được kết hợp. Kết quả là, đây là những gì người phiên dịch thực sự nhìn thấy:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

Dòng đầu tiên đặt Athành quine Japt và dòng thứ hai Slà một phần của quine JS. Tuy nhiên, trong Japt, chỉ có biểu thức cuối cùng được gửi đến đầu ra; Đây là A, vì vậy đầu ra là `i96d)p2`i96d)p2.


unevalgì Không làm việc cho tôi
Cyoce 8/12/2016

@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ mẹo Nó chỉ hoạt động trong Firefox.
Sản xuất ETH

3

Jolf +> <>, điểm = 2 ** 3/15 = 0,533 ....

"r0:g>o<
"Q«Q«

Làm việc trên việc thêm ngôn ngữ khác vào đây.


2

> <>, Python 2 và 3, 3 ngôn ngữ, 107 byte, điểm = 27/107 ~ = 0.252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Dùng thử trực tuyến: Python 2 , Python 3 , > <>

Đầu ra Python 3 chính xác là dòng thứ hai và đầu ra Python 2 là quine này . Đầu ra> <> là dòng đầu tiên.

Giải trình

Chương trình này dựa trên quine Python 2 cổ điển:

_='_=%r;print _%%_';print _%_

Đầu tiên, để làm cho nó tương thích với cả Python 2 và Python 3, tôi đã thay đổi printcâu lệnh thành một lệnh gọi hàm và thêm một khoảng trắng sẽ có ích sau này:

_='_=%r;print (_%%_)';print (_%_)

Tiếp theo, tôi cần một cách để phân biệt Python 2 với Python 3. Một trong những cách đơn giản nhất là tận dụng sự thật /là phân chia số nguyên trong Python 2, nhưng phân chia float trong Python 3. Do đó, đoạn mã sau ước tính Truetrong Python 2, nhưng Falsetrong Python 3:

1/1is 1

Để làm cho kết quả đầu ra khác biệt giữa hai ngôn ngữ, tôi cần phải chọn lọc loại bỏ dấu ngoặc đầu tiên và dấu ngoặc cuối trong printcuộc gọi (đó là lý do tại sao tôi cần khoảng trắng trước đó - không có khoảng trắng, đó sẽ không phải là printcâu lệnh hợp lệ trong Python 2) . Vì vậy, tôi cần phải sửa đổi khai thác quine như vậy:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Đó là biểu hiện a:-a|9đánh giá lại để 0:9bằng Python 2 và 1:-1bằng Python 3. Như vậy, b"(_%(_,b))"bằng Python 3, nhưng trong Python 2 chữ cái đầu tiên và cuối cùng sẽ bị loại bỏ, để lại _%(_,b). Và với sửa đổi đó, polyglot có giá trị cho thử thách này.

Theo đề xuất của Teal pelican,> <> quine #o<}-1:"có thể được thêm vào khá dễ dàng, nhờ thực tế #bắt đầu một nhận xét một dòng trong Python. Đơn giản chỉ cần chuẩn bị nó và một dòng mới thêm một ngôn ngữ khác và tăng số điểm gần gấp mười lần.


1

Python 2 + Retina, 2 ngôn ngữ, 55 byte, điểm = 2 ^ 3/55 0.145

Tôi đã sử dụng $nthay vì giữ cả hai ASCII hợp lệ.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Trăn , võng mạc

Con trăn

S='S=%r;print S%%S';print S%S

Võng mạc:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 byte, điểm = 3 ** 3//81 ~ 0.333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Tôi đã cố gắng làm một cái gì đó khác biệt với tất cả các ngôn ngữ.

> <> thấy:

"""r00gol?!;60.

Đây là một sửa đổi nhỏ của tiêu chuẩn> <> quine để sử dụng chuỗi ba trích dẫn ở đầu. Điều này cho phép các trích dẫn ba kết thúc cho Python nằm trên một dòng khác.

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

Pyke thấy:

"34.Cp\D\Es"DEp00/

Tôi đã không tạo ra một quine ở Pyke trước đây và do đó phải nghĩ về một. Tôi đã sử dụng các kỹ thuật phân loại truyền thống để tạo ra một chuỗi và sau đó đánh giá nó với tư cách là một đầu vào. Lưu ý để làm việc này mà không có tác động trực quan, cảnh báo sẽ phải bị vô hiệu hóa. Lỗi ra với phép chia cho 0 lỗi trong bước tạo.

Hãy thử nó ở đây! Hoặc chỉ là phần quine.

Python thấy:

Tất cả. Python sử dụng tất cả các mã để tạo ra quine của nó. Tôi đã quyết định nhúng phần quine vào chuỗi doc (mặc dù cuối cùng nó sẽ lưu byte để loại bỏ nhưng tôi nghĩ nó rất tuyệt). Đó là một sửa đổi của kỹ thuật quining tiêu chuẩn.

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.