Como todos sabemos, el meta está repleto de quejas sobre la puntuación del golf de código entre idiomas (sí, cada palabra es un enlace separado, y esto puede ser solo la punta del iceberg).
Con tantos celos hacia aquellos que realmente se molestaron en buscar la documentación de Pyth, pensé que sería bueno tener un poco más de un desafío constructivo, acorde con un sitio web que se especializa en desafíos de código.
El desafío es bastante sencillo. Como entrada , tenemos el nombre del idioma y el recuento de bytes . Puede tomarlos como entradas de función stdin
o como método de entrada predeterminado de sus idiomas.
Como resultado , tenemos un recuento de bytes corregido , es decir, su puntaje con la desventaja aplicada. Respectivamente, la salida debe ser la salida de la función stdout
o el método de salida predeterminado de su idioma. La salida se redondeará a enteros, porque nos encantan los desempates.
Usando el más feo, cortado junto consulta ( enlace - no dude en para limpiarlo), he conseguido crear un conjunto de datos (ZIP con .xslx, .ods y .csv) que contiene una instantánea de todas las respuestas a código de golf preguntas . Puede usar el archivo (y asumir que esté disponible para su programa, por ejemplo, está en la misma carpeta) o convertir este archivo a otro formato convencional ( .xls
, .mat
, .sav
etc - pero sólo puede contener los datos originales!). El nombre debe permanecer QueryResults.ext
con ext
la extensión de elección.
Ahora para los detalles. Para cada idioma, hay una Boilerplate B
y V
parámetros de verbosidad . Juntos, se pueden usar para crear un modelo lineal del lenguaje. Sea n
el número real de bytes y c
sea la puntuación corregida. Usando un modelo simple n=Vc+B
, obtenemos la puntuación corregida:
n-B
c = ---
V
Bastante simple, ¿verdad? Ahora, para determinar V
y B
. Como es de esperar, haremos una regresión lineal, o más precisa, una regresión lineal ponderada de mínimos cuadrados. No voy a explicar los detalles sobre eso: si no está seguro de cómo hacerlo, Wikipedia es su amigo , o si tiene suerte, la documentación de su idioma.
Los datos serán los siguientes. Cada punto de datos será el recuento de bytes n
y el recuento de bytes promedio de la pregunta c
. Para dar cuenta de los votos, los puntos se ponderarán, por su número de votos más uno (para dar cuenta de 0 votos), llamemos a eso v
. Las respuestas con votos negativos deben descartarse. En términos simples, una respuesta con 1 voto debe contar lo mismo que dos respuestas con 0 votos.
Luego, estos datos se ajustan al modelo antes mencionado n=Vc+B
mediante regresión lineal ponderada.
Por ejemplo , dados los datos para un idioma dado
n1=20, c1=8.2, v1=1
n2=25, c2=10.3, v2=2
n3=15, c3=5.7, v3=5
Ahora, componemos las matrices y vectores pertinentes A
, y
y W
, con nuestros parámetros en el vector
[1 c1] [n1] [1 0 0] x=[B]
A=[1 c2] y=[n2] W=[0 2 0], [V]
[1 c3] [n3] [0 0 5]
resolvemos la ecuación matricial (con '
denotar la transposición)
A'WAx=A'Wy
para x
(y en consecuencia, obtenemos nuestro B
y V
parámetro).
Su puntaje será el resultado de su programa, cuando se le dé su propio nombre de idioma y número de bytes. Entonces, sí, ¡esta vez incluso los usuarios de Java y C ++ pueden ganar!
ADVERTENCIA: La consulta genera un conjunto de datos con muchas filas no válidas debido a que las personas usan un formato de encabezado "genial" y etiquetan sus preguntas de desafío de código como código de golf . La descarga que proporcioné ha eliminado la mayoría de los valores atípicos. NO use el CSV proporcionado con la consulta.
¡Feliz codificación!
fuente
C++ <s>6 bytes</s>
. Además, nunca hice ningún T-SQL antes de hoy y ya estoy impresionado conmigo mismo de que logré extraer el bytecount.Respuestas:
Mathematica, 244.719 (245 bytes)
Caso de prueba
¿Qué hay de otros idiomas?
Modelo alternativo :
log(c)=log((n-B)/V)
Una característica notable del golf de código (y probablemente otros problemas de codificación) es que la distribución de las longitudes de los programas tiende a ser distribución exponencial (en contraste con la distribución uniforme). Por lo tanto,
log(n)=log(Vc+B)
es mucho más probable que el modelo equilibre las influencias entre puntos con grandesc
y pequeñosc
.Como podemos ver en los gráficos a continuación, la distribución de puntos es adecuada para ajustarse en escala logarítmica.
Resultados del nuevo modelo.
Hemos encontrado dos idiomas excepcionales: Ruby with
V=0.724
y Retina withV=1.322
, y un criterio de ser un lenguaje de golf popular, que tiene una gran repetitiva negativa.fuente
csv
.Python3, 765.19 (765) bytes
Probablemente hay espacio para jugar golf aquí. Requiere numpy para cosas de matriz. Lecturas de stdin, formateadas de la siguiente manera: [lang] [bytes / n]. Se detiene cuando envía q.
Resultados
Podría haber hecho algo mal en algún momento; Obtengo resultados diferentes a los de la respuesta de Mathematica:
fuente