Kısıtlı Polyglot


20

Polyglotlar, aynı anda birden fazla programlama dilinde geçerli olan programlardır. Bu tür poliglotların çoğu, bir dilin belirli yapılarının başka bir dilin yorumları olarak yorumlanacağı şekilde yazılır (örneğin #define, C'de çeşitli kodlama dillerinde bir yorum olarak yorumlanır).

Yorum içermeyen önemsiz olmayan bir çok dilli yapmanın mümkün olup olmadığını merak ediyorum, ancak herhangi bir boşluk olmayan karakteri kaldırdığınızda hemen değişiyor, bu nedenle böyle bir program bulmanıza meydan okuyorum.

Somut kurallar aşağıdaki gibidir:

  1. (Çıktı). Programınız, her bir dilinizin altında konsolda bazı çıktılar üretmelidir. Yani, programınızın hiçbir şey yazdırmadan çıkmasına izin verilmez.
  2. (Varyans). Standart çoklu dil tanımının gevşemesi olarak, programın çıktısı diller arasında değişiklik gösterebilir.
  3. (Hatalar). Programınız, dillerinizin hiçbirinde hata (geniş tanımlanmış) oluşturmamalıdır. Çoğu dil için bu, derleyiciden ve / veya yorumlayıcıdan sıfırdan farklı bir çıkış kodu döndürmek olarak tanımlanır.
  4. (Restriksiyon). Kodunuzdan boşluk olmayan herhangi bir karakterin kaldırılması, programınızın dilinizin her biri altındaki davranışını değiştirmesine neden olmalıdır . Program, o dil için geçersiz hale gelerek veya üretilen çıktıyı değiştirerek "değişebilir".
  5. Bu bir kod mücadelesi . Kazanan, en çok programlama dilinde geçerli olan programdır. Bağlar daha kısa program uzunluğu lehine kırılacaktır.

Kısıtlama kuralı, birkaç karakterin kaldırılması için geçerli değildir. Yani, birden fazla karakteri aynı anda kaldırmanız dillerinizden birinde değişiklik yapmamanız iyi olur.

Sınırlama kuralının Whitespace'i dillerinizden biri olarak kullanamayacağınızı ima ettiğine dikkat edin, çünkü boşluk olmayan herhangi bir karakteri kaldırmak Whitespace programının davranışını değiştirmez.

Python 2 ve Python 3 dilleri için yukarıdaki tüm kısıtlamaları karşılayan basit bir program örneği:

print("Hello World!")

Herhangi bir karakter Çıkarma printhem diller atımına neden olur NameError; herhangi bir köşeli parantez veya tırnak işareti SyntaxErrorkaldırılırsa, dize karakterlerinden herhangi biri kaldırıldığında çıktı her iki dilde de değişir. ( print("hello", "world")Yukarıdaki kurallara göre daha ince, ancak yine de geçerli bir program olduğunu unutmayın).

Bu örnek biraz uyuşuk çünkü Python 2 ve Python 3 çok benzer, bu yüzden sadece aynı dilin farklı versiyonlarını (özellikle Python 2 ve Python 3) kullanan başka çözümleri kabul etmeyeceğim.


@ IngoBürk: Bu kural, bir şekilde diğer diliniz de yalnızca boşluk değilse, Whitespace'i içeren işlevsel bir çoklu dil yazmanızı engeller .
nneonneo

1
Örneğin, FWIW print("Hello World!")da geçerli Ruby kodu
Cristian Lupascu

[Çok dilli] için verilen basit cevapların (benimki gibi) çok fazla dile sahip olma eğilimi biraz can sıkıcıdır.
Justin

5
Sayısız dil varyantından veya benzer sözdizimine sahip dillerden kaçınmak için, yalnızca programın farklı çıktılar üretmesi durumunda iki dilin farklı sayılmasını istemek daha ilginç olacaktır.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


13

Bash + GolfScript + CJam

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

Çıktı

Bash:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

Bir yoktur \x7fCJam çıktısının sonunda.


... bekle, bu gereksiz her üç dilde de nasıl çalışır?
nneonneo

@nneonneo Kullanılmayan tüm kodları diğer dillerde basar.
jimmy23013

8

Bash + Befunge

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

`` merhaba '' baskısını keser.


1
Befunge'de her karakterin (boşluk hariç) bir şey yaptığını kanıtlayabilirim. Bash için bunu yapamam. Bu etkileyici.
Justin

7

bc, GolfScript, Homespring, ha, Oktav, Scilab (0 bayt)

Kural 4'e uyma garantisi. Kazanan değil, ama beraberlik molasında iyi olur.

Çıktı

M.Ö

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.

ha

?

Oktav

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

-->

2
Özellikle bu tür bir şey yaparak 0 uzunluk quines önleyen bir esolang olduğunu biliyorum (oh bekleyin, bu Homespring ). İnanıyorum ha? bir şey çıktılar.
Justin

Teşekkürler! Ne yazık ki, ikna edemiyorum ha? Linux üzerinde çalıştırmak için ...
Dennis

1
Tek ihtiyacım mono için ekstra bir paket oldu. Bu arada programınız yazdırılıyor What?\n?.
Dennis

1
Ayrıca GNU make: *** No targets. Stop.
Make'da

1
@ user23013: Doğru. Bu durumda,
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oktav + Matlab + Scilab + Sayısal Başlık +? Fueue + ha?

10

Golscript, PHP, CJam, Mathematica, bc, Pyth, /// ve TI-Basic'te çıktı verir 10 .

R'de çıktı verir [1] 10

Octave'de çıktı ans = 10

Matlab ve Scilab'da çıktılar ans = 10 .

Sayısal Topline'da çıktı alır 0 .

Fueue'yu düzgün bir şekilde anlarsam, bir satırsonu çıkarır, ardından bir kedi programı olarak davranır.

Ha? 'Da çıktı

What?
?

1
CJam'de de çalışıyor
Ağustos

5
İnteraktif tercümanların sayılması gerektiğini düşünmüyorum.
nneonneo

2
Bu birçok dilde iyi çalışır, ancak bu kadar çok çıktı vermez ...
Justin

1
Bu HTML , bc , Matlab ve Scilab için de geçerlidir . Eğer değiştirirseniz 72için 10, bu yazdırmalısınız 0içinde Sayısal Topline .
Dennis

HTML, basit tartışmaya veya döngülere sahip olmadığı için meta tartışmaya göre bir programlama dili değildir.
Ingo Bürk

3

Bu cevap tam olarak doğru değil gibi görünüyor.
Kısmen düzelttim ve birkaç gün içinde diğer kısmı geliştireceğim.

C ++ ve Javascript

Fikir:

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: Kodu tarayıcı konsoluna kopyalamanız yeterlidir

Ve tatmin etmek için bir dizi düzeltme

(Restriksiyon). Kodunuzdan boşluk olmayan herhangi bir karakterin kaldırılması, programınızın dilinizin her biri altındaki davranışını değiştirmesine neden olmalıdır. Program, o dil için geçersiz hale gelerek veya üretilen çıktıyı değiştirerek "değişebilir".

Javascript tarafından:

Değişen int, mainya putsbildirilmemiş değişkenin okuma ile kilitlenmesine. Fakatbool ve Hi from C++!güvenle değiştirir olabilir. Düzeltelim:

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

Dizeler eşitse, varlığını denetler, aksi boolhalde bildirilmemiş olarak çökernope .

Artık kaldırılabilen 2 noktalı noktalı virgül var. Birincisi esyly düzeltildi - sadece önce yeni satırı kaldırın int:

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

İkincisi önce } , bu yüzden her iki dilde geçerli ve C ++ sonunda noktalı virgül gerektiren veya js noktalı virgül gerektirmeyen bazı daralma gerekir. İnce:

while(0);

whileVücuda ihtiyaç duyduğu için js'de noktalı virgül atlamak imkansızdır .

Şu anda program:

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);
}

C ++ tarafından:

2 sorun var: eval herhangi bir isim olabilir ve tüm js kodu değiştirilebilir.

Onları birkaç gün içinde düzeltmeye çalışacağım.


2

CJam + Golfscript

Tamam, bu biraz sıkıcı ama bir başlangıç.

1,

Her iki dilde de "0" yazdırır. Çıkarılması 1çıkarmadan, hataya neden oluyor, bunun yerine "1" yazdırmayı .

Aynı ile yapılabilir 1)ya 1(. Birçok alternatif var.

(Evet, bunun kod golf olmadığını biliyorum)


2

C ve C ++

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

C ve C ++ birbiriyle neredeyse uyumlu farklı diller - sizi C ++ duyabilir aksine C. Look bir üst değil http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B bazı farklılıkların . Yukarıdaki örnek deyimsel C ++ değildir ancak çalışır ve C ve C ++ 'da aynı çıktıyı üretir.


0İçin C'yi kaldırabilirsiniz .
Dennis

@Dennis C89'da değil.
Gilles 'SO- kötü olmayı bırak'

@Gilles: Ana işlev, değer belirtmeyen bir dönüş yürütürse, ana makine ortamına döndürülen sonlandırma durumu tanımsız olur. ( C89 Taslağı - 2.1.2.2 Barındırılan ortam ) Bu, programı geçersiz kılmaz veya çıktısını değiştirmez, bu nedenle bu sorunun amaçları doğrultusunda, 0kaldırılabilir.
Dennis

@Dennis belirtilmemiş bir çıkış kodu programı bu sorunun kurallarına göre geçersiz yapmak olarak sayılır. Değilse, bu programın gcc -ansix86 (veya diğer birçok mimaride) gibi sıfır olmayan bir çıkış kodu döndürdüğü bir C89 uygulaması yapın : ne olur, sonuçların putsçalışma zamanının değeri okuduğu kayıtta olması mainişlevden dönmek için ).
Gilles 'SO- kötü olmayı bırak'

@Gilles: Kural 3 yorumum derleyicinin programı değil 0 döndürmesi gerektiğidir.
Dennis

2

JavaScipt, Lua, R ve Python 3-24 bayt

Başka diller üzerinde çalışabilir, ikincisini test edeceğim.

alert=print;alert(1)

JavaScript, Firefox'un konsolunda ve diğer dillerde burada , burada ve burada test edildi


1

Perl + Yakut + Python

PHP ile çalışıyorsanız bu noktalı virgül gerekir düşünüyorum -R.

print "Hello World!"

Bu Python'da da çalışır.
Ağustos

1
Lua ile de çalışır.
Trebuchette

1

Bash + sh + zsh + ksh, 4 bayt:

echo

Gerçekten basit ve her kuralı yerine getiriyor:

  1. Her dilde bir yeni satır çıkarır.
  2. Çıktı şu anda yok değil dilleri arasında herhangi bir şekilde değişir.
  3. Hiçbir dilde hata üretmez ...
  4. ... dışında herhangi bir karakter kaldırıldığında / değişti.

0

Bash + sh + zsh + ksh + Windows Toplu İş, 4 bayt:

echo

Gerçekten basit ve her kuralı yerine getiriyor:

Dillerin her birinde farklı olmayan (ancak ECHO is onkullandığınız dilde çıktı veren Windows Toplu İş ) herhangi bir harfin kaldırılması veya değiştirilmesi dışında hata vermez.


1
Cevabınız bununla neredeyse aynı görünüyor: codegolf.stackexchange.com/a/100654/65326
Uriel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.