PPCGハンディキャップシステム


35

誰もが知っているように、meta 言語間のコードゴルフのスコアリングに関する苦情あふれ てい ます(はい、各単語は別々のリンクであり、これらは氷山の一角にすぎないかもしれません)。

実際にPythのドキュメントを調べることに煩わされた人たちに非常にWithしているので、コードチャレンジに特化したWebサイトにふさわしい、建設的なチャレンジをもう少し行うのは良いことだと思いました。


課題はかなり簡単です。入力として、言語名バイト数があります。これらを関数の入力、stdinまたは言語のデフォルトの入力方法として使用できます。

出力として、修正されたバイト数、つまりハンディキャップが適用されたスコアがあります。それぞれ、出力は関数出力、stdoutまたは言語のデフォルトの出力方法である必要があります。タイブレーカーが大好きなので、出力は整数に丸められます。

最もい、ハッキングされたクエリ(リンク -自由にクリーンアップできますを使用して、質問に対するすべての回答のスナップショットを含むデータセット(.xslx、.ods、.csvを含むzip)を作成しました。。あなたはこのファイルを使用する(そして、それはあなたのプログラムに利用可能であることを前提とし、例えば、それは同じフォルダ内にあります)、または別の従来の形式にこのファイルを変換することができます(、、など-それだけで、元のデータが含まれていてもよいです!)。名前には、選択した拡張子を付けたままにし てください。.xls.mat.savQueryResults.extext


次に詳細を説明します。言語ごとに、Boilerplate BおよびVerbosity Vパラメーターがあります。これらを一緒に使用して、言語の線形モデルを作成できます。ましょうn実際のバイト数でありc、修正されたスコアです。単純なモデルを使用しn=Vc+Bて、修正されたスコアを取得します。

    n-B
c = ---
     V

簡単ですよね?さて、決定するためVB。ご想像のとおり、線形回帰、またはより正確には最小二乗加重線形回帰を行います。詳細については説明しません。方法がわからない場合ウィキペディアがあなたの友人であるか、運がよければあなたの言語のドキュメントです。

データは次のようになります。各データポイントは、バイト数nと質問の平均バイト数になりcます。票を計上するために、ポイントは票の数に1を加えたもの(0票を計上するため)で重み付けされますv。反対票のある回答は破棄する必要があります。簡単に言えば、1票の回答は0票の2回答と同じように数えられます。

次に、このデータは、n=Vc+B加重線形回帰を使用して前述のモデルに適合します。


たとえば、特定の言語のデータが与えられた場合

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

ここで、関連する行列とベクトルAyおよび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(その結果、我々は我々の取得BVパラメータ)。


あなたのスコアは、自分自身の言語名と:バイトが与えられたときに、あなたのプログラムの出力となります。そう、今度はJavaとC ++のユーザーでさえ勝つことができます!

警告:クエリは、 'cool'ヘッダーの書式設定を使用し、質問をとしてタグ付けするため、多くの無効な行を持つデータセットを生成します。私が提供したダウンロードでは、外れ値のほとんどが削除されています。クエリで提供されるCSVを使用しないでください。

ハッピーコーディング!


3
s / Pythドキュメントを調べる/ 既存の2つ部分を注意深く調べるゼリーのドキュメントの
lirtosiast

クエリはPerl 5とPerl 6を区別していないようです。これは、C ++とHaskellを区別しないことに似ています。
ブラッドギルバートb2gills 16

@ BradGilbertb2gills-私は知っています-それは主にフォーマットに夢中になる人々のために、風変わりなことをたくさんします。自由に改善できますが、現時点では、バージョン番号の欠如と呼ばれる言語とのトレードオフC++ <s>6 bytes</s>です。その上、今日までT-SQLを実行したことがなく、バイトカウントを抽出できたことにすでに感心しています。
-Sanchises

外れ値、つまりエントリが1つだけの言語(通常は誤った言語名)または10,000バイトを超える言語を削除できますか?
ロバートフレイザー

@RobertFraser 1回の挑戦ではそれは多すぎると思いました。データファイルを修正します。編集をご覧ください。
-Sanchises

回答:


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)

コードゴルフ(およびおそらく他のコーディングの問題)の注目すべき特徴の1つは、プログラムの長さの分布が指数分布(均一な分布とは対照的)になる傾向があることです。したがって、モデル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という2つの例外的な言語とV=1.322、人気のあるゴルフ言語であるという基準があり、大きなネガティブな定型文があります。


@sanchisesこれまでのところ、セミコロンを区切り文字として使用することを除いて、これまでのところ非常に優れていますcsv
-njpipeorgan

それがMicrosoft Excelです。どうやらcsvとして保存するのは難しすぎるようです。
-Sanchises

したがって、CJamの定型的な長さは負になります。面白い。
-PurkkaKoodari

@ Pietu1998線形モデルはそれほど正確ではないと思います。
-njpipeorgan

@ Pietu1998ゴルフ言語は一般に暗黙的な入力を受け取り、暗黙的な出力を返すことがあるため、まったく驚くことではありません。「定型文の長さ」は、理想的な定型文のない言語ではなく、平均で定義されていることに注意してください。これらの結果を見たときに、この単純なモデルがどの程度うまく機能しているように見えるか、実際に私は前向きに驚いています。
-Sanchises

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.