Polyglot bị hạn chế


20

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ụ: #definetrong 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:

  1. (Đầ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ì.
  2. (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ữ.
  3. (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.
  4. (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.
  5. Đâ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 printsẽ 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 SyntaxErrorvà 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).


@ IngoBürk: Quy tắc ngăn bạn viết một đa âm chức năng liên quan đến Khoảng trắng, trừ khi bằng cách nào đó, ngôn ngữ khác của bạn cũng chỉ có khoảng trắng.
nneonneo

1
FWIW ví dụ của bạn, print("Hello World!")cũng là mã Ruby hợp lệ
Cristian Lupascu

Thật khó chịu khi những câu trả lời đơn giản (như của tôi) cho một [polyglot] có xu hướng có thể có nhiều ngôn ngữ như vậy.
Justin

5
Để tránh vô số biến thể ngôn ngữ hoặc ngôn ngữ có cú pháp tương tự, sẽ thú vị hơn khi yêu cầu hai ngôn ngữ chỉ khác nhau nếu chương trình tạo ra đầu ra khác nhau.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Đầu ra

Bash:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

Camam

echo{ cat<&3;}-1echop

Có một \x7fkết thúc đầu ra của CJam.


... Đợi đã, làm thế nào để nó hoạt động trong cả ba ngôn ngữ, mà không bị dư thừa?
nneonneo

@nneonneo Nó chỉ đơn giản là in tất cả các mã không sử dụng trong các ngôn ngữ khác.
jimmy23013

8

Bash + Befunge

"echo" $,$,"ol":,,,@

in 'xin chào' trong befunge.


1
Tôi có thể chứng thực rằng mọi nhân vật (trừ không gian) đều làm gì đó trong Befunge. Tôi không thể làm như vậy cho Bash. Điều này thật ấn tượng.
Justin

7

bc, GolfScript, Homepring, huh, Octave, Scilab (0 byte)

Đảm bảo tuân thủ quy tắc 4. Không phải là người chiến thắng, nhưng sẽ làm tốt trong giờ nghỉ giải lao.

Đầu ra

bc

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Quê hương

In Homespring, the null program is not a quine.

Huh

?

Octave

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
Tôi biết có một esolang đặc biệt ngăn chặn 0 quines độ dài bằng cách thực hiện loại điều này (oh chờ đã, đó là ngôi nhà ). Tôi tin hả đầu ra một cái gì đó.
Justin

Cảm ơn! Đáng buồn thay, tôi không thể thuyết phục hả? để chạy trên Linux ...
Dennis

1
Tất cả tôi cần là một gói thêm cho mono. Nhân tiện, chương trình của bạn in What?\n?.
Dennis

1
Cũng hoạt động trong GNU Make (nếu đó là ngôn ngữ lập trình):make: *** No targets. Stop.
jimmy23013

1
@ user23013: Phải. Trong trường hợp đó, đó không phải là mục nhập hợp lệ, vì mã thoát của mã là 2.
Dennis

6

GolfScript + PHP + CJam + Mathicala + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? Fueue + hả?

10

Trong Golscript, PHP, CJam, Mathematica, bc, Pyth, /// và TI-Basic, nó xuất ra 10.

Trong R, nó xuất ra [1] 10

Trong Octave, nó xuất ra ans = 10

Trong Matlab và Scilab, nó xuất ra ans = 10.

Trong Topline số, nó xuất ra 0.

Nếu tôi hiểu đúng về Fueue, nó sẽ đưa ra một dòng mới, sau đó hoạt động như một chương trình mèo.

Trong huh?, Nó xuất ra

What?
?

1
Cũng hoạt động trong CJam
ngày

5
Tôi không nghĩ các thông dịch viên tương tác nên tính.
nneonneo

2
Điều này chạy tốt trong nhiều ngôn ngữ, nhưng không cung cấp đầu ra trong nhiều ngôn ngữ đó ...
Justin

1
Điều này cũng hợp lệ trong HTML , bc , MatlabScilab . Nếu bạn thay đổi 72thành 10, nó sẽ in 0trong Dòng số .
Dennis

HTML không phải là ngôn ngữ lập trình theo thảo luận meta vì nó không có phương tiện số học hoặc vòng lặp đơn giản.
Ingo Bürk

3

Có vẻ như câu trả lời này không hoàn toàn chính xác.
Tôi đã sửa nó một phần, và sẽ cải thiện phần khác trong vài ngày nữa.

C ++ và Javascript

Ý tưởng là:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: Chỉ cần sao chép mã vào bảng điều khiển trình duyệt

Và một bộ các bản sửa lỗi để làm cho nó thỏa mãn

(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.

Từ phía Javascript:

Thay đổi int, mainhoặc putssẽ sụp đổ với việc đọc biến không được khai báo. Nhưng boolHi from C++!có thể được thay đổi một cách an toàn. Hãy sửa nó đi:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

Nếu các chuỗi bằng nhau, nó sẽ kiểm tra sự tồn tại của bool, ngoài ra nó bị treo với không được khai báo nope.

Bây giờ, có 2 dấu chấm phẩy có thể được loại bỏ. Đầu tiên là cố định esyly - chỉ cần xóa dòng mới trước int:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

Thứ hai là trước đây }, vì vậy tôi cần một số co thắt, hợp lệ trong cả hai ngôn ngữ và không yêu cầu dấu chấm phẩy ở cuối C ++ hoặc từ bỏ dấu chấm phẩy trong js. Khỏe:

while(0);

Không thể bỏ dấu chấm phẩy trong js khi whilecần cơ thể.

Vì vậy, chương trình tại thời điểm này là:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

Từ phía C ++:

Có 2 vấn đề: evalcó thể có bất kỳ tên nào và tất cả mã js có thể được thay đổi.

Tôi sẽ cố gắng sửa chúng trong một vài ngày.


2

Câu lạc bộ CJam +

Được rồi, điều này hơi nhàm chán, nhưng đó là một sự khởi đầu.

1,

In "0" bằng cả hai ngôn ngữ. Thay vào đó 1, loại bỏ các nguyên nhân gây ra lỗi, thay vào đó xóa các ,bản in "1".

Điều tương tự có thể được thực hiện với 1)hoặc 1(. Có nhiều lựa chọn thay thế.

(Vâng, tôi biết đây không phải là môn đánh gôn)


2

C và C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C và C ++ là các ngôn ngữ khác nhau gần như tương thích với nhau - trái với những gì bạn có thể nghe thấy C ++ không phải là siêu ngôn ngữ của C. Hãy xem http://en.wikipedia.org/wiki/Compabilities_of_C_and_C%2B%2B để biết một số khác biệt . Ví dụ trên không phải là C ++ thành ngữ nhưng nó hoạt động và tạo ra cùng một đầu ra trong cả C và C ++.


Bạn có thể xóa 0for C.
Dennis

@Dennis Không có trong C89.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Nếu hàm chính thực hiện trả về chỉ định không có giá trị, trạng thái kết thúc được trả về môi trường máy chủ không được xác định. ( Dự thảo C89 - 2.1.2.2 Môi trường được lưu trữ ) Điều đó không làm cho chương trình không hợp lệ cũng như không thay đổi đầu ra của nó, vì vậy với mục đích của câu hỏi này, 0có thể xóa bỏ.
Dennis

@Dennis Tôi nghĩ rằng một mã thoát không xác định được tính là làm cho chương trình không hợp lệ theo các quy tắc của câu hỏi này. Nếu không, hãy tạo một triển khai C89 trong đó chương trình này trả về mã thoát không khác, chẳng hạn như gcc -ansitrên x86 (hoặc nhiều kiến ​​trúc khác: điều xảy ra là giá trị trả về của putskết thúc nằm trong thanh ghi trong đó bộ thực thi đọc giá trị để trở về từ mainhàm).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Giải thích của tôi về quy tắc 3 là trình biên dịch phải trả về 0, không phải chương trình.
Dennis

2

JavaScipt, Lua, R và Python 3 - 24 byte

Có thể làm việc trên một số ngôn ngữ khác, tôi sẽ kiểm tra sau.

alert=print;alert(1)

JavaScript đã được thử nghiệm trên bảng điều khiển của Firefox và các ngôn ngữ khác tại đây , đâyđây


1

Perl + Ruby + Python

Tôi nghĩ trong PHP điều này sẽ cần một dấu chấm phẩy nếu bạn đang chạy với -R .

print "Hello World!"

Điều này cũng hoạt động trong Python.
tháng 8

1
Cũng làm việc với Lua.
Trebuchette

1

Bash + sh + zsh + ksh, 4 byte:

echo

Thực sự đơn giản và đáp ứng mọi quy tắc:

  1. Xuất ra một dòng mới trong mỗi ngôn ngữ.
  2. Đầu ra hiện không thay đổi theo bất kỳ cách nào giữa các ngôn ngữ.
  3. Không tạo ra lỗi trong bất kỳ ngôn ngữ nào ...
  4. ... ngoại trừ khi bất kỳ ký tự nào bị xóa / thay đổi.

0

Bash + sh + zsh + ksh + Windows Batch, 4 byte:

echo

Thực sự đơn giản và đáp ứng mọi quy tắc:

Xuất ra một dòng mới không khác nhau ở mỗi ngôn ngữ (nhưng Windows Batch, đầu ra ECHO is on, trên ngôn ngữ bạn sử dụng), không có lỗi, ngoại trừ khi bất kỳ chữ cái nào bị xóa hoặc thay đổi.


1
Câu trả lời của bạn dường như gần giống với câu hỏi này: codegolf.stackexchange.com/a/100654/65326
Uriel
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.