I poliglotti sono programmi validi contemporaneamente in più linguaggi di programmazione. La maggior parte di tali poliglotti sono scritti in modo tale che alcuni costrutti di una lingua vengano interpretati come commenti di un'altra lingua (ad esempio, #define
in C viene interpretato come un commento in diversi linguaggi di scripting).
Sono curioso di vedere se è possibile creare un poliglotta non banale che non contiene commenti, ma cambia anche immediatamente quando si rimuove qualsiasi carattere non di spazi bianchi, quindi ti sfido a inventare un tale programma.
Le regole concrete sono le seguenti:
- (Produzione). Il tuo programma deve produrre un output sulla console in ciascuna delle tue lingue. Cioè, al tuo programma non è consentito uscire semplicemente senza stampare nulla.
- (Varianza). Come rilassamento della definizione standard di poliglotta, l'output del programma può variare tra le lingue.
- (Errori). Il tuo programma non deve produrre errori (ampiamente definiti) in nessuna delle tue lingue. Per la maggior parte delle lingue, questo è definito come la restituzione di un codice di uscita diverso da zero dal compilatore e / o dall'interprete.
- (Restrizione). La rimozione di ogni singolo carattere non di spazi bianchi dal codice dovrebbe far sì che il programma cambi il suo comportamento in ciascuna delle tue lingue. Il programma può "cambiare" diventando non valido per quella lingua o modificando l'output che viene prodotto.
- Questa è una sfida del codice . Winner è il programma valido nella maggior parte dei linguaggi di programmazione. I legami verranno interrotti a favore della durata del programma più breve.
La regola di restrizione non si applica alla rimozione di più caratteri. Cioè, va bene se la rimozione di più caratteri contemporaneamente non comporta alcun cambiamento per una delle tue lingue.
Osserva che la regola di restrizione implica che non puoi usare Whitespace come una delle tue lingue, poiché la rimozione di qualsiasi carattere non di spazi non cambierà il comportamento del programma Whitespace.
Ecco un semplice esempio di un programma che soddisfa tutte le restrizioni di cui sopra, per le lingue Python 2 e Python 3:
print("Hello World!")
La rimozione di qualsiasi personaggio print
farà sì che entrambe le lingue lancino un NameError
; la rimozione di parentesi quadre o virgolette genererà a SyntaxError
e la rimozione di uno qualsiasi dei caratteri stringa modificherà l'output in entrambe le lingue. (Si noti che print("hello", "world")
è un programma più sottile, ma comunque valido secondo le regole di cui sopra).
Questo esempio è un po 'scadente perché Python 2 e Python 3 sono molto simili, quindi non accetterò altre soluzioni che utilizzano solo versioni diverse della stessa lingua (in particolare Python 2 e Python 3).
print("Hello World!")
è valido anche il codice Ruby