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. #define
W 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:
- (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.
- (Zmienność). Jako złagodzenie standardowej definicji poliglota, wyniki programu mogą się różnić w zależności od języka.
- (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.
- (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.
- 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 print
spowoduje, ż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).
źródło
print("Hello World!")
jest również poprawnym kodem RubyOdpowiedzi:
Bash + GolfScript + CJam
Wynik
Grzmotnąć:
GolfScript:
CJam:
Na
\x7f
końcu wyjścia CJam.źródło
Bash + Befunge
wypisuje „witaj” w befunge.
źródło
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
GolfScript
Homespring
hę
Oktawa
Scilab
źródło
What?\n?
mówiąc, twój program drukuje .make: *** No targets. Stop.
GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? Fueue + prawda?
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
źródło
72
na10
, powinien być wydrukowany0
w Numerycznej linii górnej .C ++ i JavaScript
Chodzi o:
C ++: http://codepad.org/SK2wbIDL
Javascript: Po prostu skopiuj kod do konsoli przeglądarki
I zestaw poprawek, aby go spełnić
Od strony Javascript:
Zmiana
int
,main
alboputs
padnie z czytania zmiennej nierejestrowanej. Alebool
iHi from C++!
można bezpiecznie zmieniać. Naprawmy to:Jeśli ciągi znaków są równe, sprawdza istnienie
bool
, w przeciwnym razie ulega awarii z niezadeklarowanymnope
.Teraz są 2 końcowe średniki, które można usunąć. Pierwszy jest naprawiony, po prostu usuń nowy wiersz przed
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:Niemożliwe jest pominięcie średnika w js, ponieważ
while
potrzebuje on ciała.W tej chwili program jest:
Od strony C ++:
Występują 2 problemy:
eval
może mieć dowolną nazwę i cały kod js można zmienić.Spróbuję je naprawić za kilka dni.
źródło
CJam + Golfscript
Okej, to trochę nudne, ale to początek.
Drukuje „0” w obu językach. Usunięcie
1
powoduje błąd,,
zamiast tego usuwa wydruki „1”.To samo można zrobić z
1)
lub1(
. Istnieje wiele alternatyw.(Tak, wiem, że to nie jest golf golfowy)
źródło
C i C ++
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 ++.
źródło
0
for C.0
można go usunąć.gcc -ansi
na x86 (lub wielu innych architekturach: dzieje się tak, że zwracana wartość parametruputs
kończy się w rejestrze, w którym środowisko wykonawcze odczytuje wartość wrócić zmain
funkcji).JavaScipt, Lua, R i Python 3-24 bajty
Może działać na innych językach, przetestuję to drugie.
JavaScript został przetestowany na konsoli Firefox i innych językach tutaj , tutaj i tutaj
źródło
Perl + Ruby + Python
Myślę, że w PHP będzie to wymagało średnika, jeśli używasz
-R
.źródło
Bash + sh + zsh + ksh, 4 bajty:
Naprawdę proste i spełnia każdą zasadę:
źródło
Bash + sh + zsh + ksh + Windows Batch, 4 bajty:
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.źródło