PPCG Handikap Sistemi


35

Hepimizin bildiği gibi, meta olduğu taşan ile şikayetler hakkında puanlama kod golf arasındaki dil (evet, her bir kelimenin ayrı link ve bu sadece buzdağının görünen kısmı olabilir).

Pyth belgesine bakmayı gerçekten rahatsız edenlere karşı çok kıskançlık duyduğumda, biraz daha yapıcı bir zorluğa sahip olmak, kodlama konusunda uzmanlaşmış bir web sitesine uymanın daha iyi olacağını düşündüm.


Buradaki zorluk oldukça basit. Gibi girdi , sahip olduğumuz dil adını ve bayt sayısını . Bunları işlev girişi stdinveya dillerin varsayılan giriş yöntemi olarak alabilirsiniz.

Olarak çıktı , bir var düzeltilmiş bayt sayısını yani, özürlü puanınız uyguladı. Sırasıyla, çıktı, işlev çıktısı stdoutveya dillerin varsayılan çıktı yöntemi olmalıdır. Çıktı tamsayılara yuvarlanacak, çünkü biz tiebreakerları seviyoruz.

En çirkin, bir araya hacklenen sorguyu kullanarak ( bağlantıyı temizlemekten çekinmeyin), sorularına verilen tüm yanıtların anlık görüntüsünü içeren bir veri kümesi (.xslx, .ods ve .csv ile zip) oluşturmayı başardım . Bu dosyayı kullanın (ve programınıza kullanılabilir olması varsayalım, örneğin, aynı klasörde bulunuyor) veya başka geleneksel formata bu dosyayı dönüştürebilirsiniz ( , , vs - ama sadece orijinal veriler içerebilir!). İsim , seçimin uzatılması ile kalmalıdır ..xls.mat.savQueryResults.extext


Şimdi özellikler için. Her dil için, bir Boilerplate Bve Verbosity Vparametreleri var. Birlikte dilin doğrusal bir modelini oluşturmak için kullanılabilirler. nGerçek bayt sayısı olsun cve düzeltilmiş skor olsun. Basit bir model kullanarak n=Vc+Bdüzeltilmiş puanları alıyoruz:

    n-B
c = ---
     V

Yeterince basit, değil mi? Şimdi Vve belirlemek için B. Bekleyebileceğiniz gibi, en küçük kareler ağırlıklı doğrusal regresyondan bazı lineer regresyonlar veya daha kesin olarak yapacağız. Bununla ilgili detayları açıklamayacağım - bunu nasıl yapacağınızdan emin değilseniz, Wikipedia arkadaşınız veya şanslıysanız, dilinizin belgelerine.

Veriler aşağıdaki gibi olacaktır. Her veri noktası, bayt sayısı nve sorunun ortalama bayt sayısı olacaktır c. Oyları hesaba katmak için, puanlar ağırlıklı olarak oy sayıları artı bir (0 oy için hesaba katılır) olarak adlandırılır v. Olumsuz oy kullanan cevaplar atılmalıdır. Basit bir ifadeyle, 1 oy verilmiş bir cevap 0 oy vermiş iki cevapla aynı sayılmalıdır.

Bu veriler daha sonra, yukarıda belirtilen modele n=Vc+B, ağırlıklı doğrusal regresyon kullanılarak yerleştirilir.


Örneğin , belirli bir dilin verilerini verir.

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

Şimdi, ilgili matrisler ve vektörler oluşturmak A, yve Wvektör bizim parametreleri ile,

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

matris denklemini çözeriz ( 'transpozisyonu belirtir)

A'WAx=A'Wy

için x(ve dolayısıyla, bizim olsun Bve Vparametre).


Sizin puanı kendi dil adını ve ByteCount verildiğinde programınızın, çıktısı olacaktır. Yani evet, bu sefer bile Java ve C ++ kullanıcıları kazanabilir!

UYARI: Sorgu nedeniyle etiketleme biçimlendirme 'serin' başlığını kullanan kişi ve kişilere geçersiz satırların bir sürü veri kümesi üretir gibi sorular . Sağladığım indirme, aykırı olanların çoğunu kaldırdı. Sorgu ile birlikte verilen CSV'yi KULLANMAYIN.

Mutlu kodlama!


3
Pyth belgelerine bakın / mevcut iki Jelly belgesinin parçalarını dikkatlice
inceleyin

Sorgunuz Perl 5 ile Perl 6 arasında ayrım yapmıyor gibi görünüyor. Bu, C ++ 'ı Haskell'den ayırt etmemeye benzer.
Brad Gilbert, 21.04'de

@ BradGilbertb2gills Biliyorum - çoğunlukla biçimlendirme konusunda çıldırmış insanlar yüzünden çok ilginç şeyler yapıyor. Bunu geliştirmek için çekinmeyin, ama şu anda, sürüm numaralandırması eksikliği ile aranan diller arasında bir denge C++ <s>6 bytes</s>. Ayrıca, daha önce hiç T-SQL yapmadım ve bayt sayısını çıkarmayı başardığım için kendimden çok etkilendim.
Sanchises,

Aykırı olanları, yani yalnızca bir girişi olan herhangi bir dili (genellikle yanlış dil adları) veya> 10.000 bayt olanları kaldırabilir miyiz?
Robert Fraser,

@RobertFraser Tek bir meydan okuma için çok fazla olacağını düşündüm. Veri dosyasını düzelteceğim, düzenlemeye bakın.
Sanchises,

Yanıtlar:


21

Mathematica, 244.719 (245 bayt)

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]

Test durumu

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

Peki ya diğer diller?

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

Alternatif model :log(c)=log((n-B)/V)

Kod golfünün (ve muhtemelen diğer kodlama problemlerinin) kayda değer bir özelliği, program uzunluklarının dağılımının üssel dağılım (eğilim dağılımının aksine) olmasıdır. Bu nedenle model log(n)=log(Vc+B), büyük cve küçük noktalar arasındaki etkileri dengelemek için çok daha olasıdır c.

Aşağıdaki grafiklerde görebileceğimiz gibi, noktaların dağılımı logaritmik ölçekte uydurma için uygundur.


Yeni modelin sonuçları

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

İki istisnai dil bulduk: Ruby with V=0.724ve Retina with V=1.322, ve popüler bir golf dili olma ölçütü - büyük bir negatif kaynağa sahip.


@sanchises Şu ana kadar iyi, sınırlayıcı olarak noktalı virgül kullanmanız dışında csv.
njpipeorgan

Bu sizin için Microsoft Excel. Görünüşe göre csv olarak kaydetme çok zor.
Sanchises

Öyleyse görünüşe göre CJam negatif bir boyler uzunluğuna sahip. İlginç.
PurkkaKoodari

@ Pietu1998 Lineer model o kadar doğru değil bence.
njpipeorgan

@ Pietu1998 Golf dilleri genellikle örtük girdiler aldıklarından ve örtük çıktılar getirebildiklerinden, hiç şaşırtıcı değil. "Boyler boyunun", ideal boyler diliyle değil, ortalama ile tanımlandığını unutmayın. Aslında bu basit modelin bu sonuçlara göz atarken ne kadar iyi göründüğüne şaşırdım.
Sanchises

3

Python3, 765,19 (765) bayt

Muhtemelen burada golf oynamak için biraz yer var. Matris şeyler için numpy gerektirir. Aşağıdaki gibi biçimlendirilmiş stdin'den okur: [lang] [bytes / n]. Q gönderdiğinizde durur.

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()

Sonuçlar

Bir noktada yanlış bir şey yapmış olabilirim; Mathematica'nın cevabından farklı sonuçlar alıyorum:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.