Система гандикапу PPCG


35

Як ми всі знаємо, мета буде переповнена з скаргами по приводу забивши код-гольф між мовами (так, кожне слово є окремою ланкою, і це може бути тільки верхівка айсберга).

Маючи стільки ревнощів до тих, хто насправді намагався шукати документацію Pyth, я подумав, що було б непогано мати трохи більше конструктивного виклику, що відповідає веб-сайту, який спеціалізується на проблемах з кодом.


Виклик досить простий. В якості введення ми маємо ім’я мови та кількість байтів . Ви можете приймати їх як вхідні функції stdinабо метод введення мов за замовчуванням.

Як вихід , у нас є скореговане число байтів , тобто ваш рахунок із застосованим гандикапом. Відповідно, вихід повинен бути результатом функції stdoutабо методом виводу за замовчуванням для ваших мов. Вихід буде округлений до цілих чисел, тому що ми любимо краватки.

Використовуючи найпотворніший, зламаний разом запиту ( посилання - НЕ соромтеся , щоб очистити його вгору), я зумів створити набір даних (ZIP з .xslx, ODS і CSV) , який містить знімок всіх відповідей на питання . Ви можете використовувати цей файл (і припустити, що він доступний вашій програмі, наприклад, він знаходиться в одній папці) або перетворити цей файл в інший звичайний формат ( .xls, .matі .savт. Д. - але він може містити лише вихідні дані!). Назва має залишатися QueryResults.extз extрозширенням за вибором.


Тепер про специфіку. Для кожної мови є параметри котла Bта Verbosity V. Разом їх можна використовувати для створення лінійної моделі мови. Нехай nбуде фактична кількість байтів і cбуде скорегована оцінка. Використовуючи просту модель n=Vc+B, ми отримуємо для виправленої оцінки:

    n-B
c = ---
     V

Досить просто, правда? Тепер для визначення Vі B. Як ви могли очікувати, ми збираємось зробити лінійну регресію або, точніше, лінійну регресію, зважену на найменші квадрати. Я не збираюся пояснювати деталі цього питання - якщо ви не впевнені, як це зробити, Вікіпедія - ваш друг , або якщо вам пощастило, документація вашої мови.

Дані будуть наступними. Кожна точка даних буде числом байтів nі середньою кількістю запитань c. Для обліку голосів бали будуть зважені, за їх кількістю голосів плюс один (для врахування 0 голосів), назвемо це v. Відповіді з негативними голосами слід відкинути. Простіше кажучи, відповідь з 1 голосом повинна рахувати так само, як дві відповіді з 0 голосами.

Потім ці дані встановлюються у вищезгадану модель n=Vc+Bза допомогою зваженої лінійної регресії.


Наприклад , з урахуванням даних для даної мови

n1=20, c1=8.2, v1=1
n2=25, c2=10.3, v2=2
n3=15, c3=5.7, v3=5

Тепер ми складаємо відповідні матриці та вектори A, yі Wз нашими параметрами у векторі

  [1 c1]    [n1]    [1 0 0]  x=[B]
A=[1 c2]  y=[n2]  W=[0 2 0],   [V]
  [1 c3]    [n3]    [0 0 5]

ми вирішуємо матричне рівняння (із 'позначенням транспозиції)

A'WAx=A'Wy

для x(і, отже, ми отримуємо наш Bі Vпараметр).


Ваш результат буде результатом вашої програми, якщо вкажете свою власну назву мови та кількість рахунків. Так так, цього разу навіть користувачі Java та C ++ можуть виграти!

ПОПЕРЕДЖЕННЯ: Запит генерує набір даних з безліччю недійсних рядків через те, що люди використовують "круте" форматування заголовків і люди, що позначають свої проблеми з як . Забезпечене мною завантаження видалило більшість людей, що втратили огляд. НЕ використовуйте CSV, наданий із запитом.

Щасливого кодування!


3
s / шукати документацію Pyth / уважно вивчити два існуючі фрагменти документації Jelly
lirtosiast

Здається, ваш запит не відрізняє Perl 5 від Perl 6. Що схоже на те, що не відрізняти C ++ від Haskell.
Бред Гілберт b2gills

@ BradGilbertb2gills Я знаю - це дуже багато химерних речей, здебільшого через те, що люди сходять з розуму від форматування. Не соромтеся вдосконалюватись, але зараз це компроміс між відсутністю нумерації версій та названими мовами C++ <s>6 bytes</s>. Крім того, я ніколи не робив жодного T-SQL до сьогоднішнього дня, і я вже вражений собою, що мені вдалося витягнути рахунок.
Санчіз

Чи можемо ми видалити інші люди, тобто будь-які мови, які мають лише один запис (як правило, неправильні назви мови), або ті, які містять> 10 000 байт?
Роберт Фрейзер

@RobertFraser Я подумав, що це буде занадто багато для одного виклику. Я виправлю файл даних, див. Редагування.
Санчіз

Відповіді:


21

Математика, 244.719 (245 байт)

f[l_,n_]:=x/.Solve[d=Rest@Import@"QueryResults.csv";LinearModelFit[#.#2/Tr@#&@@{#~Max~-1&/@#4+1,#3}&@@Thread@#&/@{#,#~Cases~{_,l,__}}&/@d~GroupBy~Last/@#[[;;,1,5]],x,x,Weights->Tr/@#[[;;,;;,4]]]&[d~Cases~{_,l,_,v_/;v>=0,_}~GatherBy~Last]@x==n,x]

Тестовий випадок

f["mathematica", n]   (* { .820033 (n + 53.4263) } *)
f["mathematica", 245] (* { 244.719 } *)

Що з іншими мовами?

f["c++", n]           (* { .821181 (n - 79.5437) } *)
f["java", n]          (* { .717579 (n - 56.0858) } *)
f["cjam", n]          (* { 2.21357 (n + 2.73772) } *)
f["pyth", n]          (* { 4.52194 (n - 8.82806) } *)

Альтернативна модель :log(c)=log((n-B)/V)

Однією помітною особливістю кодового гольфу (і, мабуть, інших проблем кодування) є те, що розподіл довжин програм має тенденцію до експоненціального розподілу (на відміну від рівномірного розподілу). Отже, модель log(n)=log(Vc+B)набагато більше шансів збалансувати вплив між великими cта малими точками c.

Як ми бачимо на графіках нижче, розподіл точок підходить для розміщення в логарифмічному масштабі.


Результати нової моделі

Language       V       B

Python       1.365   -19.4    
Javascript   1.002     1.6
Ruby         0.724     1.7
Perl         1.177   -32.7
C            1.105     1.5
Haskell      1.454   -24.5
Mathematica  1.319   -39.7
PHP          1.799   -62.0
Java         1.642     4.4
C#           1.407     4.5

CJam         0.608   -12.5
Pyth         0.519   -11.4
Golfscript   0.766   -18.0
J            0.863   -21.4
APL          0.744   -17.7
K            0.933   -23.3
Retina       1.322   -37.9
MATL         0.762   -13.3
Jelly        0.965   -23.8

Ми знайшли дві виняткові мови - Ruby with V=0.724та Retina V=1.322, а також критерій популярності мови для гри в гольф - маючи велику негативну табличку.


@sanchises Наразі це добре, за винятком того, що ви використовуєте крапки з комою як роздільники csv.
njpipeorgan

Це для вас Microsoft Excel. Мабуть, економити як csv це занадто важко для цього.
Санчіз

Таким чином, очевидно, CJam має від'ємну довжину котла. Цікаво.
PurkkaKoodari

@ Pietu1998 Лінійна модель не така точна, я думаю.
njpipeorgan

@ Pietu1998 Не зовсім дивно, оскільки мови для гольфу зазвичай беруть неявний вклад і можуть повернути неявний вихід. Зауважте, що "Довжина котла" визначається як середня, а не ідеальна мова без котлів. Я насправді позитивно здивований тим, наскільки добре виглядає ця проста модель, оглядаючи ці результати.
Санчіз

3

Python3, 765,19 (765) байт

Напевно, тут є щось місце для гри в гольф. Для матричного матеріалу потрібен numpy. Читає з stdin, форматується так: [lang] [bytes / n]. Зупиняється, коли ви надсилаєте q.

import numpy as n,csv
L={};Q={};X={};D=n.dot;f=open('QueryResults.csv',encoding="utf8");R=csv.reader(f);f.readline();Z=list.append;M=n.matrix
for r in R:
 if r[1] not in L:L[r[1]]=[]
 if r[4] not in Q:Q[r[4]]=[]
 Z(L[r[1]],r);Z(Q[r[4]],r)
for l in L:
 b=[];a=[];v=[];t=[]
 for r in L[l]:
  if int(r[3])>-1:
   Z(b,int(r[2]));o=[]
   for q in Q[r[4]]:Z(o,int(q[2]))
   Z(a,sum(o)/len(o));Z(v,int(r[3])+1)
 for k in a:Z(t,[1,k])
 if len(t)<1:continue
 A=M(t);T=A.transpose();W=n.diag(v);y=M(b).reshape((len(b),1));e=D(D(T,W),A)
 if n.linalg.det(e)==0:continue
 i=n.linalg.inv(e);X[l]=D(i,D(D(T,W),y))
p=input()
while(p!="q"):
 S=p.split()
 if S[1]=='n':print("(n-("+str(X[S[0]].item(0))+"))/"+str(X[S[0]].item(1)))
 else:print(str((int(S[1])-X[S[0]].item(0))/X[S[0]].item(1)))
 p=input()

Результати

Я, можливо, в якийсь момент зробив щось не так; Я отримую інші результати, ніж відповідь Mathematica:

python3 808 -> 765.19
python3 n   -> (n-(32.41))/1.01

c++ n        -> (n-(71.86))/1.17
cjam n       -> (n-(-14.09))/0.51
java n       -> (n-(18.08))/1.64
pyth n       -> (n-(1.42))/0.28
jelly n      -> (n-(-4.88))/0.34
golfscript n -> (n-(-0.31))/0.44
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.