Polyglot limitato


20

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, #definein 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:

  1. (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.
  2. (Varianza). Come rilassamento della definizione standard di poliglotta, l'output del programma può variare tra le lingue.
  3. (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.
  4. (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.
  5. 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 printfarà sì che entrambe le lingue lancino un NameError; la rimozione di parentesi quadre o virgolette genererà a SyntaxErrore 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).


@ IngoBürk: la regola ti impedisce di scrivere un poliglotta funzionale che coinvolge gli spazi bianchi , a meno che in qualche modo anche l' altra tua lingua sia solo per gli spazi bianchi.
nneonneo,

1
FWIW il tuo esempio, print("Hello World!")è valido anche il codice Ruby
Cristian Lupascu,

È un po 'fastidioso che le risposte semplici (come la mia) a un [poliglotta] tendano ad avere così tante lingue.
Justin,

5
Per evitare la miriade di varianti linguistiche o lingue con sintassi simile, sarebbe più interessante richiedere che due lingue contino come diverse solo se il programma produce output diversi.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


13

Bash + GolfScript + CJam

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

Produzione

bash:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

C'è un \x7falla fine dell'output di CJam.


... aspetta, come funziona in tutte e tre le lingue, senza essere ridondante?
nneonneo,

@nneonneo Stampa semplicemente tutto il codice inutilizzato in altre lingue.
jimmy23013,

8

Bash + Befunge

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

stampa 'ciao' in befunge.


1
Posso attestare che ogni personaggio (tranne lo spazio) fa qualcosa in Befunge. Tuttavia, non posso farlo per il Bash. Questo è impressionante.
Giustino,

7

bc, GolfScript, Homespring, eh, Octave, Scilab (0 byte)

Garantito per rispettare la regola 4. Non un vincitore, ma farebbe bene in pareggio.

Produzione

avanti Cristo

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.

eh

?

Ottava

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
So che esiste un esolang che previene specificamente 0 quine di lunghezza facendo questo genere di cose (oh aspetta, è Homespring ). Ci credo eh? genera qualcosa.
Justin,

Grazie! Purtroppo, non riesco a convincere eh? per funzionare su Linux ...
Dennis

1
Tutto ciò di cui avevo bisogno era un pacchetto aggiuntivo per mono. Il tuo programma stampa What?\n?, a proposito.
Dennis,

1
Funziona anche con GNU Make (se è un linguaggio di programmazione):make: *** No targets. Stop.
jimmy23013

1
@ user23013: giusto. In tal caso, non è una voce valida, poiché il codice di uscita di make è 2.
Dennis

6

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

10

In Golscript, PHP, CJam, Mathematica, bc, Pyth, /// e TI-Basic, viene emesso 10.

In R, viene emesso [1] 10

In Octave, viene emesso ans = 10

In Matlab e Scilab, viene prodotto ans = 10.

In Topline numerico, viene emesso 0.

Se capisco correttamente Fueue, genera una nuova riga, quindi funge da programma per gatti.

In eh ?, esce

What?
?

1
Funziona anche in CJam
mese di agosto

5
Non credo che gli interpreti interattivi dovrebbero contare.
nneonneo,

2
Funziona bene in molte lingue, ma non fornisce risultati in così tanti ...
Justin,

1
Questo è valido anche in HTML , bc , Matlab e Scilab . Se si cambia 72in 10, dovrebbe essere stampato 0in Topline numerico .
Dennis,

L'HTML non è un linguaggio di programmazione secondo la meta discussione in quanto non ha mezzi di aritmetica semplice o cicli.
Ingo Bürk,

3

Sembra che questa risposta non sia completamente corretta.
L'ho parzialmente risolto, e ho intenzione di migliorare l'altra parte in pochi giorni.

C ++ e Javascript

L'idea è:

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: basta copiare il codice sulla console del browser

E una serie di correzioni per renderlo soddisfacente

(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.

Dal lato Javascript:

Cambiare int, maino putsandrà in crash con la lettura della variabile non dichiarata. Ma boole Hi from C++!può essere sicuro cambiamenti. Risolviamolo:

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

Se le stringhe sono uguali, controlla l'esistenza di bool, altrimenti due volte si blocca con non dichiarato nope.

Ora, ci sono 2 punti e virgola finali che possono essere rimossi. Il primo è risolto in modo esyly - basta rimuovere newline prima di int:

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

Il secondo è prima }, quindi ho bisogno di un po 'di costrizione, valida in entrambe le lingue e non richiede punto e virgola alla fine in C ++ o forzatura di un punto e virgola in js. fine:

while(0);

È impossibile omettere il punto e virgola in js poiché ha whilebisogno del corpo.

Quindi il programma al momento è:

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

Dal lato C ++:

Ci sono 2 problemi: evalpuò avere qualsiasi nome e tutto il codice js può essere modificato.

Proverò a risolverli tra qualche giorno.


2

CJam + Golfscript

Va bene, questo è un po 'noioso, ma è un inizio.

1,

Stampa "0" in entrambe le lingue. La rimozione delle 1cause causa un errore, rimuovendo invece le ,stampe "1".

Lo stesso può essere fatto con 1)o 1(. Ci sono molte alternative.

(Sì, lo so che questo non è code-golf)


2

C e C ++

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

C e C ++ sono lingue diverse che sono quasi compatibili tra loro - contrariamente a quanto si potrebbe sentire C ++ non è un superset di C. Guardate http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B per alcune differenze . L'esempio sopra non è C ++ idiomatico ma funziona e produce lo stesso output in C e C ++.


È possibile rimuovere il 0per C.
Dennis


@Gilles: se la funzione principale esegue un ritorno che non specifica alcun valore, lo stato di terminazione restituito all'ambiente host non è definito. ( The C89 Draft - 2.1.2.2 Ambiente ospitato ) Ciò non rende il programma non valido né cambia il suo output, quindi ai fini di questa domanda, 0può essere rimosso.
Dennis,

@Dennis Penso che un codice di uscita non specificato contenga come rendere il programma non valido secondo le regole di questa domanda. In caso contrario, fai in modo che un'implementazione C89 in cui questo programma restituisca un codice di uscita gcc -ansidiverso da zero, come su x86 (o molte altre architetture: ciò che accade è che il valore restituito putsfinisce per essere nel registro in cui il runtime legge il valore per tornare dalla mainfunzione).
Gilles 'SO- smetti di essere malvagio' il

@Gilles: La mia interpretazione della regola 3 è che il compilatore deve restituire 0, non il programma.
Dennis,

2

JavaScipt, Lua, R e Python 3 - 24 byte

Può funzionare su altre lingue, testerò quest'ultimo.

alert=print;alert(1)

JavaScript è stato testato sulla console di Firefox e le altre lingue qui , qui e qui


1

Perl + Ruby + Python

Penso che in PHP questo avrebbe bisogno di un punto e virgola se stai correndo -R.

print "Hello World!"

Funziona anche in Python.
Agosto

1
Funziona anche con Lua.
Trebuchette,

1

Bash + sh + zsh + ksh, 4 byte:

echo

Davvero semplice e soddisfa ogni regola:

  1. Emette una nuova riga in ciascuna delle lingue.
  2. L'output attualmente non varia in alcun modo tra le lingue.
  3. Non produce un errore in nessuna delle lingue ...
  4. ... tranne quando uno qualsiasi dei personaggi viene rimosso / modificato.

0

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

echo

Davvero semplice e soddisfa ogni regola:

Emette una nuova riga che non varia in ciascuna delle lingue (ma Windows Batch, che genera ECHO is on, nella lingua che usi), non fa errori, tranne quando una lettera viene rimossa o modificata.


1
La tua risposta sembra essere quasi identica a questa: codegolf.stackexchange.com/a/100654/65326
Uriel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.