Polyglots là các chương trình hợp lệ trong nhiều ngôn ngữ lập trình cùng một lúc. Hầu hết các đa âm như vậy được viết theo cách mà các cấu trúc nhất định của một ngôn ngữ được hiểu là nhận xét của ngôn ngữ khác (ví dụ: #define
trong C được hiểu là một nhận xét trong một số ngôn ngữ kịch bản).
Tôi tò mò muốn xem liệu có thể tạo ra một polyglot không tầm thường không chứa bình luận hay không, nhưng cũng thay đổi ngay lập tức khi bạn loại bỏ bất kỳ ký tự không phải khoảng trắng nào, do đó tôi thách thức bạn đưa ra một chương trình như vậy.
Các quy tắc cụ thể như sau:
- (Đầu ra). Chương trình của bạn phải tạo ra một số đầu ra trên bàn điều khiển theo từng ngôn ngữ của bạn. Đó là, chương trình của bạn không được phép thoát ra mà không in bất cứ thứ gì.
- (Phương sai). Như một sự thư giãn của định nghĩa polyglot tiêu chuẩn, đầu ra của chương trình có thể khác nhau giữa các ngôn ngữ.
- (Lỗi). Chương trình của bạn không được tạo ra bất kỳ lỗi nào (được định nghĩa rộng) theo bất kỳ ngôn ngữ nào của bạn. Đối với hầu hết các ngôn ngữ, điều này được định nghĩa là trả về mã thoát khác không từ trình biên dịch và / hoặc trình thông dịch.
- (Sự hạn chế). Việc loại bỏ bất kỳ ký tự không phải khoảng trắng nào khỏi mã của bạn sẽ khiến chương trình của bạn thay đổi hành vi của nó theo mọi ngôn ngữ của bạn. Chương trình có thể "thay đổi" bằng cách trở thành không hợp lệ đối với ngôn ngữ đó hoặc bằng cách thay đổi đầu ra được tạo ra.
- Đây là một thách thức mã . Người chiến thắng là chương trình hợp lệ trong các ngôn ngữ lập trình nhất. Ties sẽ được phá vỡ theo chiều dài chương trình ngắn hơn.
Quy tắc hạn chế không áp dụng cho việc loại bỏ một số ký tự. Đó là, sẽ ổn nếu xóa một số ký tự đồng thời không dẫn đến thay đổi đối với một trong các ngôn ngữ của bạn.
Quan sát rằng quy tắc hạn chế ngụ ý rằng bạn không thể sử dụng Khoảng trắng làm một trong các ngôn ngữ của mình, vì việc xóa bất kỳ ký tự không phải khoảng trắng nào sẽ không thay đổi hành vi của chương trình Khoảng trắng.
Đây là một ví dụ đơn giản về một chương trình đáp ứng tất cả các hạn chế ở trên, cho các ngôn ngữ Python 2 và Python 3:
print("Hello World!")
Xóa bất kỳ ký tự nào print
sẽ khiến cả hai ngôn ngữ ném a NameError
; xóa bất kỳ dấu ngoặc kép hoặc trích dẫn nào sẽ ném SyntaxError
và xóa bất kỳ ký tự chuỗi nào sẽ thay đổi đầu ra bằng cả hai ngôn ngữ. (Lưu ý rằng đó print("hello", "world")
là một chương trình tinh tế hơn, nhưng vẫn hợp lệ theo các quy tắc trên).
Ví dụ này hơi khập khiễng vì Python 2 và Python 3 rất giống nhau, vì vậy tôi sẽ không chấp nhận bất kỳ giải pháp nào khác chỉ sử dụng các phiên bản khác nhau của cùng một ngôn ngữ (đặc biệt là Python 2 và Python 3).
print("Hello World!")
cũng là mã Ruby hợp lệ