Comme nous le savons tous, méta est débordait de plaintes au sujet de notation code de golf entre les langues (oui, chaque mot est un lien séparé, et ceux - ci peuvent être que la pointe de l'iceberg).
Avec tant de jalousie envers ceux qui se sont donné la peine de consulter la documentation Pyth, j'ai pensé qu'il serait bien de relever un défi un peu plus constructif, digne d'un site Web spécialisé dans les problèmes de code.
Le défi est plutôt simple. En entrée , nous avons le nom de la langue et le nombre d'octets . Vous pouvez les prendre comme entrées de fonction stdin
ou comme méthode de saisie par défaut de votre langue.
En sortie , nous avons un nombre d'octets corrigé , c'est-à-dire votre score avec le handicap appliqué. Respectivement, la sortie doit être la sortie de la fonction stdout
ou la méthode de sortie par défaut de votre langue. La sortie sera arrondie aux nombres entiers, car nous aimons les systèmes décisifs.
En utilisant le plus laid, piraté ensemble requête ( lien - ne hésitez pas à nettoyer), j'ai réussi à créer un ensemble de données (zip avec .xslx, .ods et .csv) qui contient un aperçu de toutes les réponses à code de golf des questions . Vous pouvez utiliser ce fichier (et supposons qu'il soit disponible à votre programme, par exemple, il est dans le même dossier) ou de convertir ce fichier dans un autre format classique ( .xls
, .mat
, .sav
etc - mais il ne peut contenir les données originales!). Le nom doit rester QueryResults.ext
avec ext
l'extension de choix.
Maintenant pour les détails. Pour chaque langue, il existe des paramètres Boilerplate B
et Verbosity V
. Ensemble, ils peuvent être utilisés pour créer un modèle linéaire du langage. Soit n
le nombre d'octets réel, et c
le score corrigé. En utilisant un modèle simple n=Vc+B
, nous obtenons pour le score corrigé:
n-B
c = ---
V
Assez simple, non? Maintenant, pour déterminer V
et B
. Comme vous vous en doutez, nous allons procéder à une régression linéaire, ou plus précise, une régression linéaire pondérée par les moindres carrés. Je ne vais pas expliquer les détails à ce sujet - si vous ne savez pas comment faire cela, Wikipedia est votre ami , ou si vous avez de la chance, la documentation de votre langue.
Les données seront les suivantes. Chaque point de données sera le nombre d'octets n
et le nombre moyen de la question c
. Pour comptabiliser les votes, les points seront pondérés par leur nombre de votes plus un (pour comptabiliser 0 votes), appelons cela v
. Les réponses avec des votes négatifs doivent être écartées. En termes simples, une réponse avec 1 vote doit compter autant que deux réponses avec 0 vote.
Ces données sont ensuite intégrées dans le modèle susmentionné en n=Vc+B
utilisant une régression linéaire pondérée.
Par exemple , étant donné les données pour une langue donnée
n1=20, c1=8.2, v1=1
n2=25, c2=10.3, v2=2
n3=15, c3=5.7, v3=5
Maintenant, nous composons les matrices pertinentes et des vecteurs A
, y
et W
, avec nos paramètres dans le vecteur
[1 c1] [n1] [1 0 0] x=[B]
A=[1 c2] y=[n2] W=[0 2 0], [V]
[1 c3] [n3] [0 0 5]
nous résolvons l'équation matricielle (avec '
la transposée)
A'WAx=A'Wy
pour x
(et par conséquent, nous obtenons notre B
et V
paramètre).
Votre score sera la sortie de votre programme, lorsque vous aurez votre propre nom de langue et votre propre décompte. Alors oui, cette fois, même les utilisateurs de Java et C ++ peuvent gagner!
AVERTISSEMENT: La requête génère un ensemble de données avec un grand nombre de lignes invalides en raison de personnes qui utilisent en- tête de « cool » et le formatage des gens de marquage leur code défi des questions comme le code-golf . Le téléchargement que j'ai fourni a la plupart des valeurs aberrantes supprimées. N'utilisez PAS le fichier CSV fourni avec la requête.
Bonne codage!
la source
C++ <s>6 bytes</s>
. De plus, je n'avais jamais fait de T-SQL avant aujourd'hui et je suis déjà impressionné par ma capacité d'extraire le décompte.Réponses:
Mathematica, 244.719 (245 bytes)
Cas de test
Qu'en est-il des autres langues?
Modèle alternatif :
log(c)=log((n-B)/V)
Une caractéristique notable du code de golf (et probablement d’autres problèmes de codage) est que la distribution des longueurs de programmes tend à être une distribution exponentielle (contrairement à une distribution uniforme). Par conséquent, le modèle
log(n)=log(Vc+B)
est beaucoup plus susceptible d’équilibrer les influences entre les points grandsc
et petitsc
.Comme on peut le voir dans les graphiques ci-dessous, la distribution des points convient à une adaptation à l'échelle logarithmique.
Résultats du nouveau modèle
Nous avons trouvé deux langages exceptionnels - Ruby avec
V=0.724
et Retina avecV=1.322
, et un critère pour être une langue de golf populaire - avoir un grand passe-partout négatif.la source
csv
.Python3, 765.19 (765) octets
Probablement de la place pour jouer au golf ici. Nécessite Numpy pour les trucs de la matrice. Lit à partir de stdin, formaté comme suit: [lang] [octets / n]. Arrête lorsque vous envoyez q.
Résultats
J'aurais peut-être fait quelque chose de mal à un moment donné; J'obtiens des résultats différents de ceux de la réponse de Mathematica:
la source