PPCG 핸디캡 시스템


35

우리 모두 알다시피, 메타가 되어 넘쳐 불만 에 대한 득점 코드 골프를 사이에 언어 (예, 각 단어는 별도의 링크입니다, 이들은 빙산의 일각 일 수 있음).

실제로 Pyth 문서를 찾는 데 귀찮은 사람들에게 너무 질투심이 많았으므로 코드 과제를 전문으로하는 웹 사이트에 적합한 건설적인 도전을 조금 더하는 것이 좋을 것이라고 생각했습니다.


도전은 다소 간단합니다. 으로 입력 , 우리는이 언어의 이름바이트 수를 . 함수 입력 stdin또는 언어 기본 입력 방법으로 사용할 수 있습니다.

으로 출력 , 우리는이 수정 된 바이트 수 즉, 핸디캡과의 점수는 적용했다. 각각 출력은 함수 출력 stdout이거나 언어 기본 출력 방법 이어야합니다 . 타이 브레이커를 좋아하기 때문에 출력은 정수로 반올림됩니다.

가장 추악하고 해킹 된 쿼리 ( 링크 -자유롭게 정리하십시오)를 사용 하여 질문에 대한 모든 답변 의 스냅 샷이 포함 된 데이터 세트 (.xslx, .ods 및 .csv로 압축) 를 만들었습니다. . 이 파일을 사용하는 (그리고 프로그램에 사용할 수 있도록 가정, 예를 들어,이 같은 폴더에있어) 또는 종래의 다른 형식으로이 파일을 변환 할 수 있습니다 ( , , 등 -하지만 그것은 단지 원래의 데이터를 포함 할 수있다!). 이름은 남아 있어야 로 선택의 확장..xls.mat.savQueryResults.extext


이제 구체적인 내용입니다. 각 언어마다 보일러 플레이트 B및 상세 정보 V매개 변수가 있습니다. 함께 사용하면 언어의 선형 모델을 만들 수 있습니다. 하자 n실제 바이트 수, 그리고 c수정 된 점수합니다. 간단한 모델을 사용 n=Vc+B하면 정확한 점수를 얻습니다.

    n-B
c = ---
     V

충분히 간단 하죠? 이제에 대한 결정 VB. 예상 한대로 선형 회귀 또는 최소 제곱 가중치 선형 회귀 분석을 수행합니다. 자세한 내용은 설명하지 않겠습니다. 어떻게해야할지 잘 모르겠다면 Wikipedia가 친구 이거나 운이 좋으면 언어 문서입니다.

데이터는 다음과 같습니다. 각 데이터 포인트는 바이트 수 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

이제, 우리는 관련 행렬과 벡터를 구성 A, yW벡터에서 우리의 매개 변수,

  [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매개 변수).


당신의 점수는 자신의 언어 이름과 bytecount가 주어 졌을 때 프로그램의 출력됩니다. 그렇습니다. 이번에는 Java 및 C ++ 사용자도 이길 수 있습니다!

경고 : 쿼리는 'cool'헤더 형식을 사용하는 사람들과 질문에 태그를 지정하는 사람들로 인해 유효하지 않은 행이 많은 데이터 세트를 생성합니다 . 내가 제공 한 다운로드는 대부분의 특이 치를 제거했습니다. 쿼리와 함께 제공된 CSV를 사용하지 마십시오.

행복한 코딩!


3
Pyth 문서를 찾거나 두 개의 기존 Jelly 문서 조각 을 주의 깊게 연구하십시오
lirtosiast

귀하의 쿼리는 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)

코드 골프 (및 아마도 다른 코딩 문제)의 주목할만한 특징 중 하나는 프로그램 길이의 분포가 (균일 한 분포와 대조적으로) 지수 분포 인 경향이 있다는 것이다. 따라서 모델 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의 두 가지 예외적 인 언어와 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.