Giả sử bạn có 2 ngôn ngữ, A
và B
. Một chuỗi s
là một bán nguyệt trong A
và B
nếu nó thỏa mãn các điều kiện sau:
s
là một quine trong ngôn ngữA
.s
là một polyglot trongA
vàB
.- Đầu ra của việc chạy
s
như mộtB
chương trình là một chuỗi khác nhaus'
, đó là một quine trongB
.
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à môn đánh gôn , 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ụ, `12
là 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.