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

35

Как мы все знаем, мета будет переполнена с жалобами по поводу забив код-гольф между языками (да, каждое слово является отдельным звеном, и это может быть только верхушка айсберга).

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


Задача довольно проста. В качестве входных данных у нас есть имя языка и количество байтов . Вы можете использовать их как функции ввода stdinили как метод ввода по умолчанию для ваших языков.

В качестве результата мы имеем исправленное количество байтов , т. Е. Ваш счет с примененным гандикапом. Соответственно, вывод должен быть выводом функции stdoutили способом вывода по умолчанию для ваших языков. Выходные данные будут округлены до целых чисел, потому что мы любим прерыватели связей.

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


Теперь по конкретике. Для каждого языка есть параметры BBoilerplate и 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параметр).


Ваша оценка будет выводом вашей программы, когда вам дадут название вашего языка и bytecount. Так что да, на этот раз даже пользователи Java и C ++ могут победить!

ПРЕДУПРЕЖДЕНИЕ: Запрос создает набор данных с большим количеством недействительных строк из - за человек , использующих «прохладный» заголовок форматирования и человек мечением их вопросов , как . В предоставленной мною загрузке большинство выбросов удалено. НЕ используйте CSV, предоставленный с запросом.

Удачного кодирования!

Sanchises
источник
3
s / посмотрите документацию
Pyth
Ваш запрос, похоже, не различает Perl 5 и Perl 6. Это похоже на то, что C ++ не отличается от Haskell.
Брэд Гилберт b2gills
@ BradGilbertb2gills Я знаю - он делает много причудливых вещей, в основном из-за людей, сходящих с ума от форматирования. Не стесняйтесь улучшать его, но сейчас это компромисс между отсутствием нумерации версий и названными языками C++ <s>6 bytes</s>. Кроме того, я никогда не делал T-SQL до сегодняшнего дня, и я уже впечатлен тем, что мне удалось извлечь этот счет.
Санчиз
Можем ли мы удалить выбросы, то есть любые языки с одной записью (обычно с неправильными названиями языков) или те, которые имеют> 10 000 байтов?
Роберт Фрейзер
@RobertFraser Я думал, что это будет слишком много для одного вызова. Я исправлю файл данных, см. Редактирование.
Санчиз

Ответы:

21

Mathematica, 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)

Одна примечательная особенность Code Golf (и, возможно, других проблем кодирования) заключается в том, что распределение длин программ имеет тенденцию к экспоненциальному распределению (в отличие от равномерного распределения). Следовательно, модель с 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 with V=1.322, и критерий популярности языка игры в гольф - имеющий большой отрицательный шаблон.

njpipeorgan
источник
@sanchises Пока все хорошо, за исключением того, что вы используете точки с запятой в качестве разделителей в csv.
njpipeorgan
Это Microsoft Excel для вас. Видимо сохранение как csv слишком сложно для него.
Санчиз
Так что, очевидно, CJam имеет отрицательную стандартную длину. Интересный.
PurkkaKoodari
@ Pietu1998 Линейная модель не такая точная, как мне кажется.
njpipeorgan
@ Pietu1998 Не совсем удивительно, поскольку языки игры в гольф обычно принимают неявный ввод и могут возвращать неявный вывод. Обратите внимание, что «длина котельной пластины» определяется по среднему значению, а не по идеальному языку без шаблонов. Я на самом деле положительно удивлен тем, насколько хорошо эта простая модель, кажется, работает, глядя на эти результаты.
Санчиз
3

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

Вероятно, здесь есть место для игры в гольф. Требуется NumPy для матричных вещей. Читает из стандартного ввода, отформатированный следующим образом: [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
Yodle
источник