Hệ thống điểm chấp PPCG


35

Như chúng ta đã biết, meta đang tràn ngập những lời phàn nàn về việc ghi điểm mã golf giữa các ngôn ngữ (vâng, mỗi từ là một liên kết riêng biệt và đây có thể chỉ là phần nổi của tảng băng chìm).

Với rất nhiều sự ghen tị đối với những người thực sự bận tâm tìm kiếm tài liệu Pyth, tôi nghĩ sẽ tốt hơn nếu có thêm một chút thách thức mang tính xây dựng, phù hợp với một trang web chuyên về các thách thức về mã.


Thử thách khá đơn giản. Là đầu vào , chúng tôi có tên ngôn ngữsố byte . Bạn có thể lấy chúng làm đầu vào hàm stdinhoặc phương thức nhập mặc định ngôn ngữ của bạn.

đầu ra , chúng tôi có số byte được sửa , tức là điểm của bạn với điểm chấp được áp dụng. Tương ứng, đầu ra phải là đầu ra chức năng stdouthoặc phương thức đầu ra mặc định ngôn ngữ của bạn. Đầu ra sẽ được làm tròn thành số nguyên, bởi vì chúng tôi yêu thích tiebreakers.

Sử dụng xấu xí nhất, hack cùng nhau truy vấn ( liên kết - cảm thấy tự do để làm sạch nó lên), tôi đã cố gắng để tạo ra một bộ dữ liệu (nén với .xslx, .ods và .csv) có chứa một bản chụp của tất cả các câu trả lời cho câu hỏi . Bạn có thể sử dụng tập tin này (và cho rằng nó sẽ có sẵn để chương trình của bạn, ví dụ, đó là trong cùng một thư mục) hoặc chuyển đổi tập tin này sang một định dạng thông thường ( .xls, .mat, .savvv - nhưng nó chỉ có thể chứa dữ liệu gốc!). Tên nên được giữ lại QueryResults.extvới extphần mở rộng của sự lựa chọn.


Bây giờ cho các chi tiết cụ thể. Đối với mỗi ngôn ngữ, có một tham số Boilerplate Bvà Verbosity V. Cùng nhau, chúng có thể được sử dụng để tạo ra một mô hình tuyến tính của ngôn ngữ. Gọi nlà số byte thực tế và clà số điểm được sửa. Sử dụng một mô hình đơn giản n=Vc+B, chúng tôi nhận được số điểm đã sửa:

    n-B
c = ---
     V

Đủ đơn giản, phải không? Bây giờ, để xác định VB. Như bạn có thể mong đợi, chúng ta sẽ thực hiện một số hồi quy tuyến tính, hay chính xác hơn là hồi quy tuyến tính có trọng số bình phương nhỏ nhất. Tôi sẽ không giải thích chi tiết về điều đó - nếu bạn không chắc chắn cách thực hiện điều đó, Wikipedia là bạn của bạn hoặc nếu bạn may mắn, tài liệu ngôn ngữ của bạn.

Dữ liệu sẽ như sau. Mỗi điểm dữ liệu sẽ là số byte nvà tổng số trung bình của câu hỏi c. Để tính số phiếu bầu, số điểm sẽ được tính trọng số, bằng số phiếu bầu của họ cộng với một (để chiếm 0 phiếu), hãy gọi đó là điểm v. Câu trả lời với phiếu bầu tiêu cực nên được loại bỏ. Nói một cách đơn giản, một câu trả lời có 1 phiếu sẽ được tính giống như hai câu trả lời có 0 phiếu.

Dữ liệu này sau đó được gắn vào mô hình đã nói ở trên n=Vc+Bbằng phương pháp hồi quy tuyến tính có trọng số.


Ví dụ: đã cung cấp dữ liệu cho một ngôn ngữ nhất định

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

Bây giờ, chúng ta soạn các ma trận và vectơ có liên quan A, yW, với các tham số của chúng ta trong vectơ

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

chúng tôi giải phương trình ma trận (với 'biểu thị chuyển vị)

A'WAx=A'Wy

cho x(và do đó, chúng tôi nhận được BVtham số của chúng tôi ).


Điểm số của bạn sẽ là đầu ra của chương trình của bạn, khi được cung cấp tên ngôn ngữ của riêng bạn và bytecount. Vì vậy, có, lần này ngay cả người dùng Java và C ++ cũng có thể giành chiến thắng!

CẢNH BÁO: Truy vấn tạo ra một tập dữ liệu có nhiều hàng không hợp lệ do mọi người sử dụng định dạng tiêu đề 'mát mẻ' và mọi người gắn thẻ các câu hỏi của họ dưới dạng . Tải xuống tôi cung cấp đã loại bỏ hầu hết các ngoại lệ. KHÔNG sử dụng CSV được cung cấp cùng với truy vấn.

Chúc mừng mã hóa!


3
s / tra cứu tài liệu Pyth / nghiên cứu kỹ hai phần tài liệu Jelly hiện có
lirtosiast

Truy vấn của bạn dường như không phân biệt giữa Perl 5 và Perl 6. Điều này tương tự với việc không phân biệt C ++ với Haskell.
Brad Gilbert b2gills

@ BradGilbertb2gills Tôi biết - nó thực hiện rất nhiều điều kỳ quặc, chủ yếu là do mọi người phát điên với định dạng. Hãy thoải mái cải thiện nó, nhưng ngay bây giờ, đó là sự đánh đổi giữa việc thiếu đánh số phiên bản và ngôn ngữ được gọi C++ <s>6 bytes</s>. Ngoài ra, tôi chưa bao giờ thực hiện bất kỳ T-SQL nào trước ngày hôm nay và tôi đã rất ấn tượng với bản thân mình rằng tôi đã quản lý để trích xuất bytecount.
Sanchise 4/2/2016

Chúng tôi có thể xóa các ngoại lệ, tức là bất kỳ ngôn ngữ nào chỉ có một mục nhập (thường là tên ngôn ngữ không chính xác) hoặc các ngôn ngữ có> 10.000 byte không?
Robert Fraser

@RobertFraser Tôi nghĩ rằng sẽ là quá nhiều cho một thử thách. Tôi sẽ sửa tệp dữ liệu, xem chỉnh sửa.
Chiếm 5/2/2016

Câu trả lời:


21

Mathicala, 244.719 (245 byte)

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]

Trường hợp thử nghiệm

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

Những ngôn ngữ khác thì sao?

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) } *)

Mô hình thay thế :log(c)=log((n-B)/V)

Một đặc điểm đáng chú ý của mã golf (và có lẽ các vấn đề mã hóa khác) là phân phối độ dài của các chương trình có xu hướng phân phối theo cấp số nhân (trái ngược với phân phối đồng đều). Do đó mô hình log(n)=log(Vc+B)có nhiều khả năng cân bằng ảnh hưởng giữa các điểm với lớn cvà nhỏ c.

Như chúng ta có thể thấy trong các biểu đồ dưới đây, sự phân bố các điểm phù hợp để phù hợp với thang đo logarit.


Kết quả của mô hình mới

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

Chúng tôi đã tìm thấy hai ngôn ngữ đặc biệt - Ruby with V=0.724và Retina V=1.322, và một tiêu chí là một ngôn ngữ chơi golf phổ biến - có một bản tóm tắt âm lớn.


@sanchises Cho đến nay rất tốt, ngoại trừ việc bạn sử dụng dấu chấm phẩy làm dấu phân cách trong csv.
njpipe tổ chức

Đó là Microsoft Excel dành cho bạn. Rõ ràng tiết kiệm như csv là quá khó cho nó.
Sanchise

Vì vậy, rõ ràng CJam có chiều dài nồi hơi âm. Hấp dẫn.
PurkkaKoodari

@ Pietu1998 Mô hình tuyến tính không quá chính xác, tôi nghĩ vậy.
njpipe tổ chức

@ Pietu1998 Không hoàn toàn đáng ngạc nhiên, vì các ngôn ngữ chơi gôn thường lấy đầu vào ngầm và có thể trả về đầu ra ngầm. Lưu ý rằng "Độ dài nồi hơi" được xác định là trung bình, không phải là ngôn ngữ lý tưởng của nồi hơi. Tôi thực sự ngạc nhiên tích cực bởi mô hình đơn giản này dường như đang hoạt động tốt như thế nào khi nhìn vào những kết quả này.
Sanchises

3

Python3, 765.19 (765) byte

Có lẽ một số phòng để chơi golf ở đây. Yêu cầu numpy cho công cụ ma trận. Đọc từ stdin, được định dạng như sau: [lang] [byte / n]. Dừng khi bạn gửi 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()

Các kết quả

Tôi có thể đã làm điều gì đó sai ở một số điểm; Tôi nhận được kết quả khác với câu trả lời Mathicala:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.