Pseudo-quine polyglot quầy phát hiện ngôn ngữ


11

Quines là niềm vui. Polyglots là niềm vui, quá. Polyglot Quines tồn tại, nhưng chúng ta có thể nâng thanh cao hơn nữa.

Viết một tệp có chứa một chương trình hợp lệ cho các ngôn ngữ α, và. Khi tệp được thực thi (có thể sau khi biên dịch nó) dưới dạng ngôn ngữ α hoặc β chương trình, đầu ra của chương trình sẽ có dạng giống như một đệ trình hợp lệ cho cuộc thi này. Nếu tệp của bạn được thực thi như một chương trình ngôn ngữ, nó sẽ xuất ra một số. Giá trị của số này là chuỗi các lần thực hiện trước đó của chương trình được hiểu là số nhị phân.

Lời giải thích này có thể hơi khó hiểu, vì vậy đây là một ví dụ. Đặt, và Γ là các hàm thực hiện đầu vào của chúng dưới dạng ngôn ngữ α, hoặc γ resp. chương trình và trả lại đầu ra của các chương trình này. Đặt x là một bài nộp hợp lệ cho cuộc thi này. Sau đó, biểu thức sau đây, trong đó chúng tôi xử lý x thông qua ngôn ngữ β, α,, α, α, và theo thứ tự này, sẽ mang lại 41, kể từ 41 10 = 101001 2 .

Γ (Β (Α (Α (Β (Α (Β ( x )))))))

Bạn không được cho rằng thực thi áp chót trong chuỗi là thực thi bằng ngôn ngữ. Đối với trường hợp trình đệ trình ban đầu của bạn được thực thi trực tiếp dưới dạng chương trình ngôn ngữ, nó sẽ in 0.

Chương trình của bạn sẽ hoạt động chính xác cho tối đa mười sáu phần tổng hợp trong chuỗi; nghĩa là, số lượng cao nhất mà chương trình của bạn có thể in ra ở cuối là 2 15 - 1. Tất nhiên, chương trình của bạn được phép hỗ trợ các chuỗi biên dịch dài hơn.

Đây là một cuộc thi phổ biến để khuyến khích các giải pháp sáng tạo. Bài nộp với số phiếu cao nhất sẽ giành chiến thắng.


Ba ngôn ngữ có thể bằng nhau (mặc dù nó sẽ làm giảm đáng kể upvote)?
Zgarb

6
@Zgarb Tôi muốn thấy một giải pháp trong đó một số (hoặc tất cả) các ngôn ngữ bằng nhau. Hãy xem cách bạn quản lý để phân biệt các ngôn ngữ bằng nhau.
FUZxxl

1
...Tôi hiểu rồi. : DI đọc thử thách quá vội vàng.
Zgarb

@Zgarb làm thế nào về các phiên bản khác nhau của cùng một ngôn ngữ? magic += Number(System.env.lang_version[-1])
John Dvorak

1
+1 để sử dụng các chữ cái Hy Lạp thay vì nhàm chán a,b,choặc 1,2,3=)
flawr

Câu trả lời:


13

Python 2, Python 3,> <> (Cá)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Giải thích về Python

Các trình thông dịch Python 2 và Python 3 hoạt động tương tự nhau ngoại trừ v=int(1/2*2)biến có các giá trị khác nhau ( 01) vì Python 2 sử dụng phép chia float và Python 3 sử dụng phép chia số nguyên.

Trong mỗi lần chạy, họ thêm biểu thức +0*2hoặc +1*2 vào dòng đầu tiên (sau #;n) và vào xchuỗi (sau lệnh ghi cuối cùng). Trình thông dịch> <> sử dụng bổ sung đầu tiên và Pythons sử dụng bổ sung thứ hai để tạo ra các quines chính xác.

Mã sau B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (Cá) giải thích

Khi bạn chạy trình thông dịch> <>, con trỏ mã bị trả về từ các #kết thúc xung quanh dòng đầu tiên và bắt đầu từ cuối dòng đầu tiên và hướng về phía Tây bắt đầu đẩy các số lên ngăn xếp. Nếu một toán tử đến ( +hoặc *) nó sẽ bật hai phần tử trên cùng từ ngăn xếp và đẩy lùi kết quả. Với phương pháp này, chúng tôi kết thúc với biểu diễn cơ sở2 của các lần chạy trước ( 13trong ví dụ trước). Đây là số lượng mong muốn để chúng tôi xuất nó nvà kết thúc với ;.


Điều này là khá tốt đẹp.
FUZxxl
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.