Penghitung deteksi bahasa polyglot semu-quine

11

Quines itu menyenangkan. Polyglots juga menyenangkan. Ada Polyglot Quines, tetapi kita dapat menaikkan bilah lebih tinggi lagi.

Tulis file yang berisi program yang valid untuk bahasa α, β, dan γ. Ketika file dieksekusi (mungkin setelah mengkompilasinya) sebagai program bahasa α atau β, output program harus dalam bentuk yang sama dengan pengiriman yang valid ke kontes ini. Jika file Anda dieksekusi sebagai program γ bahasa, itu akan menghasilkan angka. Nilai angka ini adalah rantai dari eksekusi program sebelumnya yang diartikan sebagai angka biner.

Penjelasan ini mungkin agak sulit dimengerti, jadi inilah contohnya. Biarkan Α, Β, dan Γ menjadi fungsi yang mengeksekusi input mereka sebagai bahasa α, β, atau γ resp. memprogram dan mengembalikan output dari program ini. Biarkan x menjadi pengajuan yang valid untuk kontes ini. Kemudian ungkapan berikut, di mana kami memproses x melalui bahasa β, α, β, α, α, β, dan γ dalam urutan ini, akan menghasilkan 41, karena 41 10 = 101001 2 .

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

Anda mungkin tidak berasumsi bahwa eksekusi kedua dari belakang dalam rantai adalah eksekusi dalam bahasa β. Untuk kasus di mana kiriman asli Anda langsung dieksekusi sebagai program γ bahasa, ia akan mencetak 0.

Program Anda harus berperilaku dengan benar hingga enam belas kompilasi dalam rantai; yaitu, jumlah tertinggi yang mungkin dicetak oleh program Anda pada akhirnya adalah 2 15 - 1. Tentu saja, program Anda diizinkan untuk mendukung rantai kompilasi yang lebih lama.

Ini adalah kontes popularitas untuk mendorong solusi kreatif. Pengajuan dengan penghitungan suara tertinggi akan menang.

FUZxxl
sumber
Bisakah ketiga bahasa itu sama (walaupun secara drastis mengurangi upvotes)?
Zgarb
6
@Zgarb Saya ingin melihat solusi di mana beberapa (atau semua) bahasa sama. Mari kita lihat bagaimana Anda mengatur untuk membedakan bahasa yang sederajat.
FUZxxl
1
...Saya melihat. : Aku membaca tantangan terlalu cepat.
Zgarb
@ Zgarb bagaimana dengan versi berbeda dari bahasa yang sama? magic += Number(System.env.lang_version[-1])
John Dvorak
1
+1 untuk menggunakan huruf Yunani alih-alih membosankan a,b,catau 1,2,3=)
flawr

Jawaban:

13

Python 2, Python 3,> <> (Ikan)

#;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])

Penjelasan python

Penerjemah Python 2 dan Python 3 bekerja dengan cara yang sama kecuali v=int(1/2*2)variabel mendapatkan nilai yang berbeda ( 0dan 1) karena Python 2 menggunakan divisi float dan Python 3 menggunakan divisi integer.

Dalam setiap run mereka menambahkan ekspresi +0*2atau +1*2 ke baris pertama (setelah #;n) dan ke xstring (setelah perintah tulis terakhir). Interpreter> <> menggunakan tambahan pertama dan Python menggunakan yang kedua untuk membuat quines yang benar.

Kode setelah 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])

> <> Penjelasan (Ikan)

Ketika Anda menjalankan penerjemah> <>, penunjuk kode memantul kembali dari #wraps di sekitar baris pertama dan mulai dari akhir baris pertama dan menuju Barat mulai mendorong angka ke tumpukan. Jika seorang operator datang ( +atau *) itu muncul dua elemen teratas dari tumpukan dan mendorong kembali hasilnya. Dengan metode ini kita berakhir dengan representasi base2 dari proses sebelumnya ( 13dalam contoh sebelumnya). Ini adalah angka yang diinginkan sehingga kami menampilkan ndan mengakhiri ;.

randomra
sumber
Ini bagus sekali.
FUZxxl