Escriba un políglota que imprima el nombre del idioma.


65

Su tarea es escribir un programa que se ejecute en tantos idiomas como sea posible, con la menor cantidad de caracteres posible. Para evitar soluciones triviales, el programa debe imprimir el nombre del idioma en el que se ejecutó.

Puntuación

Su programa tiene que funcionar en al menos 5 idiomas. El puntaje de un programa se da como:

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

El puntaje más alto gana, no antes de 10 días después de la primera respuesta válida.


¿Usar una solución como print()Perl, Python, PHP, Processing y R se consideraría trivial o es aceptable?
Rob

3
No puedo ver un problema con eso. La dificultad sería cambiar la entrada de impresión por idioma.
mjgpy3

Debería haber dado un mayor peso a la cantidad de idiomas ... parece que elegir tener exactamente 5 es el más óptimo. Me pregunto cuántos idiomas habrían estado en la entrada ganadora si el puntaje fueran * n / length
vsz

Iba a sugerir eso también. Según las respuestas proporcionadas, no creo haber interpretado su pregunta correctamente.
Rob

Respuestas:


39

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

puntaje ~ 0.1236

Para los códigos C y C, tengo una deuda con @ baby-rabbit. Los otros se inspiran en el reconocimiento de que muchos idiomas tienen una evaldeclaración que aceptará de mala gana una sintaxis no válida.

Envía el nombre del idioma a la salida estándar. A veces genera muchos mensajes de error en el error estándar, así que suprímalos 2>/dev/nullmientras los ejecuta.

#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
);}//*/?>'

Los resultados de la solución php 'PHP'(incluidas las comillas simples), que pueden estar doblando las reglas un poco.

Última edición: afeitó 12 caracteres de la información que $=está falseen Ruby, 60en Perl, y print$=?...es casi seguro un error en Bash. Afeitado 7 más de la perspectiva, la prueba Perl / Ruby / Bash ahora puede entrar en una sola declaración de evaluación.

Si las reglas pueden tolerar más flexión, presento esta solución de 8 idiomas y 43 caracteres (puntaje 0.5262)

print("phperluarscriptrubypythoncatebg13");

para el que el resultado incluye el nombre del intérprete para php, perl, lua, rscript, ruby, python, cat, y rot13.


1
TI-Basic es compatible con el último; solo agrega 6 caracteres y obténprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech no, TI-Basic utiliza el Dispo Output(o text(fichas, no hay ningún print(comando. E incluir una cadena como parte de una expresión de otro modo con valor real da como resultado una ERR:INVALID SYNTAX, no la visualización de la cadena (ni siquiera como un valor de retorno). (Además, no hay ;; usos de TI-Basic :)
AJMansfield

@AJMansfield Demasiado cierto, ¿cómo podría olvidarlo?
Timtech

12
¿Se puede reemplazar echo Bashcon ps -ocomm= -p$$? Esto generará el nombre del shell para al menos bash, zsh, ksh, csh y tcsh, tal vez otros.
Trauma digital

19

C, C ++, BF, BASH y Ruby; 280 caracteres

El puntaje es de aproximadamente 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);}

Tenga en cuenta que estoy usando un sistema Linux.

El código se ejecuta o compila con los siguientes comandos (el nombre del archivo es test.c)

C:

gcc test.c

Cuando se ejecuta con ./a.out, la salida esC

C ++:

c++ test.c

Cuando se ejecuta con ./a.out, la salida esC++

GOLPETAZO:

./test.c

Salidas: BASH

Rubí:

ruby test.c

Salidas: Ruby

BrainF ***:

Verificado usando lo siguiente:

Salidas: brainfuck

Tenga en cuenta que si se utiliza el depurador JS, entonces los dos primeros signos menos deben eliminarse. Se incluyeron para compensar los signos más en el literal de cadena "C++". Este fue un proyecto muy divertido, estoy trabajando para agregar más idiomas.

Solo para agregar más claridad, aquí están las especificaciones de mi intérprete / compilador:

  • gcc versión 4.6.3

  • ruby 1.9.3p194 (revisión 2012-04-20 35410) [x86_64-linux]

  • GNU bash, versión 4.2.24 (1) -release (x86_64-pc-linux-gnu)

NOTA LATERAL

Usando el truco de @ baby-rabbit pude extender mi código para que sea ejecutable en 7 lenguajes (agregando Objective-C y Objective-C ++). Esta no es mi solución, ya que copié algunas, pero pensé en mostrarlas.

Actualización 9.12 ¡Se agregó SmallTalk run con gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 caracteres (Puntuación: 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

En el código anterior, deberá cambiar el nombre del archivo para generar el nombre del idioma para aim-c, obj-c ++, c y c ++.


¿Sería más corto si sale brainf***?
mafia

Sí, creo.
mjgpy3

Debería usar en if [ 1 = 2 ]lugar de if [ 1 == 2 ], porque los scripts sin un hashbang se ejecutan mediante sh, no bash. sh puede o no ser bash, en Debian es dash.
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 caracteres; puntuación = 0.083

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

cambiar el nombre del archivo y ejecutar / compilar como:

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

(donde cc es clang-421.10.42)


+1 ya que muchas otras respuestas votadas se inspiraron en las tuyas.
Kevin - Restablece a Mónica el

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 caracteres; ~ 0.087 puntos)

No estoy seguro de si esto cuenta: la parte sed está incrustada en la línea shebang, que podría decirse que es un truco para sortear la restricción. Esto también significa que debe ejecutarse como un ejecutable y no directamente con sed.

Tuve la suerte de que todos los demás idiomas (sin Befunge) ignoren automáticamente la línea shebang (aunque aparentemente Ruby se niega a ejecutar el archivo si tiene una línea shebang que no contiene la cadena '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

Uso de la muestra:

% 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

55
Wow, una solución que no incluye C
vsz

8

BF, Bash, Batch, C, vi (163 caracteres; puntuación ≈ .0686)

( <ESC>significa código 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 */

Probé esto, como un archivo por lotes, con la versión 6.22 de COMMAND.COM de MS-DOS. Por defecto, ese intérprete mezcla líneas de código fuente con la salida. Para evitar que eso suceda, ejecute echo offantes de ejecutar el archivo por lotes.

Para ejecutar el código vi, que solo he probado usando Vim, use el siguiente comando:

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

1
Podrías usar touch tmpfileo en : > tmpfilelugar de cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 caracteres, puntaje 0.745

Este es un poco exagerado ya que todos son lenguajes relacionados, pero hay diferencias:

ps -ocomm= -p$$

¿Qué hay del guión?
Elliot A.

4

Cada lanzamiento de Python, 18.37291 puntos

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

Técnicamente válido, si considera que todas las versiones de Python son idiomas diferentes. Actualmente hay 116 versiones de python, que creo que me dan una puntuación de alrededor de 18.37291.

(También entiendo que si esto no se considera una respuesta válida, fue solo por diversión)


Todavía obtienes mi +1 solo por diversión.
vsz

¿Es viable imprimir el número de versión completo? (Esto baja 4 bytes y extiende las posibles versiones de Python.)
A _

¿También está bien? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 caracteres; puntuación ≈ .077)

( <BS>significa el código ASCII 8. <ESC>significa el código 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");}

Para ejecutar el código vi, que solo he probado usando Vim, use este comando:

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

3

Esta es una selección barata de idiomas, pero aquí va:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 caracteres, puntaje ≈ 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)

55
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 caracteres, (puntaje ≈ 0). también puedes hacerlo más corto, a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh, y también puedes intentar jugar al golf ...
Math chiller el

@tryingToGetProgrammingStraight Poner todo en una línea como esa no es una sintaxis válida en CoffeeScript (que es un lenguaje separado de Javascript). Los otros son discutibles, pero dado que no se especificó cuán diferentes deben ser los idiomas, creo que el hecho de que las diferentes implementaciones tengan diferentes comportamientos específicos les permite ser tratados como separados.
Peter Olson

Tampoco puedo escribir un comentario de varias líneas, el único juego de golf que parece haber utilizado es dejar de lado {/ }/ ;... la idea es utilizar apara evitar la reutilización "undefined", también podría hacerlo b=alerty luego b("this is also still just javascript"). de todos modos The golden rule of CoffeeScript is: "It's just JavaScript"(de coffeescript.org ), también puede usar un poco de jquery para agregar un sexto idioma ...
Math chiller

1
@tryingToGetProgrammingStraight Agregar jQuery sería absurdo, ya que jQuery es una biblioteca, no un lenguaje. CoffeeScript definitivamente no es el mismo lenguaje que ECMAScript. La definición de un idioma es un conjunto de cadenas finitas sobre un alfabeto finito. El conjunto de cadenas que representan programas válidos de CoffeeScript no es el mismo que el conjunto de cadenas que representa ECMAScript válido.
Peter Olson

1
¿Se puede hacer en [].maplugar de Array.prototype.map?
ETHproductions

3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; puntuación = .0189

Esto fue originalmente una respuesta a esto .

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

Esto no funcionará en Java; cada línea hasta public class...causará un problema de compilación.
Ypnypn

Interesante ... Recuerdo claramente haber probado esto en un compilador y está funcionando ... o quizás mi memoria me falla ...
Juan Sebastian Lozano

@Ypnypn Recuerde que "T" es una pestaña, "S" es un espacio y "L" es un avance de línea en espacios en blanco, por lo que no causa un error del compilador.
Juan Sebastián Lozano

Oh; eso tiene sentido.
Ypnypn

3

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

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

Cómo funciona

Windows Batch fue el más fácil, porque ::comienza un comentario. Bastante simple de implementar.

TI-Basic no admite letras minúsculas o comillas invertidas, lo que hace que omita las declaraciones d`"GOLF-BASIC 84":g`1, que Golf-Basic evalúa, muestra el mensaje y lo reenvía a la etiqueta 1, donde finaliza rápidamente. Esto es similar a GTB, con su carácter útil muestra, ~. Por cierto, se colocará una cadena sin pantalla Ans. Si no hay comandos de pantalla que lo sigan, se Ansgenerarán (no es el caso aquí).

Quomplex se coló al principio porque su sintaxis compleja no permitirá que se salte mucho. Todo lo que hace es agregar "Quomplex"a la salida, y luego para el dominio del programa ...

El dominio de la sintaxis de programación

:"'*[]'"

Genio puro. Quomplex ignora :y toma "'y '"como cadenas, dejándolo salir a la pila y perecer en un ciclo while infinito ( []). Mientras tanto, Golf-Basic y TI-Basic toman el todo "'*[]'"como una cadena, porque 'es un operador matemático, no un operador de cadena.


Estrictamente hablando, :indica una etiqueta en un archivo por lotes, no un comentario. Sin embargo, es cierto que no ejecuta nada por sí solo.
Mark

@ Mark True, pero es ::(aunque sigue siendo una etiqueta). Prefiero usarlo que REM, especialmente porque es obligatorio en TI-Basic.
Timtech

Correcto, solo estaba siendo pedante. Además, +1 para usar archivos por lotes en primer lugar. :-)
Marque el

2

JScript, EcmaScript Edition 3, 5, 6, 2016, Nodo, JavaScript de Mozilla (puntaje ≈ 0.1342)

Esta respuesta se basa originalmente en la respuesta de Peter Olson, pero sin el CoffeeScript (ya que los lenguajes significativos para espacios en blanco pueden ser horribles para el golf).

También agregué Node , ES6 y ES2016 y jugué un poco el código, casi triplicando el puntaje 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 idiomas, 348 bytes, puntuación: 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]);}

Esto funciona en C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk y SIL.


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, JavaScript de Mozilla (puntaje = .174193548387), CoffeeScript (ya que los idiomas con espacios en blanco significativos pueden ser horribles para el 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.