PPCG让分系统


35

我们都知道, 满溢 投诉 进球 代码高尔夫 之间的 语言(是的,每个字是一个单独的链接,而这些可能是冰山的一角)。

由于对那些真正烦恼查找Pyth文档的人感到非常嫉妒,所以我认为有更多的建设性挑战会很不错,因为它适合于专门从事代码挑战的网站。


挑战非常简单。作为输入,我们具有语言名称字节数。您可以将它们用作函数输入,也可以将它们用作stdin语言的默认输入法。

作为输出,我们有一个更正的字节数,即您的残障分数。输出分别应为函数输出stdout或您的语言默认输出方法。输出将四舍五入为整数,因为我们喜欢决胜局。

使用最丑陋,骇人听闻的查询(链接,随时可以清理它),我设法创建了一个数据集(包含.xslx,.ods和.csv的zip),其中包含有关问题的所有答案的快照。您可以使用此文件(并假设它是提供给你的程序,例如,它是在同一文件夹),或将此文件转换为另一种格式的常规(,,等等-但它可能只包含原始数据!)。名称应保持与 选择的扩展。.xls.mat.savQueryResults.extext


现在为具体。对于每种语言,都有一个样板B和详细度V参数。它们可以一起用于创建语言的线性模型。我们n是字节的实际数量,并且c是修正得分。使用一个简单的模型n=Vc+B,我们得到校正后的分数:

    n-B
c = ---
     V

很简单吧?现在,确定VB。如您所料,我们将进行线性回归或更精确的最小二乘加权线性回归。我不打算对此进行详细说明-如果您不确定如何做到这一点,则Wikipedia是您的朋友,或者,如果您幸运,可以使用您语言的文档。

数据如下。每个数据点将是字节数n和问题的平均字节数c。为了计票,将对这些点加权,即按其票数加一(以计为0票)来称呼v。否决的答案应该被丢弃。简单来说,1票的答案应与2票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

现在,我们撰写相关矩阵和向量AyW与我们在向量参数

  [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

for x(因此,我们得到了Band V参数)。


当给定自己的语言名称和字节数时,您的分数将是程序的输出。所以是的,这一次甚至Java和C ++用户也可以赢!

警告:由于人们使用“很酷”的标题格式并将人们将其问题标记为“ 因此该查询生成的数据集包含许多无效行。我提供的下载已删除了大多数异常值。请勿使用查询随附的CSV。

编码愉快!


3
s /查找Pyth文档/仔细研究Jelly文档的两个现有部分
lirtosiast

您的查询似乎无法区分Perl 5和Perl6。这类似于不区分C ++和Haskell。
布拉德·吉尔伯特b2gills '16

我知道@ BradGilbertb2gills-它做很多奇怪的事情,主要是由于人们对格式的痴迷。随时进行改进,但是现在,这是在缺乏版本号和称为的语言之间进行的权衡C++ <s>6 bytes</s>。此外,我在今天之前从未做过任何T-SQL,并且我对自己能够提取字节数印象深刻。
桑契斯'16

我们是否可以删除离群值,即只有一个条目的任何语言(通常是不正确的语言名称)或具有大于10,000个字节的语言?
罗伯特·弗雷泽

@RobertFraser我认为对于一个挑战来说这太过分了。我将修复数据文件,请参见编辑。
桑契斯,2016年

Answers:


21

Mathematica,247.419(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)是更大的可能大到平衡点之间的影响cc

如下图所示,点的分布适合于对数刻度。


新模型的结果

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 V=0.724和Retina with V=1.322,以及成为流行的高尔夫语言的标准-具有很大的负面意义。


@sanchises到目前为止一切都很好,只不过您在中使用了分号作为分隔符csv
njpipeorgan

那是您的Microsoft Excel。显然,将其保存为csv太难了。
桑契斯,2016年

因此,显然CJam具有负的样板长度。有趣。
PurkkaKoodari'2

我认为@ Pietu1998线性模型不是那么准确。
njpipeorgan

@ Pietu1998并不奇怪,因为高尔夫语言通常接受隐式输入,并且可能返回隐式输出。注意,“样板长度”是用平均值定义的,而不是理想的无样板语言。当浏览这些结果时,这个简单的模型看起来做得多么好,我对此感到非常惊讶。
桑契斯,2016年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.