Menghasilkan program A sedemikian rupa sehingga menjalankannya dalam bahasa A menghasilkan Program B, dan menjalankan program A dalam bahasa B menghasilkan program C.
Program B, ketika dijalankan dalam bahasa B menghasilkan Program A, dan menjalankan program B dalam bahasa A menghasilkan program C.
Program C, ketika dijalankan dalam bahasa A atau bahasa B , mencetak "Bahasa salah!".
Program | Language | Result
--------|----------|----------
A | A | Program B
B | B | Program A
A | B | Program C
B | A | Program C
C | A | "Wrong language!"
C | B | "Wrong language!"
Jawaban Anda harus menggunakan templat ini:
Bahasa A / Bahasa B, {a byte} + {b byte} = {total byte} byte
Program A:
a code
Program B:
b code
Program C:
c code
Sumber:
# Language A/Language B, <a bytes> + <b bytes> = <total bytes> bytes
Program A:
a code
Program B:
b code
Program C:
c code
- Tak satu pun dari program ini yang harus menerima input.
- Versi berbeda dari bahasa yang sama dihitung sebagai bahasa yang berbeda. (Meskipun ini tidak disarankan karena mengarah ke solusi yang membosankan)
- Bahasa A dan B harus berbeda.
- Anda tidak boleh membaca kode sumber Anda sendiri dari file. Program mungkin tidak kosong
- Celah standar berlaku.
Petunjuk
- C ++ dan [Python / Bash /
#
bahasa lain yang dikomentari] adalah kombinasi yang baik karena Anda dapat mendefinisikan makro yang diabaikan oleh satu bahasa
Ini adalah kode-golf , sehingga jumlah terkecil dari byte menghitung Program A dan B yang menang.
code-golf
quine
code-generation
polyglot
noɥʇʎԀʎzɐɹƆ
sumber
sumber
Wrong language!
berupa output dalam bentuk apa pun (mis. Semua huruf besar, huruf kecil, dll.)?Jawaban:
Befunge-98 (PyFunge) / > <> , 123 + 123 =
Program A:266 250246 byteCobalah di Befunge-98! , Coba di> <>!
Program B:Coba di> <>! , Cobalah di Befunge-98!
Program C:Cobalah di Befunge-98! Coba di> <>!
Bagaimana itu bekerja:
Baris kedua di kedua program identik dan melayani fungsi yang sama untuk kedua bahasa. Ketika dimasukkan ke kiri dari
<<<<
, itu akan mencetak seluruh baris kedua. Saat memasuki sebelah kanan itu, cetak program C.Ketika baris pertama dijalankan dalam bahasa yang salah, itu masuk melalui bagian produksi program C. Kalau tidak, ia akan mencetak garis paling atas ke belakang dengan
"
di bagian depan dan memasuki bagian penghasil baris kedua.Garis pertama
Program A: Program B:Baris kedua:
Program C
sumber
JavaScript (ES6) / Python 3, 264 + 258 = 522 byte
Program A:
Program B:
Program C:
Mungkin golf ...
Penjelasan JavaScript
Program A:
Program B:
Program C:
Penjelasan python
Program A:
Program B:
Program C:
sumber
Python 3 + JavaScript (Badak), 171 + 171 = 342 byte
Program A (output program B dalam Python 3, program C dalam JavaScript; note trailing newline):
Program B (output program A dalam JavaScript, program C dengan Python; note trailing newline):
Program C (menghasilkan "Bahasa salah!" Dalam kedua bahasa; juga memiliki baris tambahan, yang tidak termasuk dalam skor):
Perhatikan bahwa saya menggunakan dialek JavaScript yang tidak biasa di sini. Orang-orang biasanya menggunakan implementasi browser, tetapi mereka memiliki masalah dengan output, melakukannya dengan cara yang aneh (menggunakan
alert
). Saya menggunakan paket Ubunturhino
yang merupakan implementasi JavaScript "offline" dengan sekumpulan perpustakaan yang berbeda diimplementasikan ke browser tipikal (ini dimaksudkan sebagai bahasa skrip yang dapat diembed); ini penting karena memberikanprint
pernyataan dengan gaya yang sama seperti, misalnya, Python 3.Ini adalah "polyglot sejati" dalam arti bahwa kedua bahasa menjalankan perhitungan yang sama, dalam urutan yang sama, memberi mereka arti yang sama. Mereka berdua memiliki AST yang sama (dan ini cukup sepele untuk membuat quine polyglot Python 3 + JavaScript melalui pengurangan program ini). Tidak ada kode yang spesifik untuk satu bahasa, yang membantu saya menurunkan panjang. Secara kebetulan, Anda harus menggunakan Python 3 sehingga Anda dapat menggunakan titik koma untuk memisahkan pernyataan (jika Anda menggunakan baris baru, Anda harus keluar dari baris baru).
Program ini dimulai dengan mendefinisikan string
s
dand
yang masing-masing memegang penawaran tunggal dan ganda. Hal ini memungkinkan untuk menghasilkan kutipan tanpa harus menyebutkannya nanti dalam kode sumber, menghindari masalah dengan melarikan diri (yang sering tampaknya menjadi masalah dengan quine; alasan utama saya menjawab begitu banyak masalah quine di Underload adalah karena string strings-nya) .Inti dari program adalah array
r
yang memegang tubuh utama dari dua program yang digunakan oleh tantangan; salah satu program (program yang lebih dulu di program A, dan yang kedua di program B) adalah quine yang hampir menghasilkan program asli melalui penggabungan potongan-potongan (sebagian besar diambil darir
dirinya sendiri, dengan beberapa string literal), dan program cetakan lainnya C. Untuk membuat program ini bukan quine yang sebenarnya (yang akan membuat tidak mungkin untuk mendeteksi bahwa kami menjalankan dalam bahasa yang salah), elemen-elemenr
dicetak dalam urutan terbalik;r[0]
dalam program A adalahr[1]
dalam program B, dan sebaliknya.Akhirnya, semua yang diperlukan adalah
eval
menggunakan elemen yang benarr
. Ini dilakukan dengan menggunakan ekspresi([11]+[0])[1]
yang menghasilkan nilai berbeda dalam Python 3 dan dalam JavaScript. Kedua bahasa menguraikannya secara identik, tetapi mereka memiliki gagasan berbeda tentang apa yang ditambahkan ke daftar tambahan:Ketika Python 3 menambahkan
[11]
untuk[0]
, hal itu akan[11, 0]
(concatenating daftar), dan kemudian mengambil elemen kedua dari daftar ([1]
) memberi kita bilangan bulat 0.Ketika JavaScript menambahkan
[11]
untuk[0]
, hal itu akan"110"
(concatenating representasi string daftar), dan kemudian mengambil karakter kedua string ([1]
) memberi kita string"1"
, yang JavaScript cukup senang untuk digunakan sebagai indeks ke dalam daftar.Oleh karena itu, Python 3 menjalankan elemen pertama
r
di kedua program (menghasilkan hampir quine ketika menjalankan program A, dan mencetak program C saat menjalankan program B); JavaScript menjalankan elemen kedua, dan dengan demikian memperlakukan program A dan program B sebaliknya.Kebetulan, jika Anda menjalankan program A di Ruby, itu akan mencetak program B kecuali tanpa baris baru. Jika Anda menjalankan program B di Ruby, itu akan mencetak program C kecuali tanpa baris baru. Dengan kata lain, solusi ini hampir bekerja dengan sekumpulan bahasa yang berbeda, menukar Python 3 untuk Ruby (satu-satunya alasan saya tidak hanya menghapus baris baru dari program B untuk mendapatkan skor 341 adalah bahwa ketidakkonsistenan baris baru dalam program C akan mendiskualifikasi pengajuan).
(Saya sedang mengerjakan "polyglot sejati" seperti ini karena alasan berbeda, yang sekarang saya posting sebagai tantangan, dan menyadari bahwa tekniknya dapat disesuaikan dengan yang ini juga.)
sumber
<pre><code>...</code></pre>
agar mereka muncul."a"[0]
,,"a"["0"]
dan"a"[[[[[[[["0"]]]]]]]]
semuanya mencapai hal yang sama.C / Python, 733 bytes + 733 bytes = 1466 bytes
Program A:
Program B:
Program C:
Saya menggunakan petunjuk Anda menggunakan C / C ++ dengan Python. Tidak terlalu ringkas, tapi saya rasa masih memenuhi syarat.
sumber
Python 2 / Retina, 550 + 645 =
1373125412211195 byteSaya tidak begitu yakin apakah bagian
unichr
-replace
bagiannya dan dapat golf lebih banyak. Saya mencoba menggunakan Python 3, tetapi banyak yang hilang karena harus menambahkan tanda kurung dan menanganinya. Saya mencoba mengaturR=unicode.replace
dan menggunakan itu, tetapi hasilnya menjadi kacau.Perhatikan bahwa Retina memiliki garis belakang baru dalam outputnya secara default, dan ini tidak termasuk dalam program. Jika seseorang mengatakan saya perlu menghapusnya, itu bisa dilakukan sepele. Selain itu, kode Python berfungsi di repl.it, tetapi tidak dijamin berfungsi di Ideone.com.
Perhatikan juga bahwa memimpin dan mengikuti baris baru sangat penting dalam kode di bawah ini.
Program A (Python 2):
638587566550 byte (UTF-8)Python 2 , Retina
Program B (Retina):
735667655645 byte (ISO 8859-1)Retina , Python 2
Program C:
Python 2 , Retina
Ini sebenarnya dapat dibuat lebih pendek menggunakan
#!`W.*!
bukan dua baris terakhir, tetapi ini membuat A dan B lebih lama, karena memiliki`
garis di mana tidak ada satu berarti saya harus menanganinya secara berbeda (karena backtick pertama dalam sebuah garis di Retina adalah pembatas konfigurasi).Penjelasan:
Program C:
Saya menulis Program C pertama selama upaya pertama saya dan sebagian besar tetap sama. Dalam Python, ia mencetak string dan mengabaikan komentar. Di Retina, itu tidak menggantikan apa pun dengan
print"Wrong language!"
dan kemudian menghapus bagian-bagian di sekitarWrong language!
.Untuk lebih memahami program yang kompleks, mari kita lihat versi yang disederhanakan:
Program A (disederhanakan):
Ketika saya mulai dari awal lagi, saya menggunakan
PYTHON
bit sebagai pengganti untuk kode yang harus mencetak Program A. Versi yang lebih sederhana ini membuatnya lebih mudah untuk menjelaskan bagaimana kedua Program B dan Program C akan dicetak.Semua yang ada di
print
dalamnya adalah apa yang mencetak Program B, tetapi pertama-tama, mari kita lihat bagaimana Program C dicetak, karena itu sederhana. Setelahprint"..."
itu#|
. Trik ini menyelamatkan banyak kesulitan yang saya alami dalam upaya pertama saya. Ini memungkinkan Retina untuk mengganti apa pun dengan baris ke-2, yang akan menjadi Program C, kecuali ada#
di depan. 2 baris terakhir hapus dulu#
. Saya digunakan#{2}
untuk mencegah panggung menghapus semua kejadian#
. Saya tidak bisa menggunakan#1`#
seperti yang saya gunakan di Program B, karena menyebabkan masalah untuk memiliki backtick di baris pertama Program A.Yang membawa saya ke tugas berikutnya, mencetak Program B. Anda mungkin telah memperhatikan perbedaan lain dari kode aktual. Tidak ada backticks dalam kode aktual, karena saya menggantinya dengan tab. Saya harus mengganti karakter, karena backtick apa pun akan membuat kode sebelumnya string konfigurasi di Retina, menyebabkan sintaks tidak valid. Saya memilih tab karena terlihat dan titik kode adalah satu digit (
9
). Kode mencetak Program B seperti yang ditunjukkan pada versi sederhana di bawah ini.Program B:
Dua baris pertama akan menggantikan apa pun dengan kode Python, tetapi dengan
#
di depan dan beberapa karakter yang sedikit berbeda. Bagian ini dihilangkan untuk kejelasan. Tahap selanjutnya menghapus itu dulu#
. Kemudian, saya menggunakan tahap Transliterasi (T)#T`²-¹`_o`[^¹]
untuk membatalkan beberapareplace
operasi yang terlihat dalam Program A. lengkap. Menggunakan tahap ini adalah cara untuk menghasilkan pilcrow literal¶
di Retina, yang mungkin tidak mungkin. ¹ Menggantikan·
dengan¶
, dan³
dengan²
. Kejadian¹
akan tetap sama karena mereka diabaikan[^¹]
.Program A:
Baris baru dan tab telah ditambahkan untuk dibaca.
Ini mengikuti struktur umum quine Python berikut:
Saat Anda menambahkan sesuatu sebelum atau sesudah, Anda harus memasukkannya ke dalam string juga.
Saya ingin menggunakan string yang dikutip tiga kali lipat agar mudah menyertakan tanda kutip (menghindari penggunaan garis miring terbalik).
s=U(39)*3;
adalah string'''
. Saya juga menggunakan%s
alih-alih%r
, untuk menghindari beberapa masalah dengan baris baru atau karakter lain yang lolos dengan garis miring terbalik.Jadi sekarang, penggantian. Penggantian pertama
.replace(U(9),U(96));
ada untuk mengganti tab dengan backticks yang kita lihat di Program B. Penggantian ini dilakukan sebelum pemformatan string, karena tab perlu tetap tab di Program A. Penggantian lainnya hanya untuk menghindari penggunaan karakter tertentu dalam 2 jalur Program B:Tiga penggantian terakhir ini mengantisipasi tahap Transliterasi dalam Program B, untuk mencegah agar karakter-karakter tersebut tidak dihapus atau ditransliterasi padahal seharusnya tidak.
Satu-satunya bagian lain dari kode adalah kode dari Program B yang pada dasarnya disalin karakter-untuk-karakter, kecuali untuk perubahan karena penggantian.
¹ Terima kasih kepada Martin untuk tipnya tentang cara mengeluarkan literal
¶
di Retina. Itu membuat semuanya jadi lebih mudah.sumber
Befunge / Python,
381 + 485259 + 345229 + 304 = 533 byteProgram A: Coba di Befunge | Coba dengan Python
Program B: Coba dengan Python | Coba di Befunge
Program C: Coba di Befunge | Coba dengan Python
Penjelasan
Program C: Ini bergantung pada kenyataan bahwa Befunge-93 mengabaikan instruksi yang tidak didukung, jadi sementara yang
p
tidak berbahaya menulis nol pada 0; 0, sisanyaprint
diabaikan hingga<
instruksi yang membalikkan arah. Kemudian mengalir dari kanan ke kiri,+5+5
mendorong 10 (linefeed) ke stack diikuti oleh string pesan, dan kemudian urutan output standar dieksekusi untuk menulis string. Dalam Python itu hanya mencetak dua string literal yang digabungkan bersama-sama, tetapi yang pertama (berisi kode Befunge) dipotong oleh referensi array di akhir ([+5+5:]
).Program B: Baris pertama adalah urutan Befunge yang cukup mendasar untuk mencetak Program C. Satu-satunya hal yang menarik adalah bagaimana ia menghasilkan karakter kutipan menggunakan
50g
(yaitu membaca karakter dari memori) yang lebih efisien daripada menghitung kode ASCII. The#>
(jembatan di atas instruksi arah) pada dasarnya adalah sebuah nop yang mencegah kode yang dilihat oleh Python sejak#
adalah Python komentar karakter. Interpretasi Python dimulai pada baris dua dan hanya mencetak string multiline yang berisi kode sumber Program A.Program A: Dalam Python, tiga baris pertama sekali lagi diabaikan karena mereka mulai dengan
#
, sedangkan baris terakhir hanya mencetak Program C. Kode Befunge bolak-balik melintasi tiga baris pertama, membangun sumber untuk Program B pada stack dalam urutan terbalik. Dimulai dengan tiga tanda kutip, kemudian urutan yang membuat salinan dari sumber Program A, dan akhirnya apa yang pada dasarnya adalah string kode keras dengan pembukaanprint """
dan baris pertama kode Befunge. Maka hanya masalah menuliskannya dengan urutan output standar.Beberapa poin pertikaian:
Saya telah diberitahu bahwa quine menggunakan
g
perintah tidak dianggap quine yang tepat sejauh yang menyangkut komunitas ini. Saya tidak yakin apakah aturan itu akan berlaku untuk tantangan ini juga, tetapi jika demikian, jawaban ini mungkin tidak dianggap sebagai solusi yang tepat juga.Meskipun saya telah mengatakan bahwa Befunge-93 mengabaikan instruksi yang tidak didukung, itu tidak didefinisikan secara teknis dalam spesifikasi, dan Anda harus menggunakan
-q
opsi baris perintah (senyap) dalam juru bahasa referensi untuk menghindari peringatan dalam Program C. Kebanyakan penerjemah lain akan baik-baik saja, tetapi beberapa flakier berpotensi crash. Perhatikan juga bahwa Befunge-98 mencerminkan instruksi yang tidak didukung, sehingga penerjemah 98 hanya akan mengulang tanpa batas.sumber
-q
benderanya sebenarnya "cukup", atau maksud Anda "diam"? Mm-ya, bendera ini cukup berguna.r
instruksi eflect dan 0 yang adap
di sel pertamaPerl / JavaScript, 176 byte + 176 byte = 352 byte
Jangan berpikir saya bisa berbagi 52 byte dari mekanisme yang mendasari karunia, tapi saya senang membangun ini. Saya pikir apa yang saya hasilkan memenuhi kriteria ...
Program A:
Program B:
Program C:
Penjelasan
Menggunakan polyquine Perl / JavaScript saya sebagai basis tetapi menetapkan variabel tambahan
$P
yang mengontrol program mana yang akan dihasilkan. Menggunakan cek yang+[]
benar di Perl, namun salah dalam JavaScript.sumber