पीपीसीजी हैंडीकैप सिस्टम


35

जैसा कि हम सभी जानते हैं, मेटा है बह निकला से शिकायतों के बारे में स्कोरिंग कोड गोल्फ के बीच भाषाओं (हाँ, प्रत्येक शब्द एक अलग लिंक है, और इन बस एक शुरूआत हो सकता है)।

उन लोगों के प्रति बहुत ईर्ष्या के साथ, जो वास्तव में पाइथ डॉक्यूमेंटेशन को देखने के लिए परेशान थे, मैंने सोचा कि एक रचनात्मक चुनौती से थोड़ा अधिक अच्छा होगा, एक वेबसाइट के लिए जो कोड चुनौतियों में माहिर है।


चुनौती सीधी-सादी है। इनपुट के रूप में , हमारे पास भाषा का नाम और बाइट काउंट है । आप उन्हें फंक्शन इनपुट्स के रूप में ले सकते हैं, stdinया आपकी भाषाएं डिफॉल्ट इनपुट मेथड।

आउटपुट के रूप में , हमारे पास एक सही बाइट काउंट है , अर्थात, आपके द्वारा लगाए गए हैंडीकैप के साथ स्कोर। क्रमशः, आउटपुट फ़ंक्शन आउटपुट stdoutया आपकी भाषा डिफ़ॉल्ट आउटपुट विधि होनी चाहिए । आउटपुट पूर्णांकों तक पहुंच जाएगा, क्योंकि हम टाईब्रेकर से प्यार करते हैं।

सबसे बदसूरत, एक साथ हैक किए गए क्वेरी का उपयोग करना ( लिंक - इसे साफ करने के लिए स्वतंत्र महसूस करें), मैंने एक डेटासेट (ज़िप .xslx, .ods और .csv के साथ ज़िप ) बनाने में कामयाबी हासिल की है, जिसमें सवालों के सभी उत्तरों का एक स्नैपशॉट है। । आप इस फ़ाइल का उपयोग कर सकते हैं (और यह अपने कार्यक्रम के लिए उपलब्ध होने की मान, जैसे, यह एक ही फ़ोल्डर में है) या किसी अन्य पारंपरिक प्रारूप करने के लिए इस फ़ाइल को परिवर्तित ( , , आदि - लेकिन यह केवल मूल डेटा हो सकता है!)। नाम पसंद के विस्तार के साथ रहना चाहिए ।.xls.mat.savQueryResults.extext


अब बारीकियों के लिए। प्रत्येक भाषा के लिए, एक बॉयलरप्लेट Bऔर वर्बोसिटी 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पैरामीटर)।


जब आपका खुद का भाषा नाम और बायटेकाउंट दिया जाता है, तो आपका स्कोर आपके प्रोग्राम का आउटपुट होगा। तो हाँ, इस बार भी जावा और सी ++ उपयोगकर्ता जीत सकते हैं!

चेतावनी: क्वेरी 'कूल' हेडर फ़ॉर्मेटिंग का उपयोग करने वाले लोगों और के रूप में अपने प्रश्नों को टैग करने वाले लोगों के कारण बहुत सी अमान्य पंक्तियों के साथ एक डेटासेट बनाती है । मेरे द्वारा प्रदान किए गए डाउनलोड में अधिकांश आउटलेर्स हटा दिए गए हैं। क्वेरी के साथ दिए गए CSV का उपयोग न करें।

हैप्पी कोडिंग!


3
Pyth प्रलेखन को देखें / जेली प्रलेखन के दो मौजूदा टुकड़ों का ध्यानपूर्वक अध्ययन करें
lirtosiast

आपकी क्वेरी पर्ल 5 और पर्ल 6 के बीच अंतर नहीं करती है। जो हास्केल से सी ++ को अलग नहीं करने के समान है।
ब्रैड गिल्बर्ट

@ ब्रैडगिल्बर्ब २गिल्स मुझे पता है - यह बहुत सारी विचित्र चीजें करता है, ज्यादातर लोगों को फॉर्मेटिंग के साथ पागल होने के कारण होता है। इस पर सुधार करने के लिए स्वतंत्र महसूस करें, लेकिन अभी, यह संस्करण नंबरिंग और भाषाओं की कमी के बीच एक व्यापार-बंद है C++ <s>6 bytes</s>। इसके अलावा, मैंने आज से पहले कभी कोई टी-एसक्यूएल नहीं किया और मैं पहले से ही खुद से प्रभावित हूं कि मैं बायटेकाउंट निकालने में कामयाब रहा।
Sanchises

क्या हम केवल एक प्रविष्टि (आमतौर पर गलत भाषा के नाम) या जिनके पास १०,००० बाइट्स हैं, के साथ आउटलेयर को हटा सकते हैं?
रॉबर्ट फ्रेजर

@RobertFraser मैंने सोचा था कि एक चुनौती के लिए बहुत अधिक होगा। मैं डेटा फ़ाइल को ठीक करूँगा, संपादन देखें।
Sanchises

जवाबों:


21

गणितज्ञ, 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)

कोड गोल्फ (और शायद अन्य कोडिंग समस्याओं) की एक उल्लेखनीय विशेषता यह है कि कार्यक्रमों की लंबाई का वितरण घातीय वितरण (समान वितरण के विपरीत) होता है। इसलिए मॉडल 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

हमने दो असाधारण भाषा पाई है - रूबी के साथ V=0.724और रेटिना के साथ V=1.322, और एक लोकप्रिय गोल्फ भाषा होने का एक मानदंड है - एक बड़ी नकारात्मक बॉयलरप्लेट।


@sanchises अब तक बहुत अच्छा है, सिवाय इसके कि आप सीमोलोन को सीमांकक के रूप में उपयोग करते हैं csv
njpipeorgan

वह आपके लिए Microsoft Excel है। जाहिरा तौर पर सीएसवी के रूप में बचत इसके लिए बहुत मुश्किल है।
Sanchises

तो जाहिर सी बात है कि सीजेएम में एक नकारात्मक बॉयलरप्लेट की लंबाई है। दिलचस्प।
PurkkaKoodari

@ Pietu1998 रैखिक मॉडल इतना सटीक नहीं है, मुझे लगता है।
njpipeorgan

@ Pietu1998 पूरी तरह से आश्चर्य की बात नहीं है, क्योंकि गोल्फिंग भाषा आम तौर पर निहित इनपुट लेती है और अंतर्निहित आउटपुट वापस कर सकती है। ध्यान दें कि "बॉयलरप्लेट की लंबाई" औसत बीटी को परिभाषित किया जाता है, न कि एक आदर्श बॉयलरप्लेटलेस भाषा को लिखे। मैं वास्तव में सकारात्मक रूप से आश्चर्यचकित हूं कि इन परिणामों को देखते हुए यह सरल मॉडल कितना अच्छा लगता है।
14

3

पायथन 3, 765.19 (765) बाइट्स

शायद यहाँ गोल्फ के लिए कुछ जगह है। मैट्रिक्स सामान के लिए सुन्न की आवश्यकता है। स्टड से पढ़ता है, निम्नानुसार स्वरूपित होता है: [लैंग] [बाइट्स / एन]। जब आप 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()

परिणाम

मैंने किसी समय कुछ गलत किया होगा; मुझे गणित के उत्तर से अलग परिणाम मिलते हैं:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.