Seu desafio é pegar um código-fonte como entrada e exibir em qual linguagem de programação ele está escrito.
Por exemplo, você poderia ter a entrada
class A{public static void main(String[]a){System.out.println("Hello, World!");}}
E saída
Java
Seus dois objetivos principais são diversidade (quantas linguagens de programação você pode detectar) e precisão (quão bom você é na detecção dessas linguagens).
Para poliglotas (programas válidos em mais de um idioma), você pode decidir o que fazer. Você pode apenas produzir a linguagem que seu programa considera mais provável, ou você pode gerar um erro, ou você pode produzir uma variedade de opções possíveis (que provavelmente receberiam mais votos do que apenas um erro!).
Este é um concurso de popularidade , porque seria muito difícil especificar um critério de vitória objetivo diferente. Eleitores, vote em quantos idiomas ele pode detectar e em quão preciso é.
fonte
print("")
pode ser usada em vários idiomas.class A{public static void main(String[]a){System.println.out("Hello, World!");}}
inválida.<!DOCTYPE html>
seguido pelo<html>
,<body>
e outras tags (comometa
) em sua ordem correta?Respostas:
234 formatos de texto - Unix Shell
(nem todos os idiomas - preciso contá-los com cuidado)
Hesito em postar essa resposta um tanto inteligente - uma $$ -, mas não vejo nada nas regras que a proíbam e o
file
utilitário shell realmente faz um bom trabalho nisso. por exemplo:Além disso, você pode usar a
-k
opção de "continuar" ao testar um poliglota:Além disso, a
-l
opção fornecerá uma idéia de quão bom é o algoritmo para diferentes idiomas:Isto é
file-5.09
(no Ubuntu 12.04)fonte
ln -s /usr/bin/file /usr/local/bin/myspecialtool
. Se sua resposta conta, isso não conta também? (Não se preocupe, eu não falo sério.) #Bash - sobre
50.35 bytes por idioma compilávelO truque é apenas compilar, então você não precisa se preocupar em vincular erros de bibliotecas ausentes, e é mais indulgente se você tiver apenas trechos de código.
Obrigado a Shahbaz pelas formas mais curtas!
etc ...
fonte
gcc -c $1 && (echo C; exit 0)
&&
e||
no bash são realmente úteis e ajudam bastante na limpeza do código. Eles não são de forma alguma usados para ofuscar, então você faria bem em aprendê-los.-fsyntax-only
para verificar apenas a sintaxe e pular a compilação real.18 linguagens de programação, 1002 bytes, precisão: teste você mesmo :)
(sim, eu sei que isso não é código de golfe, mas por diversão)
O programa procura trechos de código icônicos, as verificações são ordenadas de forma que as verificações mais claras estejam no topo e as linguagens de programação incorporadas em outras linguagens de programação estejam abaixo (por exemplo, HTML em PHP).
Obviamente, isso falha em programas como
System.out.println('<?php');
Uso no nó:
coffee timwolla.coffee < Example.java
Demo (Demo Online no JSFiddle ):
fonte
coffee
algum argumento? Eu apenas tentei redirecionar arquivos para ele, mas apenas executá-lo e seguir em frente^D
também não faz nada.npm install coffee-script && node_modules/.bin/coffee timwolla.coffee < timwolla.coffee
em uma pasta temporária, isso deve cuspirAPL
. (supondo que você tem uma versão recente do nó e NPM instalado)Essa resposta é uma prova de conceito que provavelmente não receberá mais trabalho de mim mesmo.
Ele fica aquém de várias maneiras:
A idéia é definir uma lista de palavras-chave / caracteres / frases que possam identificar um idioma específico e atribuir uma pontuação a essa palavra-chave para cada idioma. Em seguida, verifique o (s) arquivo (s) de origem para essas palavras-chave e calcule as pontuações de cada idioma para o qual você encontra palavras-chave. No final, o idioma com a pontuação mais alta é o provável vencedor. Isso também serve para programas poliglotas, pois ambos (ou todos) os idiomas relevantes terão uma pontuação alta.
A única coisa para adicionar mais idiomas é identificar suas "assinaturas" e adicioná-las ao mapeamento.
Você também pode atribuir pontuações diferentes a diferentes palavras-chave por idioma. Por exemplo, se você acha que
volatile
é usado mais em Java do que em C, defina a pontuação davolatile
palavra-chave como 2 para Java e 1 para C.fonte
Apenas algumas amplas generalizações.
Eu acho que é bastante preciso.
Aqui é Ruby. Recebe entrada (multilinha) de stdin.
fonte
ini
arquivos ephp
\$\w+
depois do perl para detectar o PHP. Também(\w+)::~\1
é geralmente um processo de destruição de C ++Javascript - 6 idiomas - alta precisão
Idiomas Atuais: Java, C, HTML, PHP, CSS, Javascript
Trabalho com o princípio de que, sempre que uma entrada satisfaz um critério, ela recebe uma pontuação e, com base nessa pontuação, os resultados são fornecidos.
Recursos:
x
idioma ao ver uma palavra-chave.Se você sentir que alguma das entradas dos programas (que eu fiz até agora) não foi capturada ou não obteve resultados inválidos, informe-nos e ficarei feliz em corrigi-las.
Entrada de amostra 1:
Saída de amostra 1:
Explicação:
Isso deveria ter falhado no programa e eu teria impresso
PHP
, mas como meu programa funciona com base em pontuações, nada falha e ele identifica facilmente o Java em primeiro lugar, seguido por outros resultados possíveis.Entrada de amostra 2:
Saída de amostra 2:
Entrada de amostra 3:
Saída de amostra 3:
O código:
fonte