Adivina el idioma


23

Introducción

Este sitio está construyendo rápidamente un gran conjunto de datos de fragmentos de código, ¡así que hagamos algo con él!

Aquí hay un archivo de datos . Contiene 9.066 idiomas únicos + pares de fragmentos para 113 idiomas, todos tomados de este sitio. El formato está separado por tabulaciones (idioma-TAB-fragmento), con todas las líneas nuevas en los fragmentos reemplazadas por <LF>, y todas las pestañas reemplazadas por 4 espacios. Hay al menos 5 fragmentos para cada idioma.

[Actualización: he realizado un pequeño cambio en el archivo de datos para fusionar algunas versiones de Python y RegExp que me perdí antes: el enlace de arriba se ha actualizado]

Reto

Escriba un programa o función que tome un fragmento de código y genere el idioma en el que está escrito (consulte los detalles a continuación). El tamaño total de su fuente + cualquier dato que necesite debe ser de 300 bytes o menos, y su programa debe generar el idioma correcto cuando se le dé su propio código fuente. La mayor precisión (la mayoría de las respuestas correctas en el conjunto de datos anterior) gana.

Reglas

  • El tamaño total de su código fuente, recursos y cualquier indicador de compilación / tiempo de ejecución requerido no debe exceder los 300 bytes.
  • Su respuesta será probada contra el conjunto de datos anterior; se le dará uno de los valores "Snippet" como entrada y su salida se comparará con la salida "correcta" según el conjunto de datos. Esto se repetirá para todas las entradas en el conjunto de datos y el número final de respuestas correctas es su puntaje.
  • Puede elegir la codificación de entrada. Asumiré UTF-8, así que si necesita otra codificación, especifíquela en su respuesta.
  • No necesita usar el <LF>reemplazo para líneas nuevas; Si su entrada espera recibir nuevas líneas como nuevas líneas literales (char 10), especifíquelo en su respuesta.
  • Su entrada debe generar el idioma en el que cree que está escrito el fragmento de entrada. Para evitar la necesidad de comprimir muchas cadenas de idioma, permitiré asignaciones (si desea generar 3 para "Java", está bien); solo tenga en cuenta las asignaciones en su respuesta.
  • Solo puede tener 1 asignación de salida para cada idioma (es decir, si 3 significa "Java", tampoco puede tener 4 que significa "Java").
  • Cuando se le da su propio código fuente, su programa debe producir la respuesta correcta (debe mostrar el idioma en el que está escrito).
  • No necesita admitir todos los idiomas en el conjunto de datos, y puede admitir idiomas adicionales si lo desea (por ejemplo, si su entrada no está en uno de los idiomas del conjunto de datos).
  • Su programa debe ser determinista (proporcionar la misma entrada dos veces debe producir la misma salida).

Romper el lazo

  • Los empates se decidirán reduciendo el conjunto de datos hasta que gane una entrada. El conjunto de datos se reducirá eliminando todos los fragmentos del idioma más popular (es decir, los lazos se rompen por la precisión en los idiomas más raros). Por ejemplo, si A y B obtienen un 70% en el conjunto de datos completo, se eliminarán todos los fragmentos de Python. Si A y B ahora obtienen un puntaje de 60%, CJam será eliminado. Si A ahora obtiene un 50% pero B obtiene un 55%, B es el ganador.
  • Si se logra una precisión del 100%, los lazos se decidirán utilizando un segundo conjunto de datos (ciego) que contenga más muestras para los mismos idiomas.

Ejemplo 1

El script de Python:

print("python")

Este script produce con éxito "python" cuando se le da su propio código fuente, por lo que es válido. En el conjunto de datos, obtiene un puntaje de 1008/9066 = 11.1%

Ejemplo 2

La función de JavaScript:

function f(s){return /function/.test(s)?1:2}

Con las asignaciones 1 → javascript, 2 → python. Nuevamente, produce con éxito 1 ("javascript") para su propia fuente, y en el conjunto de datos obtiene un puntaje de 1092/9066 = 12.0%


¿De dónde provienen los datos?

Creé una consulta SEDE para extraer muestras de desafíos [code-golf] en este sitio. De las 10,000 respuestas resultantes, utilicé un script de python pirateado para encontrar el código y el nombre del idioma para cada uno, luego filtré cualquier idioma con menos de 5 ejemplos. Los datos no están 100% limpios (sé que hay algunos fragmentos que no son de código), pero deberían ser lo suficientemente buenos.


Inspirado por este desafío de principios de año: ¿Quién dijo eso? Elección presidencial de 2016

También en parte relacionado con ¿Cuál es el idioma?


3
Parece increíblemente difícil de hacer en 300 bytes. Quizás asignar más bytes?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala sí, ¡me imagino que será todo un desafío! Sin embargo, no espero que nadie obtenga una precisión del 100%; El desafío es llegar lo más alto posible. En el "¿quién dijo eso?" Desafío al que me vinculé, todos alcanzamos un pico de ~ 30% de precisión. He tratado de establecer el límite de bytes para que aquí sea posible un 50-70%. Espero tener el equilibrio correcto. Por supuesto, si encuentra una gran solución que utiliza más bytes, ¡publíquela! Simplemente no competirá (puede reducirlo para una versión competitiva).
Dave

¿Ha eliminado los políglotas del conjunto de datos, o serán solo "trampas"?
Geobits

99
Va a ser muy difícil diferenciar entre campos de golf ...
busukxuan

2
Datos interesantes: los 20 idiomas más utilizados (al menos en su conjunto de datos) constituyen el 81% de su conjunto de datos, y los 10 idiomas más utilizados representan el 61%. Incluso solo detectar diferencias entre Javascript, Pyth, CJam y Python es suficiente para obtener aproximadamente el 35%.
helloworld922

Respuestas:


17

C, 297 bytes, 43.194351% coincidente (v2)

Este es el primer desafío que no es de golf en el que he competido. Sorprendentemente, los idiomas de golf son bastante fáciles de separar, con una precisión de coincidencia de aproximadamente el 60% por idioma.

El código requiere entrada como cadena UTF-8, resultados basados ​​en la versión 2 del conjunto de datos suministrado. Este código no requiere <LF>ser reemplazado por nuevas líneas reales.

#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;}

Tabla de mapeo:

 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

El porcentaje se basa en mis aciertos / cálculo total: 3916 aciertos / 9066 total.


A un gran comienzo; ¡eso fue rápido! En cuanto a "Mi código de prueba y editor de texto, vea 9068 entradas en lugar de 9065 por alguna razón": ¿omitió los encabezados y la línea en blanco al final? Eso representaría 2 líneas adicionales.
Dave

Lo siento; esto no está pasando la regla # 7 (debe dar la respuesta correcta para el propio código fuente): en este momento dice 0, que es Python (supongo que no sería demasiado trabajo reordenar las comprobaciones para arreglar eso)
Dave

Puedes perder el espacio después define S(x)y el 1 donde sea que tengas ?1.
feersum

¡Gracias! No sabía sobre el ?1truco, y me olvidé del otro. ;-)
owacoder

¡Guau, esto ha estado mejorando en silencio! Verificado el último 43.19% :)
Dave

2

Python 3, 271 278 bytes, 25.049636% coincidente (v2, no 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

mucho mejor golfizado (probablemente aún no excelente), finalmente rompió la barrera del 25%. Las entradas se han <LF>reemplazado por nueva línea ( \n)


Me gusta el execintento Por cierto, puede solicitar que la entrada se haya <LF>reemplazado previamente \n, por lo que puede guardar algunos bytes allí para agregar un poco más de ajuste.
Dave

Finalmente pude verificar esto. Solo veo 2103 (23.19%) por alguna razón, ¿alguna idea de por qué la diferencia?
Dave

hmmm ... no estoy seguro. ¿Quizás tiene que ver con cómo estás dando la entrada? Utilizo decode('utf-8')para convertir la matriz de bytes de entrada sin procesar a una cadena nativa de Python 3 unicode (utf-16?) Antes de asignarla a mi función.
helloworld922

Ah ok Podría ser un problema de codificación; Solo estoy confiando en todo lo que fileinput.input () hace bajo el capó. Investigaré
Dave
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.