Scrivi un poliglotta che stampa il nome della lingua


65

Il tuo compito è scrivere un programma che venga eseguito in quante più lingue possibili, con il minor numero di caratteri possibile. Per evitare soluzioni banali, il programma deve stampare il nome della lingua in cui è stato eseguito.

punteggio

Il tuo programma deve funzionare in almeno 5 lingue. Il punteggio di un programma è dato come:

(number of languages)1.5 / (length of program)

Il punteggio più alto vince, non prima di 10 giorni dopo la prima risposta valida.


L'uso di una soluzione come l'utilizzo print()di Perl, Python, PHP, Processing e R sarebbe considerato banale o è accettabile?
Rob,

3
A non riesco a vedere un problema con esso. La difficoltà sarebbe cambiare l'input di stampa per lingua.
mjgpy3,

Avrei dovuto dare un peso maggiore al numero di lingue ... sembra che scegliere di avere esattamente 5 sia il più ottimale. Mi chiedo quante lingue ci sarebbero state nella voce del vincitore se il punteggio fosse staton * n / length
vsz l'

Lo avrei suggerito anche io. Sulla base delle risposte fornite, non credo di aver interpretato correttamente la tua domanda.
Rob,

Risposte:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 caratteri

punteggio ~ 0.1236

Per i codici C e C devo un debito a @ baby-rabbit. Gli altri sono ispirati dal riconoscimento che molte lingue hanno evalun'affermazione che accetterà a malincuore una sintassi non valida.

Emette il nome della lingua nell'output standard. A volte genera molti messaggi di errore in caso di errore standard, quindi eliminali 2>/dev/nullmentre li esegui.

#if 0
'PHP<?/*';eval "print\$=?'Perl':'Ruby';echo Bash";exit
__END__
#endif
#include <stdio.h>
main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}//*/?>'

La soluzione php genera 'PHP'(incluse le virgolette singole), che potrebbe piegare leggermente le regole.

Ultima modifica: rasato 12 caratteri dall'intuizione che si $=trova falsein Ruby, 60in Perl, ed print$=?...è quasi sicuramente un errore in Bash. Rasato altri 7 da insight il test Perl / Ruby / Bash ora può andare in una singola dichiarazione di valutazione.

Se le regole possono tollerare una maggiore flessione, presento questa soluzione in 8 lingue e 43 caratteri (punteggio 0,5262)

print("phperluarscriptrubypythoncatebg13");

per il quale l'output include il nome del interprete per php, perl, lua, rscript, ruby, python, cat, e rot13.


1
TI-Basic supporta l'ultimo; basta aggiungere 6 caratteri e ottenereprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech no, TI-Basic utilizza i token Dispo Output(o text(, non vi è alcun print(comando. E l'inclusione di una stringa come parte di un'espressione altrimenti valutata in modo reale provoca una ERR:INVALID SYNTAX, non la visualizzazione della stringa (nemmeno come valore di ritorno). (Inoltre, non esiste ;; usi TI-Basic :)
AJMansfield

@AJMansfield Troppo vero, come potrei dimenticare:?
Timtech,

12
Puoi sostituirlo echo Bashcon ps -ocomm= -p$$? Questo produrrà il nome della shell per almeno bash, zsh, ksh, csh e tcsh, forse altri.
Trauma digitale,

19

C, C ++, BF, BASH e Ruby; 280 caratteri

Il punteggio è di circa 0,040

#include "stdio.h"
#define s "C"
#ifdef __cplusplus
#define s "C++"
#endif
#ifndef s
#"+++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts "Ruby"
exit
fi
echo "BASH"
exit
end
#endif
main(){puts(s);}

Nota che sto usando un sistema Linux.

Il codice viene eseguito o compilato con i seguenti comandi (il nome del file è test.c)

C:

gcc test.c

Quando eseguito con ./a.out, l'output èC

C ++:

c++ test.c

Quando eseguito con ./a.out, l'output èC++

BASH:

./test.c

Uscite: BASH

Rubino:

ruby test.c

Uscite: Ruby

Brainf ***:

Verificato utilizzando il seguente:

Uscite: brainfuck

Se si utilizza il debugger JS, è necessario rimuovere i primi due segni meno. Sono stati inclusi per compensare i segni più nella stringa letterale "C++". Questo è stato un progetto molto divertente, sto lavorando per aggiungere più lingue.

Solo per aggiungere ulteriore chiarezza, ecco le specifiche del mio interprete / compilatore:

  • versione gcc 4.6.3

  • ruby 1.9.3p194 (revisione 20-04-2012 35410) [x86_64-linux]

  • GNU bash, versione 4.2.24 (1) -release (x86_64-pc-linux-gnu)

NOTA A MARGINE

Usando il trucco di @ baby-rabbit sono stato in grado di estendere il mio codice per essere eseguibile in 7 lingue (obiettivo-C e obiettivo-c ++ aggiunti). Questa non è la mia soluzione da quando ne ho copiate alcune, ma ho pensato di metterlo in mostra.

Aggiornamento 9.12 Aggiunto SmallTalk eseguito con gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 caratteri (punteggio: 0,059)

#if (a)
##(true) ifTrue: ['SmallTalk' printNl]
##(ObjectMemory quit)
#"+++++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts 'Ruby'
exit
fi
echo 'BASH'
exit
end
=begin
#endif
#include "stdio.h"
main(){puts(
#ifdef __OBJC__
"Objective-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}
#ifdef b
=end
#endif

Nel codice sopra dovrai rinominare il file per produrre il nome della lingua per gli obiettivi-c, obj-c ++, c e c ++.


sarebbe più breve se si produce brainf***?
mob

Sì, credo.
mjgpy3,

Dovresti usare if [ 1 = 2 ]invece di if [ 1 == 2 ], perché gli script senza hashbang sono eseguiti da sh, non bash. sh può essere o no bash, su Debian è un trattino.
nyuszika7h,

12

bash, c, c ++, obj-c, obj-c ++; 134 caratteri; punteggio = 0,083

#if x
echo "bash"
exit
#endif
#include <stdio.h>
int main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"c"
#ifdef __cplusplus
"++"
#endif
);}

rinominare il file ed eseguire / compilare come:

  • sh file.sh
  • cc file.c
  • cc file.cpp
  • cc file.m
  • cc file.mm

(dove cc è clang-421.10.42)


+1 poiché molte altre risposte votate sono state ispirate dalle tue.
Kevin - Ripristina Monica il

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 caratteri; ~ 0.087 punti)

Non sono sicuro se questo conta: la parte sed è incorporata nella linea shebang che è probabilmente un trucco per aggirare la restrizione. Ciò significa anche che dovrebbe essere eseguito come eseguibile e non direttamente con sed.

Sono stato fortunato che tutte le altre lingue (sans Befunge) ignorano automagicamente la linea shebang (anche se apparentemente Ruby rifiuta di eseguire il file se ha una linea shebang che non contiene la stringa 'ruby').

#!sed sanava;s/.*/sed/;q;ruby
--"".to_i#>"egnufeB">:#,_@
if 0
then
if IO
then
puts"Ruby"
else
print"Lua"
end
else
echo"VimL"
end

Esempio di utilizzo:

% lua tmp/glot.poly
Lua
% ruby tmp/glot.poly
Ruby
% ./tmp/glot.poly
sed
% cfunge tmp/glot.poly       # Requires Befunge-98
Befunge

:source tmp/glot.poly        # from vim
VimL                         # displayed as message

5
Wow, una soluzione che non include C
vsz l'

8

BF, Bash, Batch, C, vi (163 caratteri; punteggio ≈ .0686)

( <ESC>sta per codice ASCII 27.)

rem (){ ((0));};true /*
rem ;goto(){ rem;}
rem ivi<ESC>ZZ'++++++++[>NUL ++++++++<NUL -]>NUL ++.++++.*/;main(){puts("C");}/*'
goto a
echo Bash
exit
:a
echo Batch
rem */

Ho provato questo, come un file batch, con la versione 6.22 di MS-DOS di COMMAND.COM. Per impostazione predefinita, quell'interprete mescola righe di codice sorgente con l'output. Per evitare che ciò accada, eseguire echo offprima di eseguire il file batch.

Per eseguire il codice vi, che ho testato solo usando Vim, usa il seguente comando:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

1
Puoi usare touch tmpfileo : > tmpfileinvece di cat /dev/null > tmpfile.
nyuszika7h,

5

bash, zsh, ksh, csh, tcsh, 15 caratteri, punteggio 0.745

Questo è un po 'allungato poiché sono tutti linguaggi correlati, ma ci sono differenze:

ps -ocomm= -p$$

Che ne dici di trattino?
Elliot A.

4

Ogni versione di Python, 18.37291 punti

import sys
print('Python '+'.'.join(map(str,sys.version_info[:-2])))

Tecnicamente valido, se si considera che tutte le versioni di Python sono lingue diverse. Ci sono attualmente 116 versioni di Python, che credo mi dia un punteggio di circa 18.37291.

(Inoltre capisco se questa non è considerata una risposta valida, era solo per divertimento)


ricevi ancora il mio +1 solo per divertimento.
vsz

È possibile stampare il numero di versione completo? (Questo si riduce di 4 byte ed estende le possibili versioni di Python.)
A _

Anche questo va bene? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 caratteri; punteggio ≈ .077)

( <BS>sta per codice ASCII 8. <ESC>sta per codice ASCII 27.)

#define echo//<BS><BS><BS>vi<ESC>ZZ
#define BEGIN A()
#define B\
{
echo Bash ;exit;
#define C\
}
BEGIN {printf(A=="A"?"Perl":"Gawk");exit;}
main(){puts("C");}

Per eseguire il codice vi, che ho testato solo con Vim, usa questo comando:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

3

Questa è una selezione economica di lingue, ma qui va:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 caratteri, punteggio ≈ 0,0501)

a="undefined"
x="ECMAScript 3"
if(Array.prototype.map)
 x="ECMAScript 5"
if(typeof CoffeeScript!=a)
 x="CoffeeScript"
if(typeof uneval!=a)
 x="Mozilla JavaScript"
if(typeof WScript!=a)
 WScript.echo("JScript")
else alert(x)

5
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 caratteri, (punteggio ≈ 0). puoi anche renderlo più corto a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh e puoi anche provare a giocare a golf ....
Chiller matematico

@tryingToGetProgrammingStraight Mettere tutto su una riga del genere non è una sintassi valida in CoffeeScript (che è un linguaggio separato da Javascript). Gli altri sono discutibili, ma dal momento che non è stato specificato quanto debbano essere diverse le lingue, penso che il fatto che le diverse implementazioni abbiano comportamenti specifici differenti consente loro di essere trattate come separate.
Peter Olson,

non posso nemmeno scrivere un commento su più righe, l'unico golf che sembra aver usato è lasciare fuori {/ }/ ;... l'idea è di usare aper evitare il riutilizzo "undefined", si potrebbe anche fare b=alerte poi b("this is also still just javascript"). comunque The golden rule of CoffeeScript is: "It's just JavaScript"(da coffeescript.org ), puoi anche usare un po 'di jquery per aggiungere una sesta lingua ....
Math chiller

1
@tryingToGetProgrammingStraight Aggiungere jQuery sarebbe assurdo, dal momento che jQuery è una libreria, non una lingua. CoffeeScript non è sicuramente la stessa lingua di ECMAScript. La definizione di una lingua è un insieme di stringhe finite sopra un alfabeto finito. L'insieme di stringhe che rappresentano programmi CoffeeScript validi non è uguale all'insieme di stringhe che rappresentano ECMAScript valido.
Peter Olson,

1
Puoi fare [].mapinvece di Array.prototype.map?
ETHproductions

3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; punteggio = .0189

Questa era originariamente una risposta a questo .

 ;\\0"egnufeB">:#,_@SSSTTTSTTTL
;TL
;SSSSSTTSTSSSL
;TL
;SSSSSTTSTSSTL
;TL
;SSSSSTSTSTSSL
;TL
;SSSSSTTSSTSTL
;TL
;SSSSSTSTSSTTL
;TL
;SSSSSTTTSSSSL
;TL
;SSSSSTTSSSSTL
;TL
;SSSSSTTSSSTTL
;TL
;SSSSSTTSSTSTL
;SSL
;L
;L
;L
;public class H{ public static void main(String []a){System.out.println("JAVA");}}
;/*
(print "LISP")
;*/
;//<?php
; echo "PHP"
;//?>
;/*
#|
DO ,1 <- #8
DO ,1 SUB #1 <- #110
DO ,1 SUB #2 <- #32
DO ,1 SUB #3 <- #72
DO ,1 SUB #4 <- #136
DO ,1 SUB #5 <- #88
DO ,1 SUB #6 <- #136
PLEASE DO ,1 SUB #7 <- #64
DO ,1 SUB #8 <- #80
PLEASE READ OUT ,1
PLEASE NOTE |#
;*/
;// PLEASE GIVE UP

Questo non funzionerà in Java; ogni riga fino public class...a causare un problema al compilatore.
Ypnypn,

Interessante ... Ricordo distintamente di averlo provato in un compilatore e che funzionava ... o forse la mia memoria mi ha deluso ...
Juan Sebastian Lozano

@Ypnypn Ricorda che "T" è una scheda, "S" è uno spazio e "L" è un avanzamento riga nello spazio bianco, motivo per cui non causa un errore del compilatore.
Juan Sebastian Lozano,

Oh; questo ha senso.
Ypnypn,

3

Windows Batch, TI-Basic, Golf-Basic 84 , Quomplex e GTB 5 * 2/93 = 0.11

::¤Quomplex¤:"'*[]'":~"GTB":g;1:d`"GOLF-BASIC 84":g`1:"TI-BASIC":Lbl 1:End
echo Windows Batch

Come funziona

Windows Batch è stato il più semplice, perché ::inizia un commento. Abbastanza semplice da implementare.

TI-Basic non supporta lettere minuscole o backtick, facendo sì che salti le istruzioni d`"GOLF-BASIC 84":g`1, che Golf-Basic eva, visualizzando il messaggio e inoltrandolo all'etichetta 1, dove è prontamente terminato. Questo è simile per GTB, con il suo carattere comodo display, ~. A proposito, verrà inserita una stringa senza display Ans. Se non ci sono comandi Display che lo seguono, Ansverranno emessi (non il caso qui).

Quomplex è stato inserito all'inizio perché la sua sintassi complessa non consentirà di saltare molto. Tutto ciò che fa è aggiungere "Quomplex"all'output e quindi per la padronanza del programma ...

La padronanza della sintassi di programmazione

:"'*[]'"

Genio puro. Quomplex ignora :e prende "'e '"come stringhe, lasciandolo emettere lo stack e perire in un ciclo while infinito ( []). Nel frattempo, Golf-Basic e TI-Basic prendono il tutto "'*[]'"come una stringa, perché 'è un operatore matematico, non un operatore di stringa.


A rigor di termini, :indica un'etichetta in un file batch, non un commento. È vero che non esegue nulla da solo, però.
Segna il

@Mark True, ma is is ::(comunque un'etichetta). Preferirei usarlo piuttosto che REM, soprattutto perché è richiesto in TI-Basic.
Timtech,

Giusto - Ero solo pedante. Inoltre, +1 per l'utilizzo dei file batch in primo luogo. :-)
Mark

2

JScript, EcmaScript Edition 3, 5, 6, 2016, Node, Mozilla JavaScript (punteggio ≈ 0.1342)

Questa risposta è originariamente basata sulla risposta di Peter Olson, ma meno CoffeeScript (poiché i linguaggi significativi per gli spazi bianchi possono essere orribili per il golf).

Ho anche aggiunto Nodo , ES6 ed ES2016 e ho giocato un po 'il codice, quasi triplicando il punteggio originale.

$=this,y="EcmaScript ",x=$.module?"Node":$.uneval?"Mozilla JavaScript":"".padStart?y+2016:$.Map?y+6:[].map?y+5:y+3,($.WScript||$.alert)(x)

2

16 lingue, 348 byte, punteggio: 0,183908046

#include <stdio.h>
#if 0
#replace "C(gcc)" "C(ecpp)"
#replace "C++(gcc)" "C++(ecpp)"
#endif
#ifdef __clang__
#define d 2
#elif __TINYC__
#define d 4
#else
#define d 0
#endif // rk:start print: "rk" \
ps -ocomm= -p$$; exit;
int x=sizeof('a')%2+d;char*arr[]={"C(gcc)","C++(gcc)","C(clang)","C++(clang)","C(tcc)"};int main(){puts(arr[x]);}

Funziona in C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk e SIL.


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (punteggio = .174193548387), CoffeeScript (poiché i linguaggi significativi per gli spazi bianchi possono essere orribili per il golf).

$=this,y="EcmaScript ",($.WScript||alert)(x=Object.values?y+2017:$.module?"Node":$.uneval?"Mozilla JavaScript":[].includes?y+2016:$.Map?y+6:[].map?y+5:y+3)
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.