Adivinha o idioma

23

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?

Dave
fonte
3
Parece incrivelmente difícil de fazer em 300 bytes. Talvez atribuir mais bytes?
Rohan Jhunjhunwala
1
@RohanJhunjhunwala sim, eu imagino que será um grande desafio! Não estou esperando que alguém obtenha 100% de precisão; o desafio é chegar o mais alto possível. No "quem disse isso?" desafio ao qual vinculei, todos atingimos a precisão de ~ 30%. Tentei definir o limite de bytes para que 50 a 70% sejam possíveis aqui. Espero que eu tenha conseguido o equilíbrio certo. Obviamente, se você encontrar uma ótima solução que usa mais bytes, poste-a! Apenas não será competitivo (você pode reduzi-lo para uma versão concorrente).
Dave
Você removeu poliglotas do conjunto de dados ou serão apenas "truques"?
Geobits 09/07/19
9
Vai ser tão difícil de diferenciar entre golflangs ...
busukxuan
2
Fatos interessantes: os 20 idiomas mais usados ​​(pelo menos no seu conjunto de dados) compõem 81% do seu conjunto de dados e os 10 idiomas mais usados ​​compõem 61%. Apenas detectar diferenças entre Javascript, Pyth, CJam e Python é suficiente para obter cerca de 35%.
precisa

Respostas:

17

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.

#define S(x)!!strstr(p,#x)
f(char*p){return S(#d)?:S(voi)?0:S(mai)|S(utc)?:S(mbd)|S(impor)|S(input)|S(def)|S(rang)?2:S(log)|S(fun)|S(=>)|S(lert)?3:S(<?)?4:S(echo)|S(sed)?5:S(+++)?6:S(<-)?7:S($_)|S(say)?8:S(\342)|S(\303)?9:S(->)|S(map)?10:S(@#)|S(]])|S([#)?11:S(V)|S(Q)?12:S(Z)|S(Y)?13:S(.)?14:15;}

Tabela de mapeamento:

 0. java
 1. c
 2. python
 3. javascript
 4. php
 5. bash
 6. brainf*
 7. haskell
 8. perl
 9. apl
10. ruby
11. wolfram
12. pyth
13. matl
14. golfscript
15. cjam

A porcentagem é baseada nos meus hits / cálculo total: 3916 hits / 9066 total.

owacoder
fonte
Estou fora para um bom começo; aquilo foi rápido! Quanto a "Meu código de teste e editor de texto, consulte as entradas 9068 em vez de 9065 por algum motivo" - você pulou os cabeçalhos e a linha em branco no final? Isso representaria 2 linhas extras.
Dave
Desculpe; isso não está sendo aprovado na regra 7 (deve gerar a resposta correta para o próprio código-fonte): agora diz 0, que é Python (acho que não seria muito trabalhoso reordenar as verificações para corrigir isso)
Dave
Você pode perder o espaço depois define S(x)e o 1 onde quer que esteja ?1.
feersum
Obrigado! Eu não sabia sobre o ?1truque e esqueci o outro. ;-) #
owacoder 11/07
Uau, isso está melhorando silenciosamente! Verificou-se a mais recente 43.19% :)
Dave
2

Python 3, 271 278 bytes, 25,049636% de correspondência (v2, não verificado)

def f(c):
 try:compile(c,'','exec');return 5
 except:
  for j in range(9):
   if any(l in c for l in [['echo'],['require'],['Main','string'],['document','alert','var ','function'],['String'],['def ','lambda','print '],['main','int','char'],['+++','<<<'],[]][j]):break
 return j

mapa:

0 = bash
1 = ruby
2 = c#
3 = javascript
4 = java
5 = python
6 = c
7 = brainf*
8 = cjam

muito melhor jogado (provavelmente ainda não ótimo), finalmente quebrou a barreira de 25%! As entradas foram <LF>substituídas por nova linha ( \n)

helloworld922
fonte
Eu gosto da exectentativa. 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.
Dave
Finalmente cheguei a verificar isso. Só vejo 2103 (23,19%) por algum motivo - alguma ideia do porquê da diferença?
Dave
hmmm ... não tenho certeza. Talvez tenha a ver com a maneira como você está dando a entrada? Eu uso 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.
precisa
Ah ok. Pode ser um problema de codificação; Estou apenas confiando no que quer que fileinput.input () faça por baixo. Eu investigarei.
Dave