Poliglot Terbatas

20

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 #definedalam 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:

  1. (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.
  2. (Perbedaan). Sebagai pelonggaran dari definisi polyglot standar, output program dapat bervariasi antar bahasa.
  3. (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.
  4. (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.
  5. 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 printakan 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).

nneonneo
sumber
@ IngoBürk: Aturan mencegah Anda dari menulis polyglot fungsional yang melibatkan Whitespace, kecuali jika bahasa Anda yang lain juga hanya whitespace.
nneonneo
1
FWIW contoh Anda, print("Hello World!")juga kode Ruby yang valid
Cristian Lupascu
Agak menyebalkan bahwa jawaban sederhana (seperti punyaku) untuk [polyglot] cenderung bisa memiliki banyak bahasa.
Justin
5
Untuk menghindari berbagai variasi bahasa atau bahasa dengan sintaksis yang serupa, akan lebih menarik untuk meminta dua bahasa dihitung hanya berbeda jika program menghasilkan output yang berbeda.
Gilles 'SO- stop being evil'

Jawaban:

13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Keluaran

Pesta:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

Ada \x7fdi akhir output CJam.

jimmy23013
sumber
... tunggu, bagaimana cara kerjanya dalam ketiga bahasa, tanpa berlebihan?
nneonneo
@nneonneo Ini hanya mencetak semua kode yang tidak digunakan dalam bahasa lain.
jimmy23013
8

Bash + Befunge

"echo" $,$,"ol":,,,@

mencetak 'halo' di befunge.

Saeedn
sumber
1
Saya dapat membuktikan bahwa setiap karakter (kecuali spasi) melakukan sesuatu di Befunge. Tapi aku tidak bisa melakukannya untuk Bash. Ini mengesankan.
Justin
7

bc, GolfScript, Homespring, ya, Oktaf, Scilab (0 byte)

Dijamin mematuhi aturan 4. Bukan pemenang, tetapi akan melakukannya dengan baik di tie break.

Keluaran

bc

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Homespring

In Homespring, the null program is not a quine.

Hah

?

Oktaf

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->
Dennis
sumber
2
Saya tahu ada esolang yang secara khusus mencegah 0 quines panjang dengan melakukan hal semacam ini (oh tunggu, itu Homespring ). Saya percaya ya? menghasilkan sesuatu.
Justin
Terima kasih! Sayangnya, saya tidak bisa meyakinkan ya? untuk berjalan di Linux ...
Dennis
1
Yang saya butuhkan adalah paket tambahan untuk mono. Omong What?\n?-omong, program Anda mencetak .
Dennis
1
Juga berfungsi di GNU Make (jika itu bahasa pemrograman):make: *** No targets. Stop.
jimmy23013
1
@ user23013: Benar. Dalam hal ini, itu bukan entri yang valid, karena kode keluar make adalah 2.
Dennis
6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oktaf + Matlab + Scilab + Topline Numerik +? Fueue + huh?

10

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

What?
?
Justin
sumber
1
Juga bekerja di CJam
Agustus
5
Saya tidak berpikir penerjemah interaktif harus diperhitungkan.
nneonneo
2
Ini berjalan dengan baik dalam banyak bahasa, tetapi tidak memberikan output dalam banyak ...
Justin
1
Ini juga berlaku dalam HTML , bc , Matlab dan Scilab . Jika Anda mengubah 72ke 10, itu harus dicetak 0dalam Numeric Topline .
Dennis
HTML bukan bahasa pemrograman sesuai dengan diskusi meta karena tidak memiliki cara aritmatika atau loop sederhana.
Ingo Bürk
3

Sepertinya jawaban ini tidak sepenuhnya benar.
Saya memperbaikinya sebagian, dan akan memperbaiki bagian lain dalam beberapa hari.

C ++ & Javascript

Idenya adalah:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: Cukup salin kode ke konsol browser

Dan satu set perbaikan untuk membuatnya memuaskan

(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.

Dari sisi Javascript:

Mengubah int, mainatau putsakan macet dengan pembacaan variabel yang tidak dideklarasikan. Tapi booldan Hi from C++!bisa diubah dengan aman. Mari kita perbaiki:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

Jika string sama, itu memeriksa keberadaan bool, selain itu crash dengan tidak dideklarasikan nope.

Sekarang, ada 2 titik koma yang dapat dihapus. Yang pertama diperbaiki esyly - hapus saja baris baru sebelumnya int:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");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:

while(0);

Mustahil untuk menghilangkan titik koma di js sesuai whilekebutuhan tubuh.

Jadi program saat ini adalah:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

Dari sisi C ++:

Ada 2 masalah: evaldapat memiliki nama apa saja dan semua kode js dapat diubah.

Saya akan mencoba memperbaikinya dalam beberapa hari.

Qwertiy
sumber
2

CJam + Golfscript

Oke, ini agak membosankan, tapi ini awal.

1,

Mencetak "0" dalam kedua bahasa. Penghapusan 1penyebab kesalahan, menghapus ,cetakan "1" sebagai gantinya.

Hal yang sama dapat dilakukan dengan 1)atau 1(. Ada banyak alternatif.

(Ya, saya tahu ini bukan kode-golf)

Ingo Bürk
sumber
2

C dan C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

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 ++.

Jerry Jeremiah
sumber
Anda dapat menghapus 0untuk C.
Dennis
@ Dennis Not in C89.
Gilles 'SO- stop being evil'
@Gilles: Jika fungsi utama mengeksekusi pengembalian yang tidak menentukan nilai, status terminasi yang dikembalikan ke lingkungan host tidak ditentukan. ( Draft C89 - 2.1.2.2 Hosted environment ) Itu tidak membuat program tidak valid atau mengubah outputnya, jadi untuk keperluan pertanyaan ini, 0dapat dihapus.
Dennis
@ Dennis Saya pikir kode keluar tidak ditentukan dianggap membuat program tidak valid sesuai aturan pertanyaan ini. Jika tidak, buat implementasi C89 di mana program ini mengembalikan kode keluar bukan nol, seperti gcc -ansipada x86 (atau banyak arsitektur lain: apa yang terjadi adalah bahwa nilai pengembalian putsujung berada di register di mana runtime membaca nilai untuk kembali dari mainfungsi).
Gilles 'SO- stop being evil'
@Gilles: Interpretasi saya dari aturan 3 adalah bahwa kompiler harus mengembalikan 0, bukan program.
Dennis
2

JavaScipt, Lua, R dan Python 3 - 24 byte

Dapat bekerja pada beberapa bahasa lain, saya akan mengujinya terakhir.

alert=print;alert(1)

JavaScript diuji pada konsol Firefox dan bahasa lainnya di sini , di sini dan di sini

William Barbosa
sumber
1

Perl + Ruby + Python

Saya pikir dalam PHP ini perlu titik koma jika Anda menjalankannya -R.

print "Hello World!"
hmatt1
sumber
Ini juga berfungsi dengan Python.
Agustus
1
Juga bekerja dengan Lua.
Trebuchette
1

Bash + sh + zsh + ksh, 4 byte:

echo

Sangat sederhana dan memenuhi setiap aturan:

  1. Menghasilkan baris baru di masing-masing bahasa.
  2. Output saat ini tidak bervariasi dengan cara apa pun antara bahasa.
  3. Tidak menghasilkan kesalahan dalam bahasa apa pun ...
  4. ... kecuali ketika salah satu karakter dihapus / diubah.
R. Kap
sumber
0

Bash + sh + zsh + ksh + Windows Batch, 4 byte:

echo

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.

pengguna75200
sumber
1
Jawaban Anda tampaknya hampir identik dengan yang ini: codegolf.stackexchange.com/a/100654/65326
Uriel