Ecrivez un polyglotte qui affiche le nom de la langue


65

Votre tâche consiste à écrire un programme qui s’exécute dans le plus grand nombre de langues possible, avec le moins de caractères possible. Pour éviter des solutions triviales, le programme doit imprimer le nom de la langue dans laquelle il a été exécuté.

Notation

Votre programme doit fonctionner dans au moins 5 langues. Le score d'un programme est donné comme:

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

Le score le plus élevé l'emporte, pas plus de 10 jours après la première réponse valide.


Est-ce que l’utilisation d’une solution telle que l’utilisation print()de Perl, Python, PHP, Processing et R serait considérée comme triviale ou est-ce acceptable?
Rob

3
A ne peut pas voir un problème avec cela. La difficulté serait de changer les entrées d'impression par langue.
Mjgpy3

J'aurais dû accorder un poids plus élevé au nombre de langues ... il semble que choisir exactement 5 langues est la plus optimale. Je me demande combien de langues auraient été dans la liste des gagnants si le score avait étén * n / length
vsz

J'allais suggérer cela aussi. D'après les réponses fournies, je ne crois pas avoir bien interprété votre question.
Rob

Réponses:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 caractères

score ~ ​​0.1236

Pour les codes de type C et C, j’ai une dette envers @ baby-lapins. Les autres sont inspirés par la reconnaissance du fait que de nombreuses langues ont une evaldéclaration qui accepte à contrecoeur une syntaxe non valide.

Affiche le nom de la langue sur la sortie standard. Parfois, génère beaucoup de messages d’erreur en cas d’erreur standard, supprimez-les dès 2>/dev/nullque vous les exécutez.

#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 solution php affiche les résultats 'PHP'(y compris les guillemets simples), ce qui peut être un peu fléchissant les règles.

Dernière édition: rasé 12 caractères de l'insight qui se $=trouve falseen Ruby, 60en Perl et qui print$=?...est presque sûrement une erreur dans Bash. Le test Perl / Ruby / Bash peut maintenant entrer dans une seule déclaration eval, ce qui en réduit 7 autres.

Si les règles peuvent tolérer plus de flexion, je présente cette solution en 8 langues et 43 caractères (score 0.5262).

print("phperluarscriptrubypythoncatebg13");

pour lequel la sortie comprend le nom de l'interprète php, perl, lua, rscript, ruby, python, cat, et rot13.


1
TI-Basic prend en charge le dernier. il suffit d'ajouter 6 caractères et d'obtenirprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech non, TI-Basic utilise la Dispou Output(ou des text(jetons, il n'y a aucune print(commande. De plus, l'inclusion d'une chaîne dans une expression de valeur réelle donne un résultat différent de ERR:INVALID SYNTAXl'affichage de la chaîne (pas même comme valeur de retour). (En outre, il n'y a pas ;; TI-Basic utilise :)
AJMansfield

@AJMansfield Trop vrai, comment pourrais-je oublier:?
Timtech

12
Pouvez-vous remplacer echo Bashpar ps -ocomm= -p$$? Cela affichera le nom du shell pour au moins bash, zsh, ksh, csh et tcsh, peut-être d'autres.
Digital Trauma

19

C, C ++, BF, BASH et Ruby; 280 caractères

Le score est d'environ 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);}

Notez que j'utilise un système Linux.

Le code est exécuté ou compilé avec les commandes suivantes (le nom du fichier est test.c)

C:

gcc test.c

Lorsqu'il est exécuté avec ./a.out, la sortie estC

C ++:

c++ test.c

Lorsqu'il est exécuté avec ./a.out, la sortie estC++

FRAPPER:

./test.c

Les sorties: BASH

Rubis:

ruby test.c

Les sorties: Ruby

BrainF ***:

Vérifié en utilisant les éléments suivants:

Les sorties: brainfuck

Notez que si le débogueur JS est utilisé, les deux premiers signes moins doivent être supprimés. Ils ont été inclus pour compenser les signes plus dans le littéral de chaîne "C++". C'était un projet très amusant, je travaille sur l'ajout de plusieurs langues.

Juste pour ajouter plus de clarté, voici les spécifications de mon interprète / compilateur:

  • gcc version 4.6.3

  • ruby 1.9.3p194 (révision 2012-04-20, révision 35410) [x86_64-linux]

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

NOTE DE CÔTÉ

En utilisant le tour de @ baby-rabbit, j'ai pu étendre mon code pour qu'il soit exécutable dans 7 langages (Objective-C et Objective-C ++ étant ajoutés). Ce n'est pas ma solution puisque j'en ai copié, mais je pensais la montrer.

Update 9.12 Ajouté l'exécution de SmallTalk avec gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 caractères (score: 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

Dans le code ci-dessus, vous devrez renommer le fichier pour produire le nom de la langue pour objective-c, obj-c ++, c et c ++.


serait-il plus court si vous produisez brainf***?
mob

Oui ce serait, je crois.
mjgpy3

Vous devriez utiliser à la if [ 1 = 2 ]place de if [ 1 == 2 ], car les scripts sans hashbang sont exécutés par sh, pas bash. sh peut être ou ne pas être bash, sous Debian, c'est un tiret.
Nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 caractères; score = 0,083

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

renommer le fichier et exécuter / compiler en tant que:

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

(où cc est clang-421.10.42)


+1 puisque de nombreuses autres réponses positives ont été inspirées par les vôtres.
Kevin - Réintégrer Monica le

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 caractères; ~ 0,087 points)

Je ne sais pas si cela compte - la partie sed est enchâssée dans la ligne shebang, ce qui est sans doute un hack pour contourner la restriction. Cela signifie également qu'il devrait être exécuté comme un exécutable et non directement avec sed.

J'ai eu la chance que toutes les autres langues (sans Befunge) ignorent automagiquement la ligne shebang (bien qu'apparemment Ruby refuse d'exécuter le fichier s'il contient une ligne shebang ne contenant pas la chaîne '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

Exemple d'utilisation:

% 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, une solution qui ne comprend pas C
vsz

8

BF, Bash, Batch, C, vi (163 caractères; score 0,0686)

( <ESC>signifie code 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 */

J'ai testé cela en tant que fichier de commandes avec la version MS-DOS 6.22 de COMMAND.COM. Par défaut, cet interpréteur mélange les lignes de code source avec la sortie. Pour éviter cela, exécutez-le echo offavant d'exécuter le fichier de commandes.

Pour exécuter le code vi, que je n'ai testé qu'avec Vim, utilisez la commande suivante:

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

1
Vous pouvez utiliser touch tmpfileou : > tmpfileau lieu de cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 caractères, score de 0,745

Celui-ci est un peu exagéré car ce sont toutes des langues apparentées, mais il existe des différences:

ps -ocomm= -p$$

Qu'en est-il de Dash?
Elliot A.

4

Chaque version de Python, 18,37291 points

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

Techniquement valable, si vous considérez que toutes les versions de python sont des langages différents. Il existe actuellement 116 versions de python, ce qui me donne une note d'environ 18,37291.

(Je comprends aussi si cela n'est pas considéré comme une réponse valable, c'était juste pour le plaisir)


vous obtenez toujours mon +1 juste pour le fun.
vsz

L'impression du numéro de version complet est-elle viable? (Cela réduit la taille de 4 octets et étend les versions possibles de Python.)
A _

Aussi est-ce que ça va? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 caractères; score .077)

( <BS>signifie code ASCII 8. <ESC>signifie code 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");}

Pour exécuter le code vi, que je n'ai testé qu'avec Vim, utilisez cette commande:

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

3

C'est une sélection de langues bon marché, mais voici:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 caractères, score 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 caractères (score 0). vous pouvez également le raccourcir, a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh et vous pouvez aussi essayer de le jouer au golf ....
Math Chiller

@tryingToGetProgrammingStraight Tout mettre sur une seule ligne ne constitue pas une syntaxe valide dans CoffeeScript (qui est un langage distinct de Javascript). Les autres sont discutables, mais comme il n'a pas été précisé à quel point les langues doivent être différentes, je pense que le fait que les différentes implémentations ont des comportements spécifiés différents permet de les traiter séparément.
Peter Olson

Je ne peux pas non plus écrire un commentaire sur plusieurs lignes, le seul golf que vous semblez avoir utilisé est de laisser de côté {/ }/ ;... l’idée est d’utiliser apour éviter de réutiliser "undefined", vous pouvez également le faire b=alertet ensuite b("this is also still just javascript"). de toute façon The golden rule of CoffeeScript is: "It's just JavaScript"(de coffeescript.org ), vous pouvez également utiliser un jquery pour ajouter une sixième langue ....
Math Chiller

1
@tryingToGetProgrammingStraight Ajouter jQuery serait absurde, car jQuery est une bibliothèque, pas un langage. CoffeeScript n’est certainement pas le même langage que ECMAScript. La définition d'une langue est un ensemble de chaînes finies sur un alphabet fini. L'ensemble de chaînes représentant les programmes CoffeeScript valides n'est pas le même que l'ensemble de chaînes représentant ECMAScript valide.
Peter Olson

1
Pouvez-vous faire [].mapau lieu de Array.prototype.map?
ETHproductions

3

Java, Lisp, espaces blancs, Intercal, PHP, Befunge-98; score = 0,0189

C'était à l'origine une réponse à cela .

 ;\\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

Cela ne fonctionnera pas en Java. chaque ligne jusqu’à public class...provoquera un problème de compilation.
Ypnypn

Intéressant ... Je me souviens distinctement d'avoir testé cela dans un compilateur et que cela fonctionne ... ou peut-être que ma mémoire me manque ...
Juan Sebastian Lozano

@Ypnypn Rappelez-vous que "T" est un onglet, "S" est un espace et "L" est un saut de ligne dans un espace, ce qui explique pourquoi il ne provoque pas d'erreur de compilation.
Juan Sebastian Lozano

Oh; ça a du sens.
Ypnypn

3

Windows Batch, TI-Basic, Golf-Basic 84 , Quomplex et GTB 5 * 2/93 = 0,11

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

Comment ça fonctionne

Le lot Windows était le plus facile, car il ::commence un commentaire. Assez simple à mettre en œuvre.

TI-Basic ne prend pas en charge les minuscules ni les backticks, ce qui l’évite de sauter les instructions d`"GOLF-BASIC 84":g`1que Golf-Basic évalue. Affichage du message et transmission à l’étiquette 1, où il se termine rapidement. Ceci est similaire pour GTB, avec son caractère d'affichage à portée de main, ~. À propos, une chaîne sans affichage sera insérée Ans. Si aucune commande Affichage ne le suit, le résultat Anssera affiché (pas le cas ici).

Quomplex a été pris au début parce que sa syntaxe complexe ne permet pas d’échapper beaucoup. Il ne fait qu'ajouter "Quomplex"à la sortie, puis pour la maîtrise du programme ...

La maîtrise de la syntaxe de programmation

:"'*[]'"

Pur génie. Quomplex ignore :et prend "'et '"sous forme de chaînes, le laissant sortir la pile et périr dans une boucle while infinie ( []). Pendant ce temps, Golf-Basic et TI-Basic prennent le tout "'*[]'"comme une chaîne, car 'est un opérateur mathématique, pas un opérateur de chaîne.


À proprement parler, :indique une étiquette dans un fichier de commandes, pas un commentaire. C'est vrai qu'il n'exécute rien par lui-même, cependant.
Mark

@Mark True, mais is is ::(toujours une étiquette). Je préfère l’utiliser que REM, d’autant plus que c’est nécessaire dans TI-Basic.
Timtech le

Oui, j'étais juste pédant. En outre, +1 pour utiliser des fichiers de commandes en premier lieu. :-)
Mark

2

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

Cette réponse est basée à l'origine sur la réponse de Peter Olson, mais sans le CoffeeScript (en tant que langages importants en espaces peuvent être horribles pour le golf).

J'ai également ajouté Node , ES6 et ES2016 et j'ai un peu joué au code, triplant presque le score original.

$=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 langues, 348 octets, score: 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]);}

Cela fonctionne en C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, tiret, bash, zsh, ksh, csh, tcsh, rk et SIL.


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (score = .174193548387), CoffeeScript (en tant que langages non négligeables pouvant être horribles pour le 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.