Escreva um poliglota que imprima o nome do idioma


65

Sua tarefa é escrever um programa que seja executado no maior número possível de idiomas, com o mínimo de caracteres possível. Para evitar soluções triviais, o programa deve imprimir o nome do idioma em que foi executado.

Pontuação

Seu programa deve funcionar em pelo menos 5 idiomas. A pontuação de um programa é dada como:

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

A pontuação mais alta vence, não antes de 10 dias após a primeira resposta válida.


Usar uma solução como print()Perl, Python, PHP, Processing e R seria considerado trivial ou é aceitável?
Rob

3
A não pode ver um problema com isso. A dificuldade seria alternar a entrada da impressão por idioma.
Mjgpy3

Eu deveria ter dado um peso maior ao número de idiomas ... parece que optar por ter exatamente 5 é o mais ideal. Gostaria de saber quantas línguas teriam sido na entrada do vencedor se a pontuação fossen * n / length
vsz

Eu ia sugerir isso também. Com base nas respostas fornecidas, não acredito que tenha interpretado sua pergunta corretamente.
Rob

Respostas:


39

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

score ~ ​​0.1236

Para os códigos C e C, devo uma dívida a @ baby-rabbit. Os outros são inspirados pelo reconhecimento de que muitos idiomas têm uma evaldeclaração que aceita relutantemente sintaxe inválida.

Envia o nome do idioma para a saída padrão. Às vezes, gera muitas mensagens de erro no erro padrão; portanto, suprima-as 2>/dev/nullconforme você as executa.

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

A solução php gera 'PHP'(incluindo as aspas simples), que podem estar distorcendo um pouco as regras.

Última edição: raspou 12 caracteres a partir do insight que $=está falseno Ruby, 60no Perl, e print$=?...é quase certamente um erro no Bash. Com mais 7 dicas do insight, o teste Perl / Ruby / Bash agora pode entrar em uma única declaração de avaliação.

Se as regras puderem tolerar mais flexão, apresento essa solução de 8 caracteres e 43 caracteres (pontuação 0,5262)

print("phperluarscriptrubypythoncatebg13");

para os quais a saída inclui o nome do intérprete para php, perl, lua, rscript, ruby, python, cat, e rot13.


11
O TI-Basic suporta o último; basta adicionar 6 caracteres e obterprint("phperluarscriptrubypythontibasicatebg13");
Timtech

11
@Timtech não, TI-Basic usa o Dispou Output(ou text(fichas, não há print(comando. E incluir uma sequência como parte de uma expressão com valor real resultará em uma ERR:INVALID SYNTAXexibição, não na sequência (nem mesmo como um valor de retorno). (Além disso, não existe ;; TI-Basic usa :)
AJMansfield

@AJMansfield É verdade, como eu poderia esquecer:?
Timtech

12
Você pode substituir echo Bashcom ps -ocomm= -p$$? Isso produzirá o nome do shell para pelo menos bash, zsh, ksh, csh e tcsh, talvez outros.
Digital Trauma

19

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

A pontuação é de cerca de 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);}

Observe que estou usando um sistema Linux.

O código é executado ou compilado com os seguintes comandos (o nome do arquivo é test.c)

C:

gcc test.c

Quando executado com ./a.out, a saída éC

C ++:

c++ test.c

Quando executado com ./a.out, a saída éC++

BATER:

./test.c

Saídas: BASH

Rubi:

ruby test.c

Saídas: Ruby

BrainF ***:

Verificado usando o seguinte:

Saídas: brainfuck

Observe que, se o depurador JS for usado, os dois primeiros sinais de menos precisarão ser removidos. Eles foram incluídos para compensar os sinais de mais na string literal "C++". Este foi um projeto muito divertido, estou trabalhando para adicionar mais idiomas.

Apenas para adicionar mais clareza, aqui estão as especificações do meu intérprete / compilador:

  • gcc versão 4.6.3

  • ruby 1.9.3p194 (revisão de 20/04/2012 35410) [x86_64-linux]

  • Lançamento do GNU bash, versão 4.2.24 (1) (x86_64-pc-linux-gnu)

NOTA

Usando o truque de @ baby-rabbit, consegui estender meu código para ser executável em 7 idiomas (sendo adicionados o objetivo-C e o objetivo-c ++). Esta não é a minha solução desde que copiei algumas, mas pensei em mostrá-la.

Atualização 9.12 Adicionada a execução do SmallTalk com o gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 caracteres (Pontuação: 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

No código acima, você precisará renomear o arquivo para produzir o nome do idioma para objetivo-c, obj-c ++, ce ec ++.


seria mais curto se você produzir brainf***?
mob

Sim, acredito.
Mjgpy3

Você deve usar em if [ 1 = 2 ]vez de if [ 1 == 2 ], porque scripts sem um hashbang são executados por sh, não por bash. sh pode ou não ser bash, no Debian é um dash.
Nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 caracteres; score = 0.083

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

renomeie o arquivo e execute / compile como:

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

(onde cc é clang-421.10.42)


+1 porque muitas outras respostas votadas foram inspiradas na sua.
Kevin

11

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

Não tenho certeza se isso conta - a parte sed está embutida na linha shebang, que é sem dúvida um truque para contornar a restrição. Isso também significa que ele deve ser executado como um executável e não diretamente com sed.

Eu tive sorte que todos os outros idiomas (sem Befunge) ignoram automaticamente a linha shebang (embora aparentemente Ruby se recuse a executar o arquivo se ele tiver uma linha shebang que não contenha a string '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 da amostra:

% 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
Uau, uma solução que não inclui C
vsz

8

BF, Bash, Lote, C, vi (163 caracteres; pontuação 0 .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 */

Eu testei isso, como um arquivo em lotes, com a versão do COMMAND.COM do MS-DOS 6.22. Por padrão, esse intérprete mistura linhas de código-fonte com a saída. Para impedir que isso aconteça, execute echo offantes de executar o arquivo em lotes.

Para executar o código vi, que eu testei apenas usando o Vim, use o seguinte comando:

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

11
Você poderia usar touch tmpfileou em : > tmpfilevez de cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 caracteres, pontuação 0,745

Este é um pouco exagerado, já que são todos idiomas relacionados, mas há diferenças:

ps -ocomm= -p$$

E o traço?
6306 Elliot A.

4

Toda versão do Python, 18.37291 pontos

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

Tecnicamente válido, se você considerar que todas as versões do python são linguagens diferentes. Atualmente, existem 116 versões em python, que eu acredito que me dão uma pontuação em torno de 18.37291.

(Também entendo que, se isso não for considerado uma resposta válida, foi apenas por diversão)


você ainda recebe meu +1 apenas por diversão.
vsz

A impressão do número completo da versão é viável? (Este joga golfe para baixo 4 bytes e estende-se os possíveis versões Python.)
A _

Também está tudo bem? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 caracteres; pontuação 77 .077)

( <BS>significa código ASCII 8. <ESC>significa 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 executar o código vi, que eu apenas testei usando o Vim, use este comando:

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

3

Esta é uma seleção barata de idiomas, mas aqui vai:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 caracteres, pontuação ≈ 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 caracteres, (pontuação ≈ 0). você também pode torná-lo mais curto a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh e você também pode tentar jogar golfe-lo ....
Math chiller

@tryingToGetProgrammingStraight Colocar tudo em uma linha como essa não é uma sintaxe válida no CoffeeScript (que é um idioma separado do Javascript). Os outros são discutíveis, mas como não foi especificado o quão diferentes as linguagens devem ser, acho que o fato de as diferentes implementações terem comportamentos especificados diferentes permite que elas sejam tratadas como separadas.
22613 Peter Olson

Eu também não posso escrever um comentário em várias linhas, o único golfe que você parece ter usado é deixar de fora {/ }/ ;... a idéia é usar apara evitar a reutilização "undefined", você também pode fazer isso b=alerte depois b("this is also still just javascript"). de qualquer maneira The golden rule of CoffeeScript is: "It's just JavaScript"(de coffeescript.org ), você também pode usar alguns jQuery para adicionar um sexto idioma ....
Math chiller

11
@tryingToGetProgrammingStraight A adição de jQuery seria absurda, pois o jQuery é uma biblioteca, não um idioma. O CoffeeScript definitivamente não é a mesma linguagem que o ECMAScript. A definição de um idioma é um conjunto de cadeias finitas sobre um alfabeto finito. O conjunto de cadeias de caracteres que representam programas válidos do CoffeeScript não é o mesmo que o conjunto de cadeias de caracteres que representam ECMAScript válido.
22613 Peter Olson

11
Você pode fazer em [].mapvez de Array.prototype.map?
ETHproductions

3

Java, Lisp, Espaço em Branco, Intercal, PHP, Befunge-98; score = .0189

Esta foi originalmente uma resposta para isso .

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

Isso não vai funcionar em Java; cada linha até public class...causará um problema no compilador.
Ypnypn

Interessante ... Lembro-me de testar isso em um compilador e trabalhar ... ou talvez a memória não me falha ...
Juan Sebastian Lozano

@Ypnypn Lembre-se de que "T" é uma guia, "S" é um espaço e "L" é um feed de linha no espaço em branco, e é por isso que não causa um erro no compilador.
Juan Sebastian Lozano

Oh; isso faz sentido.
Ypnypn

3

Lote do Windows, TI-Básico, Golfe Básico 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

Como funciona

O Lote do Windows foi o mais fácil, porque ::inicia um comentário. Bastante simples de implementar.

O TI-Basic não suporta letras minúsculas ou reticulares, fazendo com que pule as instruções d`"GOLF-BASIC 84":g`1, que o Golf-Basic evoca, Exibindo a mensagem e encaminhando para o Rótulo 1, onde é prontamente finalizado. Isso é semelhante para o GTB, com seu útil caractere de exibição ~,. A propósito, uma string sem exibição será inserida Ans. Se não houver comandos de exibição a seguir, Ansserá emitido (não é o caso aqui).

O Quomplex foi introduzido no início porque sua sintaxe complexa não permitirá que muito seja ignorado. Tudo o que faz é adicionar "Quomplex"à saída e, em seguida, ao domínio do programa ...

O domínio da sintaxe de programação

:"'*[]'"

Gênio puro. Quomplex ignora :e pega "'e '"como strings, deixando que ele produza a pilha e pereça em um loop while infinito ( []). Enquanto isso, o Golf-Basic e o TI-Basic levam o todo "'*[]'"como uma sequência, porque 'é um operador matemático, não um operador de sequência.


Estritamente falando, :indica um rótulo em um arquivo em lotes, não um comentário. É verdade que ele não executa nada por si só.
Mark

@ Mark True, mas é é ::(ainda é um rótulo). Prefiro usá-lo do que REM, principalmente porque é necessário no TI-Basic.
Timtech #

Certo - eu estava apenas sendo pedante. Além disso, +1 para usar arquivos em lote em primeiro lugar. :-)
Marque

2

JScript, EcmaScript Edition 3, 5, 6, 2016, Node, Mozilla JavaScript (pontuação ≈ 0.1342)

Essa resposta é originalmente baseada na resposta de Peter Olson, mas menos o CoffeeScript (como linguagens com espaço em branco significativo podem ser horríveis para o golfe).

Também adicionei Node , ES6 e ES2016 e joguei o código um pouco, quase triplicando a pontuação 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, pontuação: 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]);}

Isso funciona em 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 Edição 3, 5, 6, 2016, 2017, Nó, JavaScript da Mozilla (pontuação = .174193548387), CoffeeScript (como linguagens com espaço em branco significativo podem ser horríveis para o golfe).

$=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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.