As we all know, meta is overflowing with complaints about scoring code-golf between languages (yes, each word is a separate link, and these may be just the tip of the iceberg).
With so much jealousy towards those who actually bothered to look up the Pyth documentation, I thought it would be nice to have a little bit more of a constructive challenge, befitting of a website that specializes in code challenges.
The challenge is rather straightforward. As input, we have the language name and byte count. You can take those as function inputs, stdin
or your languages default input method.
As output, we have a corrected byte count, i.e., your score with the handicap applied. Respectively, the output should be the function output, stdout
or your languages default output method. Output will be rounded to integers, because we love tiebreakers.
Using the most ugly, hacked together query (link - feel free to clean it up), I have managed to create a dataset (zip with .xslx, .ods and .csv) that contains a snapshot of all answers to code-golf questions. You can use this file (and assume it to be available to your program, e.g., it's in the same folder) or convert this file to another conventional format (.xls
, .mat
, .sav
etc - but it may only contain the original data!). The name should remain QueryResults.ext
with ext
the extension of choice.
Now for the specifics. For each language, there is a Boilerplate \$B\$ and Verbosity \$V\$ parameters. Together, they can be used to create a linear model of the language. Let \$n\$ be the actual number of bytes, and \$c\$ be the corrected score. Using a simple model \$n=Vc+B\$, we get for the corrected score:
$$c = \frac{n-B}V$$
Simple enough, right? Now, for determining \$V\$ and \$B\$. As you might expect, we're going to do some linear regression, or more precise, a least squares weighted linear regression. I'm not going to explain the details on that - if you're not sure how to do that, Wikipedia is your friend, or if you're lucky, your language's documentation.
The data will be as follows. Each data point will be the byte count \$n\$ and the question's average bytecount \$c\$. To account for votes, the points will be weighted, by their number of votes plus one (to account for 0 votes), let's call that \$v\$. Answers with negative votes should be discarded. In simple terms, an answer with 1 vote should count the same as two answers with 0 votes.
This data is then fitted into the aforementioned model \$n=Vc+B\$ using weighted linear regression.
For example, given the data for a given language
$$ \begin{array} \\ n_1=20, & c_1=8.2, & v_1=1 \\ n_2=25, & c_2=10.3, & v_2=2 \\ n_3=15, & c_3=5.7, & v_3=5 \end{array}$$
Now, we compose the relevant matrices and vectors \$A\$, \$y\$ and \$W\$, with our parameters in the vector
$$ A = \left[\begin{matrix} 1 & c_1 \\ 1 & c_2 \\ 1 & c_3 \\ \end{matrix}\right] y = \left[\begin{matrix} n_1 \\ n_2 \\ n_3 \\ \end{matrix}\right] W = \left[\begin{matrix} 1 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 5 \\ \end{matrix}\right] x = \left[\begin{matrix} B \\ V \\ \end{matrix}\right] $$
we solve the matrix equation (with \${}^T\$ denoting the matrix transpose)
$$A^TWAx=A^TWy$$
for \$x\$ (and consequently, we get our \$B\$ and \$V\$ parameter).
Your score will be the output of your program, when given your own language name and bytecount. So yes, this time even Java and C++ users can win!
WARNING: The query generates a dataset with a lot of invalid rows due to people using 'cool' header formatting and people tagging their code-challenge questions as code-golf. The download I provided has most of the outliers removed. Do NOT use the CSV provided with the query.
Happy coding!
C++ <s>6 bytes</s>
. Besides, I never did any T-SQL before today and I'm already impressed with myself that I managed to extract the bytecount. \$\endgroup\$