Introdução
Este site está construindo rapidamente um enorme conjunto de dados de trechos de código, então vamos fazer algo com ele!
Aqui está um arquivo de dados . Ele contém 9.066 pares de idiomas + snippets exclusivos para 113 idiomas, todos extraídos deste site. O formato é separado por tabulação (idioma-TAB-snippet), com todas as novas linhas nos trechos substituídas por <LF>
e todas as guias substituídas por 4 espaços. Existem pelo menos 5 trechos para cada idioma.
[atualização: Eu fiz uma pequena alteração no arquivo de dados para mesclar algumas versões do Python e RegExp que eu perdi antes - o link acima foi atualizado]
Desafio
Escreva um programa ou função que pegue um trecho de código e emita o idioma em que está escrito (veja detalhes abaixo). O tamanho total da sua fonte + todos os dados que você precisa devem ter 300 bytes ou menos, e seu programa deve gerar o idioma correto quando receber seu próprio código-fonte. A precisão mais alta (respostas mais corretas no conjunto de dados acima) vence.
Regras
- O tamanho total do seu código-fonte, recursos e quaisquer sinalizadores de compilação / tempo de execução necessários não devem exceder 300 bytes.
- Sua resposta será testada no conjunto de dados acima; receberá um dos valores "Snippet" como entrada e sua saída será comparada com a saída "correta" de acordo com o conjunto de dados. Isso será repetido para todas as entradas no conjunto de dados e o número final de respostas corretas é a sua pontuação.
- Você pode escolher a codificação de entrada - assumirei UTF-8, portanto, se você precisar de outra codificação, especifique-a na sua resposta.
- Você não precisa usar a
<LF>
substituição para novas linhas; se sua entrada espera receber novas linhas como novas linhas literais (caractere 10), especifique-a na sua resposta. - Sua entrada deve gerar o idioma em que o trecho de entrada está escrito. Para evitar a necessidade de compactar muitas seqüências de idiomas, permitirei mapeamentos (se você deseja gerar 3 para "Java", tudo bem); apenas observe os mapeamentos em sua resposta.
- Você pode ter apenas 1 mapeamento de saída para cada idioma (por exemplo, se 3 significa "Java", você também não pode ter 4 significando "Java").
- Quando recebe seu próprio código-fonte, seu programa deve produzir a resposta correta (deve gerar o idioma em que está escrito).
- Você não precisa oferecer suporte a todos os idiomas no conjunto de dados e pode oferecer suporte a idiomas extras, se desejar (por exemplo, se sua entrada não estiver em um dos idiomas do conjunto de dados).
- Seu programa deve ser determinístico (fornecer a mesma entrada duas vezes deve produzir a mesma saída).
Desempate
- Os laços serão decididos reduzindo o conjunto de dados até que uma entrada seja concluída. O conjunto de dados será reduzido removendo todos os trechos do idioma mais popular (ou seja, os vínculos são quebrados pela precisão nos idiomas mais raros). Por exemplo, se A e B obtiverem 70% no conjunto de dados completo, todos os snippets do Python serão removidos. Se A e B agora obtiverem 60%, o CJam será removido. Se A agora obtém 50%, mas B obtém 55%, B é o vencedor.
- Se 100% de precisão for alcançada, os empates serão decididos usando um segundo conjunto de dados (cego) contendo mais amostras para os mesmos idiomas.
Exemplo 1
O script Python:
print("python")
Este script produz com êxito "python" quando recebe seu próprio código-fonte, portanto é válido. No conjunto de dados, ele pontua 1008/9066 = 11,1%
Exemplo 2
A função JavaScript:
function f(s){return /function/.test(s)?1:2}
Com os mapeamentos 1 → javascript, 2 → python. Novamente, ele produz com êxito 1 ("javascript") para sua própria fonte e, no conjunto de dados, obtém 1092/9066 = 12,0%
De onde vieram os dados?
Criei uma consulta SEDE para extrair amostras dos desafios do [code-golf] neste site. A partir das 10.000 respostas resultantes, usei um script python hackeado para encontrar o nome do código e idioma de cada um e filtrar qualquer idioma com menos de 5 exemplos. Os dados não são 100% limpos (eu sei que existem alguns trechos sem código), mas devem ser bons o suficiente.
Inspirado por esse desafio do início do ano: quem disse isso? Eleição presidencial de 2016
Também parcialmente relacionado a What's the Language?
Respostas:
C, 297 bytes, 43.194351% correspondidos (v2)
Este é o primeiro desafio de não-golfe em que participei. Surpreendentemente, os idiomas de golfe são realmente fáceis de separar, com cerca de 60% de precisão de correspondência por idioma.
O código requer entrada como sequência UTF-8, resultados com base na versão 2 do conjunto de dados fornecido. Este código não precisa
<LF>
ser substituído por novas linhas reais.Tabela de mapeamento:
A porcentagem é baseada nos meus hits / cálculo total: 3916 hits / 9066 total.
fonte
define S(x)
e o 1 onde quer que esteja?1
.?1
truque e esqueci o outro. ;-) #Python 3,
271278 bytes, 25,049636% de correspondência (v2, não verificado)mapa:
muito melhor jogado (provavelmente ainda não ótimo), finalmente quebrou a barreira de 25%! As entradas foram
<LF>
substituídas por nova linha (\n
)fonte
exec
tentativa. A propósito, você pode solicitar que a entrada seja<LF>
pré-substituída por\n
, para que você possa salvar alguns bytes para adicionar um pouco mais de ajuste fino.decode('utf-8')
para converter a matriz de bytes de entrada bruta em uma string nativa do Python 3 unicode (utf-16?) Antes de atribuí-la à minha função.