ระบบแต้มต่อ PPCG


35

ดังที่เราทุกคนทราบกันดีว่าเมตา กำลัง ล้นไป ด้วย ข้อร้องเรียน เกี่ยวกับการ ให้คะแนน รหัสกอล์ฟ ระหว่าง ภาษา (ใช่แต่ละคำนั้นเป็นลิงค์แยกต่างหากและสิ่งเหล่านี้อาจเป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็ง)

ด้วยความหึงหวงที่มีต่อผู้ที่ใส่ใจในการค้นหาเอกสาร Pyth จริง ๆ ฉันคิดว่ามันคงจะดีถ้ามีความท้าทายที่สร้างสรรค์ขึ้นมาอีกเล็กน้อยซึ่งเหมาะกับเว็บไซต์ที่เชี่ยวชาญเรื่องการเขียนโค้ด


ความท้าทายค่อนข้างตรงไปตรงมา ในฐานะที่เป็นอินพุตเรามีชื่อภาษาและนับไบต์ คุณสามารถใช้สิ่งเหล่านั้นเป็นฟังก์ชั่นอินพุตstdinหรือวิธีป้อนข้อมูลเริ่มต้นเป็นภาษา

ในฐานะที่เป็นเอาท์พุทเรามีการนับจำนวนไบต์ที่ถูกต้องนั่นคือคะแนนของคุณเมื่อใช้แฮนดิแคป ตามลำดับผลลัพธ์ควรเป็นฟังก์ชันเอาต์พุตstdoutหรือวิธีการแสดงผลภาษาเริ่มต้นของคุณ ผลลัพธ์จะถูกปัดเศษเป็นจำนวนเต็มเพราะเราชอบเน็คไทเกอร์

ด้วยการใช้แบบสอบถามที่น่าเกลียดที่สุดที่ถูกแฮ็กเข้าด้วยกัน ( ลิงก์ - อย่าลังเลที่จะทำความสะอาด) ฉันจัดการสร้างชุดข้อมูล (zip ด้วย. xslx, .ods และ. csv)ที่มีภาพรวมของคำตอบทั้งหมดคำถามเกี่ยวกับ . คุณสามารถใช้ไฟล์นี้ (และสมมติว่ามันจะใช้ได้กับโปรแกรมของคุณเช่นมันอยู่ในโฟลเดอร์เดียวกัน) หรือแปลงไฟล์นี้เป็นรูปแบบเดิมอีก ( .xls, .mat, .savฯลฯ - แต่มันอาจมีข้อมูลเดิม!) ชื่อควรจะยังคงอยู่QueryResults.extกับ extส่วนขยายของตัวเลือก


ตอนนี้สำหรับเฉพาะ สำหรับแต่ละภาษาจะมีพารามิเตอร์Boilerplate Bและ Verbosity Vสามารถใช้ร่วมกันเพื่อสร้างโมเดลเชิงเส้นของภาษา อนุญาตnเป็นจำนวนจริงของไบต์และcเป็นคะแนนที่ถูกต้อง ด้วยการใช้แบบจำลองอย่างง่ายn=Vc+Bเราจะได้รับคะแนนที่ถูกต้อง:

    n-B
c = ---
     V

ง่ายพอใช่ไหม ตอนนี้สำหรับการกำหนดและV Bอย่างที่คุณคาดหวังว่าเราจะทำการถดถอยเชิงเส้นหรือแม่นยำกว่าการถดถอยเชิงเส้นอย่างน้อยกำลังสอง ฉันจะไม่อธิบายรายละเอียดเกี่ยวกับสิ่งนั้น - ถ้าคุณไม่แน่ใจว่าจะทำอย่างไร, วิกิพีเดียเป็นเพื่อนของคุณหรือถ้าคุณโชคดี, เอกสารภาษาของคุณ

ข้อมูลจะเป็นดังนี้ แต่ละจุดข้อมูลจะนับไบต์nและ cbytecount การบัญชีสำหรับคะแนนโหวตจุดจะได้รับการถ่วงน้ำหนักโดยจำนวนของพวกเขาในการลงมติบวกหนึ่ง (การบัญชีสำหรับ 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 ที่มาพร้อมกับแบบสอบถาม

การเข้ารหัสที่มีความสุข!


3
s / ค้นหาเอกสาร
Pyth

ข้อความค้นหาของคุณดูเหมือนจะไม่แยกความแตกต่างระหว่าง Perl 5 และ Perl 6 ซึ่งคล้ายกับไม่แยก C ++ จาก Haskell
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills ฉันรู้ - มันทำสิ่งที่แปลก ๆ มากมายส่วนใหญ่เป็นเพราะคนบ้าคลั่งกับการจัดรูปแบบ รู้สึกอิสระที่จะปรับปรุงในเรื่องนี้ C++ <s>6 bytes</s>แต่ตอนนี้มันเป็นการออกระหว่างการขาดหมายเลขรุ่นและภาษาที่เรียกว่า นอกจากนี้ฉันไม่เคยทำ T-SQL ใด ๆ มาก่อนวันนี้และฉันก็ประทับใจในตัวเองที่ฉันสามารถแยกจำนวนไบต์ได้
Sanchises

เราสามารถลบค่าผิดปกติเช่นภาษาใด ๆ ที่มีเพียงหนึ่งรายการ (โดยปกติจะเป็นชื่อภาษาที่ไม่ถูกต้อง) หรือรายการที่มีมากกว่า 10,000 ไบต์?
Robert Fraser

@RobertFraser ฉันคิดว่ามันจะมากเกินไปสำหรับความท้าทายเดียว ฉันจะแก้ไขไฟล์ข้อมูลดูแก้ไข
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)

สิ่งหนึ่งที่น่าสังเกตของ code golf (และปัญหาการเข้ารหัสอื่น ๆ ) คือการแจกแจงความยาวของโปรแกรมมีแนวโน้มที่จะเป็นการแจกแจงแบบเลขชี้กำลัง (ตรงกันข้ามกับการแจกแจงแบบเดียวกัน) ดังนั้นรูปแบบ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

เราพบสองภาษาที่ยอดเยี่ยม - ทับทิมกับV=0.724และจอประสาทตาด้วยV=1.322และเกณฑ์ของการเป็นภาษากอล์ฟที่เป็นที่นิยม - มีแผ่นเชิงลบขนาดใหญ่


@sanchises csvดังนั้นไกลดังนั้นดียกเว้นว่าคุณใช้เครื่องหมายอัฒภาคเป็นตัวคั่นใน
njpipeorgan

นั่นคือ Microsoft Excel สำหรับคุณ ดูเหมือนจะเป็นการประหยัดเพราะ csv ยากเกินไปสำหรับมัน
Sanchises

เห็นได้ชัดว่า CJam มีความยาวเชิงลบที่คงที่ น่าสนใจ
PurkkaKoodari

@ Pietu1998 โมเดลเชิงเส้นไม่ถูกต้องฉันคิดว่า
njpipeorgan

@ Pietu1998 ไม่น่าแปลกใจนักเนื่องจากภาษาการเล่นกอล์ฟโดยทั่วไปใช้การป้อนข้อมูลโดยนัยและอาจส่งคืนผลลัพธ์โดยนัย โปรดทราบว่า "ความยาวหม้อไอน้ำ" ถูกกำหนดโดยค่าเฉลี่ยของ wrt ไม่ใช่ภาษาที่เหมาะที่สุดสำหรับต้นแบบ จริง ๆ แล้วฉันรู้สึกประหลาดใจในเชิงบวกต่อวิธีการที่ง่าย ๆ แบบจำลองนี้ดูเหมือนว่าจะทำอย่างไรเมื่อมองผลลัพธ์เหล่านี้
Sanchises

3

Python3, 765.19 (765) ไบต์

อาจมีบางห้องสำหรับเล่นกอล์ฟที่นี่ ต้องการ numpy สำหรับสิ่งที่เมทริกซ์ อ่านจาก stdin จัดรูปแบบดังนี้: [lang] [bytes / n] หยุดเมื่อคุณส่งคิว

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.