Polyglots adalah program yang valid dalam berbagai bahasa pemrograman secara bersamaan. Sebagian besar polyglots ditulis sedemikian rupa sehingga konstruksi tertentu dari satu bahasa ditafsirkan sebagai komentar dari bahasa lain (misalnya #define
dalam C ditafsirkan sebagai komentar dalam beberapa bahasa scripting).
Saya ingin tahu apakah mungkin membuat polyglot non-sepele yang tidak mengandung komentar, tetapi juga segera berubah ketika Anda menghapus karakter non-spasi putih, karena itu saya menantang Anda untuk membuat program seperti itu.
Aturan konkret adalah sebagai berikut:
- (Keluaran). Program Anda harus menghasilkan beberapa output pada konsol di bawah masing-masing bahasa Anda. Artinya, program Anda tidak diizinkan keluar begitu saja tanpa mencetak apa pun.
- (Perbedaan). Sebagai pelonggaran dari definisi polyglot standar, output program dapat bervariasi antar bahasa.
- (Kesalahan). Program Anda tidak boleh menghasilkan kesalahan apa pun (didefinisikan secara luas) di bawah salah satu bahasa Anda. Untuk sebagian besar bahasa, ini didefinisikan sebagai mengembalikan kode keluar non-nol dari kompiler dan / atau penerjemah.
- (Larangan). Penghapusan karakter non-spasi tunggal dari kode Anda harus menyebabkan program Anda mengubah perilakunya di bawah setiap bahasa Anda. Program dapat "berubah" dengan menjadi tidak valid untuk bahasa itu, atau dengan mengubah output yang dihasilkan.
- Ini adalah tantangan kode . Pemenang adalah program yang valid dalam sebagian besar bahasa pemrograman. Ikatan akan rusak karena panjang program yang lebih pendek.
Aturan pembatasan tidak berlaku untuk penghapusan beberapa karakter. Artinya, tidak masalah jika menghapus beberapa karakter secara bersamaan menghasilkan tidak ada perubahan untuk salah satu bahasa Anda.
Perhatikan bahwa aturan pembatasan menyiratkan bahwa Anda tidak dapat menggunakan Whitespace sebagai salah satu bahasa Anda, karena menghapus karakter non-whitespace tidak akan mengubah perilaku program Whitespace.
Berikut adalah contoh sederhana dari program yang memenuhi semua batasan di atas, untuk bahasa Python 2 dan Python 3:
print("Hello World!")
Menghapus karakter apa pun di print
akan menyebabkan kedua bahasa untuk melempar NameError
; menghapus tanda kurung atau tanda kutip akan membuang SyntaxError
, dan menghapus salah satu karakter string akan mengubah output dalam kedua bahasa (Perhatikan bahwa print("hello", "world")
ini adalah program yang lebih halus, tetapi masih valid di bawah aturan di atas).
Contoh ini agak timpang karena Python 2 dan Python 3 sangat mirip, jadi saya tidak akan menerima solusi lain yang hanya menggunakan versi berbeda dari bahasa yang sama (terutama Python 2 dan Python 3).
sumber
print("Hello World!")
juga kode Ruby yang validJawaban:
Bash + GolfScript + CJam
Keluaran
Pesta:
GolfScript:
CJam:
Ada
\x7f
di akhir output CJam.sumber
Bash + Befunge
mencetak 'halo' di befunge.
sumber
bc, GolfScript, Homespring, ya, Oktaf, Scilab (0 byte)
Dijamin mematuhi aturan 4. Bukan pemenang, tetapi akan melakukannya dengan baik di tie break.
Keluaran
bc
GolfScript
Homespring
Hah
Oktaf
Scilab
sumber
What?\n?
-omong, program Anda mencetak .make: *** No targets. Stop.
GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oktaf + Matlab + Scilab + Topline Numerik +? Fueue + huh?
Dalam Golscript, PHP, CJam, Mathematica, bc, Pyth, ///, dan TI-Basic, ditampilkan
10
.Dalam R, output
[1] 10
Dalam Oktaf, itu output
ans = 10
Dalam Matlab dan Scilab, itu output
ans = 10
.Dalam Numeric Topline, itu output
0
.Jika saya memahami Fueue dengan benar, ini menghasilkan baris baru, kemudian bertindak sebagai program kucing.
Dalam ya ?, itu output
sumber
72
ke10
, itu harus dicetak0
dalam Numeric Topline .C ++ & Javascript
Idenya adalah:
C ++: http://codepad.org/SK2wbIDL
Javascript: Cukup salin kode ke konsol browser
Dan satu set perbaikan untuk membuatnya memuaskan
Dari sisi Javascript:
Mengubah
int
,main
atauputs
akan macet dengan pembacaan variabel yang tidak dideklarasikan. Tapibool
danHi from C++!
bisa diubah dengan aman. Mari kita perbaiki:Jika string sama, itu memeriksa keberadaan
bool
, selain itu crash dengan tidak dideklarasikannope
.Sekarang, ada 2 titik koma yang dapat dihapus. Yang pertama diperbaiki esyly - hapus saja baris baru sebelumnya
int
:Yang kedua adalah sebelumnya
}
, jadi saya perlu beberapa penyempitan, valid dalam kedua bahasa dan tidak memerlukan titik koma di akhir dalam C ++ atau menggunakan titik koma di js. Baik:Mustahil untuk menghilangkan titik koma di js sesuai
while
kebutuhan tubuh.Jadi program saat ini adalah:
Dari sisi C ++:
Ada 2 masalah:
eval
dapat memiliki nama apa saja dan semua kode js dapat diubah.Saya akan mencoba memperbaikinya dalam beberapa hari.
sumber
CJam + Golfscript
Oke, ini agak membosankan, tapi ini awal.
Mencetak "0" dalam kedua bahasa. Penghapusan
1
penyebab kesalahan, menghapus,
cetakan "1" sebagai gantinya.Hal yang sama dapat dilakukan dengan
1)
atau1(
. Ada banyak alternatif.(Ya, saya tahu ini bukan kode-golf)
sumber
C dan C ++
C dan C ++ adalah bahasa yang berbeda yang hampir kompatibel satu sama lain - bertentangan dengan apa yang mungkin Anda dengar C ++ bukan superset dari C. Lihat di http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B untuk beberapa perbedaan . Contoh di atas bukan C ++ idiomatik tetapi bekerja dan menghasilkan output yang sama di C dan C ++.
sumber
0
untuk C.0
dapat dihapus.gcc -ansi
pada x86 (atau banyak arsitektur lain: apa yang terjadi adalah bahwa nilai pengembalianputs
ujung berada di register di mana runtime membaca nilai untuk kembali darimain
fungsi).JavaScipt, Lua, R dan Python 3 - 24 byte
Dapat bekerja pada beberapa bahasa lain, saya akan mengujinya terakhir.
JavaScript diuji pada konsol Firefox dan bahasa lainnya di sini , di sini dan di sini
sumber
Perl + Ruby + Python
Saya pikir dalam PHP ini perlu titik koma jika Anda menjalankannya
-R
.sumber
Bash + sh + zsh + ksh, 4 byte:
Sangat sederhana dan memenuhi setiap aturan:
sumber
Bash + sh + zsh + ksh + Windows Batch, 4 byte:
Sangat sederhana dan memenuhi setiap aturan:
Keluaran baris baru yang tidak bervariasi di masing-masing bahasa (tetapi Windows Batch, yang menghasilkan
ECHO is on
, pada bahasa yang Anda gunakan), tidak kesalahan, kecuali ketika huruf apa pun dihapus atau diubah.sumber