Ograniczony Polyglot

20

Poligloty to programy działające jednocześnie w wielu językach programowania. Większość takich poliglotów jest napisanych w taki sposób, że niektóre konstrukcje jednego języka są interpretowane jako komentarze innego języka (np. #defineW C jest interpretowane jako komentarz w kilku językach skryptowych).

Jestem ciekawy, czy możliwe jest stworzenie nietrywialnego poliglota, który nie będzie zawierał komentarzy, ale również natychmiast zmieni się, gdy usuniesz znak inny niż spacja, dlatego wzywam cię do stworzenia takiego programu.

Konkretne zasady są następujące:

  1. (Wynik). Twój program musi generować dane wyjściowe na konsoli w każdym z Twoich języków. Oznacza to, że twój program nie może po prostu wyjść bez drukowania.
  2. (Zmienność). Jako złagodzenie standardowej definicji poliglota, wyniki programu mogą się różnić w zależności od języka.
  3. (Błędy). Twój program nie może generować żadnych błędów (ogólnie zdefiniowanych) w żadnym z Twoich języków. W większości języków jest to definiowane jako zwracanie niezerowego kodu wyjścia z kompilatora i / lub interpretera.
  4. (Ograniczenie). Usunięcie dowolnego pojedynczego znaku spacji z kodu powinno spowodować, że Twój program zmieni swoje zachowanie w każdym z twoich języków. Program może „zmienić się”, unieważniając ten język lub zmieniając wytwarzane dane wyjściowe.
  5. To jest wyzwanie kodowe . Zwycięzca to program, który jest ważny w większości języków programowania. Więzy zostaną zerwane na rzecz krótszej długości programu.

Reguła ograniczeń nie dotyczy usuwania kilku znaków. Oznacza to, że usunięcie kilku znaków jednocześnie nie spowoduje zmiany w jednym z Twoich języków.

Zauważ, że reguła ograniczenia oznacza, że ​​nie możesz używać białych znaków jako jednego ze swoich języków, ponieważ usunięcie wszelkich znaków innych niż białe znaki nie zmieni zachowania programu Whitespace.

Oto prosty przykład programu, który spełnia wszystkie powyższe ograniczenia, dla języków Python 2 i Python 3:

print("Hello World!")

Usunięcie dowolnego znaku printspowoduje, że oba języki wyrzucą znak NameError; usunięcie nawiasu lub cudzysłowu spowoduje wyrzucenie a SyntaxError, a usunięcie któregokolwiek ze znaków ciągu zmieni dane wyjściowe w obu językach. (Należy pamiętać, że print("hello", "world")jest to bardziej subtelny, ale nadal aktualny program zgodnie z powyższymi zasadami).

Ten przykład jest nieco kiepski, ponieważ Python 2 i Python 3 są bardzo podobne, więc nie zaakceptuję żadnych innych rozwiązań, które używają tylko różnych wersji tego samego języka (zwłaszcza Python 2 i Python 3).

nneonneo
źródło
@ IngoBürk: Reguła uniemożliwia pisanie funkcjonalnego poliglota, który obejmuje spacje , chyba że twój inny język jest również spacją.
nneonneo
1
FWIW twój przykład print("Hello World!")jest również poprawnym kodem Ruby
Cristian Lupascu
Trochę denerwujące jest to, że proste odpowiedzi (takie jak moje) na [poliglota] mogą mieć tyle języków.
Justin
5
Aby uniknąć niezliczonych wariantów językowych lub języków o podobnej składni, bardziej interesujące byłoby wymaganie, aby dwa języki były traktowane jako różne tylko wtedy, gdy program generuje inne dane wyjściowe.
Gilles „SO- przestań być zły”

Odpowiedzi:

13

Bash + GolfScript + CJam

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

Wynik

Grzmotnąć:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

Na \x7fkońcu wyjścia CJam.

jimmy23013
źródło
... czekaj, jak to działa we wszystkich trzech językach, bez zbędnych?
nneonneo
@nneonneo Po prostu drukuje cały nieużywany kod w innych językach.
jimmy23013
8

Bash + Befunge

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

wypisuje „witaj” w befunge.

saeedn
źródło
1
Mogę zaświadczyć, że każda postać (oprócz spacji) robi coś w Befunge. Nie mogę tego zrobić w przypadku Bash. To imponujące.
Justin
7

bc, GolfScript, Homespring, huh, Octave, Scilab (0 bajtów)

Gwarantujemy zgodność z zasadą 4. Nie jest zwycięzcą, ale poradziłby sobie w rozstrzygnięciu remisu.

Wynik

pne

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.

?

Oktawa

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
źródło
2
Wiem, że jest esolang, który konkretnie zapobiega quinesom długości 0, robiąc takie rzeczy (oh, czekaj, to Homespring ). Wierzę co? wyprowadza coś.
Justin
Dzięki! Niestety nie mogę przekonać, co? uruchomić na Linuksie ...
Dennis
1
Wszystko, czego potrzebowałem, to dodatkowy pakiet dla mono. Nawiasem What?\n?mówiąc, twój program drukuje .
Dennis
1
Działa również w GNU Make (jeśli jest to język programowania):make: *** No targets. Stop.
jimmy23013
1
@ user23013: Racja. W takim przypadku nie jest to poprawny wpis, ponieważ kod wyjścia make to 2.
Dennis
6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? Fueue + prawda?

10

W Golscript, PHP, CJam, Mathematica, bc, Pyth, /// i TI-Basic wyświetla dane wyjściowe 10.

W R wyprowadza [1] 10

W Octave generuje ans = 10

W Matlab i Scilab generuje dane wyjściowe ans = 10.

W Numerycznej linii górnej wyświetla dane wyjściowe 0.

Jeśli dobrze rozumiem Fueue, wyświetla nowy wiersz, a następnie działa jak program cat.

W huh ?, to wychodzi

What?
?
Justin
źródło
1
Działa również w CJam
sierpień
5
Nie sądzę, że tłumacze interaktywni powinni się liczyć.
nneonneo
2
Działa to dobrze w wielu językach, ale nie zapewnia wyników w tak wielu ...
Justin
1
Dotyczy to również HTML , bc , Matlab i Scilab . Jeśli zmienisz 72na 10, powinien być wydrukowany 0w Numerycznej linii górnej .
Dennis
Według meta dyskusji HTML nie jest językiem programowania, ponieważ nie ma w nim prostej arytmetyki ani pętli.
Ingo Bürk
3

Wygląda na to, że ta odpowiedź nie jest w pełni poprawna.
Częściowo to naprawiłem i zamierzam poprawić drugą część za kilka dni.

C ++ i JavaScript

Chodzi o:

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: Po prostu skopiuj kod do konsoli przeglądarki

I zestaw poprawek, aby go spełnić

(Ograniczenie). Usunięcie dowolnego pojedynczego znaku spacji z kodu powinno spowodować, że Twój program zmieni swoje zachowanie w każdym z twoich języków. Program może „zmienić się”, unieważniając ten język lub zmieniając wytwarzane dane wyjściowe.

Od strony Javascript:

Zmiana int, mainalbo putspadnie z czytania zmiennej nierejestrowanej. Ale booli Hi from C++!można bezpiecznie zmieniać. Naprawmy to:

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

Jeśli ciągi znaków są równe, sprawdza istnienie bool, w przeciwnym razie ulega awarii z niezadeklarowanym nope.

Teraz są 2 końcowe średniki, które można usunąć. Pierwszy jest naprawiony, po prostu usuń nowy wiersz przed int:

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

Drugi jest wcześniej }, więc potrzebuję trochę zwężenia, poprawnego w obu językach i niewymagającego średnika na końcu w C ++ ani forowania średnika w js. W porządku:

while(0);

Niemożliwe jest pominięcie średnika w js, ponieważ whilepotrzebuje on ciała.

W tej chwili program jest:

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

Od strony C ++:

Występują 2 problemy: evalmoże mieć dowolną nazwę i cały kod js można zmienić.

Spróbuję je naprawić za kilka dni.

Qwertiy
źródło
2

CJam + Golfscript

Okej, to trochę nudne, ale to początek.

1,

Drukuje „0” w obu językach. Usunięcie 1powoduje błąd, ,zamiast tego usuwa wydruki „1”.

To samo można zrobić z 1)lub 1(. Istnieje wiele alternatyw.

(Tak, wiem, że to nie jest golf golfowy)

Ingo Bürk
źródło
2

C i C ++

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

C i C ++ są różnymi językami, które są prawie ze sobą kompatybilne - w przeciwieństwie do tego, co możesz usłyszeć, C ++ nie jest nadzbiorem C. Spójrz na http://en.wikipedia.org/wiki/Compatibility_of_C_i_C%2B%2B, aby zobaczyć pewne różnice . Powyższy przykład nie jest idiomatycznym C ++, ale działa i daje takie same wyniki zarówno w C, jak i C ++.

Jerry Jeremiasz
źródło
Możesz usunąć 0for C.
Dennis
@Dennis Nie w C89.
Gilles „SO- przestań być zły”
@Gilles: Jeśli funkcja główna wykonuje zwrot, który nie określa żadnej wartości, status zakończenia zwracany do środowiska hosta jest niezdefiniowany. ( Szkic C89 - 2.1.2.2 Środowisko hostowane ) To nie powoduje, że program jest nieważny ani nie zmienia wyników, więc na potrzeby tego pytania 0można go usunąć.
Dennis
@ Dennis Myślę, że nieokreślony kod wyjścia liczy się jako unieważnienie programu zgodnie z zasadami tego pytania. Jeśli nie, spraw, aby implementacja C89, w której ten program zwraca niezerowy kod wyjścia, taki jak gcc -ansina x86 (lub wielu innych architekturach: dzieje się tak, że zwracana wartość parametru putskończy się w rejestrze, w którym środowisko wykonawcze odczytuje wartość wrócić z mainfunkcji).
Gilles „SO- przestań być zły”
@Gilles: Moja interpretacja reguły 3 jest taka, że ​​kompilator musi zwrócić 0, a nie program.
Dennis
2

JavaScipt, Lua, R i Python 3-24 bajty

Może działać na innych językach, przetestuję to drugie.

alert=print;alert(1)

JavaScript został przetestowany na konsoli Firefox i innych językach tutaj , tutaj i tutaj

William Barbosa
źródło
1

Perl + Ruby + Python

Myślę, że w PHP będzie to wymagało średnika, jeśli używasz -R.

print "Hello World!"
hmatt1
źródło
Działa to również w Pythonie.
sierpień
1
Współpracuje również z Luą.
Trebuchette
1

Bash + sh + zsh + ksh, 4 bajty:

echo

Naprawdę proste i spełnia każdą zasadę:

  1. Wyświetla nowy wiersz w każdym z języków.
  2. Obecnie wyniki nie różnią się w żaden sposób między językami.
  3. Nie powoduje błędu w żadnym z języków ...
  4. ... z wyjątkiem sytuacji, gdy którykolwiek ze znaków zostanie usunięty / zmieniony.
R. Kap
źródło
0

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

echo

Naprawdę proste i spełnia każdą zasadę:

Wysyła znak nowej linii, który nie różni się w każdym z języków (ale Windows Batch, który wypisuje ECHO is on, w języku, którego używasz), nie zawiera błędów, z wyjątkiem sytuacji, gdy dowolna litera jest usuwana lub zmieniana.

użytkownik75200
źródło
1
Twoja odpowiedź wydaje się prawie identyczna z tą: codegolf.stackexchange.com/a/100654/65326
Uriel