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).
print("Hello World!")
jest również poprawnym kodem Ruby