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).
print("Hello World!")
juga kode Ruby yang valid