Viết một bán kết


10

Giả sử bạn có 2 ngôn ngữ, AB. Một chuỗi slà một bán nguyệt trong ABnếu nó thỏa mãn các điều kiện sau:

  1. slà một quine trong ngôn ngữ A.
  2. slà một polyglot trong AB.
  3. Đầu ra của việc chạy snhư một Bchương trình là một chuỗi khác nhau s', đó là một quine trong B.

Mục tiêu của thử thách này là viết một ngữ nghĩa bằng hai ngôn ngữ riêng biệt. Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng, với câu trả lời sớm nhất được sử dụng như một bộ bẻ khóa.

Quy tắc cho Quines

Chỉ có quines thực sự được chấp nhận. Đó là, bạn cần in toàn bộ mã nguồn nguyên văn sang STDOUT, không có :

  • đọc mã nguồn của bạn, trực tiếp hoặc gián tiếp.
  • dựa vào môi trường REPL chỉ đơn giản là đánh giá và in mọi biểu thức bạn cung cấp.
  • dựa vào các tính năng ngôn ngữ chỉ in ra nguồn trong một số trường hợp nhất định.
  • sử dụng thông báo lỗi hoặc STDERR để viết tất cả hoặc một phần của quine. (Bạn có thể viết mọi thứ cho STDERR hoặc đưa ra các cảnh báo / lỗi không nghiêm trọng miễn là STDOUT là một câu hỏi hợp lệ và các thông báo lỗi không phải là một phần của nó.)

Hơn nữa, mã nguồn của bạn không được bao gồm hoàn toàn bằng chữ (cho dù chúng là chuỗi ký tự, chữ số, v.v.) và / hoặc NOP. Ví dụ, `12là một polyglot trong Jelly và Pyth, nhưng trong Jelly nó là NOP và một chữ số, vì vậy nó không hợp lệ.

Bất kỳ đầu ra không thể ngăn chặn nào (như thông báo bản quyền, thông báo khởi động / tắt máy hoặc nguồn cấp dữ liệu theo dõi) có thể bị bỏ qua trong đầu ra vì tính hợp lệ của quine.

Quy tắc cho Polyglots

Hai ngôn ngữ được sử dụng phải khác biệt rõ ràng. Đặc biệt:

  • Chúng không được là các phiên bản khác nhau của cùng một ngôn ngữ (ví dụ: Python 2 so với Python 3).
  • Chúng không được là các phương ngữ khác nhau của cùng một ngôn ngữ (ví dụ Pascal so với Delphi).
  • Một ngôn ngữ có thể không phải là tập hợp con của ngôn ngữ kia (ví dụ C so với C ++ 1 ).
  • Một ngôn ngữ có thể không phải là một dẫn xuất tầm thường của ngôn ngữ kia (ví dụ Matlab so với Octave 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck so với tất cả các dẫn xuất brainfuck tầm thường khác).

Quy tắc linh tinh

  • Bạn không thể chấp nhận đầu vào từ STDIN (hoặc bất kỳ nguồn nào khác). Nếu ngôn ngữ bạn chọn phải lấy đầu vào, thì đầu vào phải trống (chuỗi trống, được lấy từ /dev/null, v.v.) hoặc đầu ra của chương trình không được phụ thuộc vào đầu vào.
  • Đối với thử thách này, bạn phải viết một chương trình hoàn chỉnh. Yêu cầu mã bổ sung để chạy giải pháp là không được phép (chẳng hạn như gán và gọi hàm lambda được xác định trong giải pháp).

1: Có, tôi biết rằng C không thực sự là một tập hợp con của C ++. Tuy nhiên, nó đủ gần để được coi là một cho mục đích đa hình, vì vậy tôi đang tính nó cho thử thách này.

2: Giống như điểm 1 ở trên, mặc dù Octave về mặt kỹ thuật không tương thích 100% với Matlab, nhưng nó được thiết kế để tương thích và đủ gần để cho phép một polyglot Matlab / Octave tầm thường hóa thách thức.


Các khối sao chép của ESMin có được phép không?
lirtosiast

@ThomasKwa Tôi không quen thuộc với ESMin, vậy bạn có thể cho tôi nghe nhanh không?
Mego

Có một lệnh để bắt đầu một khối sao chép, lấy mã nguồn của mọi thứ qua nó. Tôi nghĩ rằng các ngôn ngữ chơi gôn JS khác cũng có thể có một ngôn ngữ.
lirtosiast

@ThomasKwa Điều đó sẽ không được phép theo quy tắc đầu tiên trong quy tắc quine (không đọc mã nguồn, trực tiếp hoặc gián tiếp).
Mego

1
@Downgoat Miễn là nó không vi phạm bất kỳ quy tắc nào khác, hoàn toàn. Lạm dụng quirks là loại mục tiêu của trang web này :)
Mego

Câu trả lời:


6

GolfScript + Fission , 19 18 byte

{".~
'!+OR"
2<}.~

Các linefeed trailing là cần thiết.

Đây là một câu hỏi thực sự trong GolfScript. Hãy thử trực tuyến!

Trong phân hạch, nó in

'!+OR"

đó là một quine thực sự trong phân hạch . Hãy thử trực tuyến!

Giải trình

Trong GolfScript, mọi thứ đều có dạng

{...}.~

là một quine miễn là ...để lại một chuỗi với ".~"trên ngăn xếp. Các .bản sao khối, sao cho có một bản sao được in ở cuối và ~thực thi nó, vì vậy chúng ta có thể sử dụng nội dung của nó để in .~chính nó. Trong trường hợp này, khối đẩy chuỗi

".~
'!+OR"

và sau đó cắt nó thành hai ký tự đầu tiên 2<.

Chương trình phân hạch thực sự hoạt động chính xác giống như bản thân , vì dòng thứ nhất và thứ ba hoàn toàn bị chương trình bỏ qua.


6

Ruby + (JavaScript hoặc Python 3), 76 byte

Đây là một thách thức khác có thể được giải quyết bằng ngôn ngữ yêu thích mới của tôi, tập hợp con gần như phổ biến của Ruby, JavaScript và Python 3; và cho rằng chúng tôi chưa có câu trả lời nào bằng các ngôn ngữ công khai, và nhiều người muốn xem các giải pháp ngôn ngữ không chơi gôn, tôi nghĩ rằng tôi đã đóng góp một. Thậm chí tốt hơn, cùng một câu trả lời giải quyết thách thức theo nhiều cách khác nhau cùng một lúc.

Đây là s:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

Đây là một câu đố trong Ruby. Nó không phải là một câu hỏi trong JavaScript hoặc Python 3; nếu bạn chạy nó bằng một trong hai ngôn ngữ đó, thì đầu ra của nó s'có một dòng mới và do đó sẽ khác:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

Tuy nhiên, s'là một quine polyglot trong JavaScript và Python 3! (Như thường lệ đối với tôi, tôi đang sử dụng triển khai JavaScript của Rhino, để thuận tiện (vì nó chạy từ dòng lệnh thay vì cần trình duyệt) và vì nó có thư viện tiêu chuẩn kỳ lạ printghi vào đầu ra tiêu chuẩn.) Cả hai ngôn ngữ tạo ra s'như là kết quả của việc chạy một trong hai chương trình.

Như một phần thưởng, chương trình này cũng giải quyết vấn đề ngược lại. Nếu bạn quyết định chạy s'trong Ruby, nó sẽ in slại chương trình gốc . Như vậy, s'là một câu trả lời hợp lệ (nhưng hơi dài hơn, ở mức 77 byte) cho câu hỏi.

Tại thời điểm này, tôi gần như bắt đầu nghĩ rằng "sự khác biệt trong việc liệu đầu ra có kết thúc với một dòng mới có đủ để tính hai chương trình là khác nhau hay không" nên được coi là một lỗ hổng tiêu chuẩn, vì đây dường như là một bộ ngôn ngữ thứ hai (ngoài GolfScript / CJam nổi tiếng) trong đó có thể thực hiện thủ thuật này.


2

Vitsy (chế độ an toàn) và Y, 9 byte, không lọc.

' Ugrd3*Z

Trong Vitsy, đây là một quine. Trong Y, bản in này Ugrd3*Z'; Tuy nhiên, khi chạy, bản in Ugrd3*Z'này là một câu hỏi trong Y. Y hoãn lại câu hỏi, tuy nhiên.

Những gì Vitsy thấy:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Những gì Y thấy:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)

1
Lưu ý rằng điều này chỉ hoạt động ở chế độ An toàn, hoặc, đúng hơn, nó có một số ... tác dụng phụ ngoài ý muốn ở chế độ không an toàn.
Addison Crump

1

CJam + GolfScript, 9 byte

"0$p"
0$p

Đây là một câu chuyện trong CJam. Trong GolfScript, nó tự xuất ra một dòng mới, đó là một điểm trừ trong GolfScript.

Tôi không chắc chắn liệu CJam có nên được coi là một dẫn xuất tầm thường của GolfScript hay không. Nhưng tôi nghĩ chúng khá khác nhau và ít nhất là không tầm thường.

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.