Wie wir alle wissen, Meta ist überfüllt mit Beschwerden über Scoring Code-Golf zwischen Sprachen (ja, jedes Wort eine separate Verbindung, und diese können nur die Spitze des Eisbergs sein).
Angesichts der großen Eifersucht gegenüber denjenigen, die sich tatsächlich die Mühe gemacht haben, die Pyth-Dokumentation nachzuschlagen, fand ich es schön, eine etwas konstruktivere Herausforderung zu haben, passend zu einer Website, die sich auf Code-Herausforderungen spezialisiert hat.
Die Herausforderung ist ziemlich einfach. Als Eingabe haben wir den Namen der Sprache und die Anzahl der Bytes . Sie können diese als Funktionseingaben stdin
oder als Standardeingabemethode für Ihre Sprachen verwenden.
Als Ausgabe haben wir eine korrigierte Byteanzahl , dh Ihre Punktzahl mit dem angewendeten Handicap. Die Ausgabe sollte jeweils die Funktionsausgabe stdout
oder die Standardausgabemethode Ihrer Sprache sein. Die Ausgabe wird auf ganze Zahlen gerundet, weil wir Tiebreaker lieben.
Mit der hässlichsten, gemeinsam gehackten Abfrage ( Link - zögern Sie nicht, sie zu bereinigen) habe ich es geschafft, einen Datensatz (zip mit .xslx, .ods und .csv) zu erstellen , der eine Momentaufnahme aller Antworten auf Code-Golf- Fragen enthält . Sie können diese Datei verwenden (und annehmen , dass es zu Ihrem Programm zur Verfügung steht, zum Beispiel in dem gleichen Ordner ist) oder diese Datei in ein anderen herkömmlichen Format konvertieren ( .xls
, .mat
, .sav
usw. - aber es kann nur die Originaldaten enthalten!). Der Name sollte QueryResults.ext
bei ext
der gewünschten Erweiterung bleiben .
Nun zu den Einzelheiten. Für jede Sprache gibt es einen Boilerplate- B
und einen Ausführlichkeitsparameter V
. Zusammen können sie verwendet werden, um ein lineares Modell der Sprache zu erstellen. Sei n
die tatsächliche Anzahl von Bytes und c
die korrigierte Punktzahl. Mit einem einfachen Modell erhalten n=Vc+B
wir für die korrigierte Punktzahl:
n-B
c = ---
V
Einfach genug, oder? Nun zur Bestimmung V
und B
. Wie zu erwarten, werden wir eine lineare Regression durchführen, genauer gesagt eine linearen Regression mit der Gewichtung der kleinsten Quadrate. Ich werde die Details dazu nicht erklären - wenn Sie nicht sicher sind, wie Sie das machen sollen, ist Wikipedia Ihr Freund , oder wenn Sie Glück haben, die Dokumentation Ihrer Sprache.
Die Daten lauten wie folgt. Jeder Datenpunkt ist n
die Byteanzahl und die durchschnittliche Byteanzahl der Frage c
. Um Stimmen zu erhalten, werden die Punkte mit der Anzahl der Stimmen plus eins gewichtet (um 0 Stimmen zu erhalten), nennen wir das v
. Antworten mit negativen Stimmen sollten verworfen werden. In einfachen Worten sollte eine Antwort mit 1 Stimme dasselbe wie zwei Antworten mit 0 Stimmen zählen.
Diese Daten werden dann unter n=Vc+B
Verwendung einer gewichteten linearen Regression in das vorgenannte Modell eingepasst .
Zum Beispiel die Daten für eine bestimmte Sprache gegeben
n1=20, c1=8.2, v1=1
n2=25, c2=10.3, v2=2
n3=15, c3=5.7, v3=5
Nun, wir komponieren die entsprechenden Matrizen und Vektoren A
, y
und W
mit unseren Parametern im Vektor
[1 c1] [n1] [1 0 0] x=[B]
A=[1 c2] y=[n2] W=[0 2 0], [V]
[1 c3] [n3] [0 0 5]
Wir lösen die Matrixgleichung (mit '
der Transponierung)
A'WAx=A'Wy
für x
(und folglich bekommen wir unsere B
und V
Parameter).
Ihre Punktzahl wird die Ausgabe Ihres Programms sein, wenn Sie Ihren eigenen Sprachnamen und Ihre Bytecount-Zahl angeben. Ja, diesmal können sogar Java- und C ++ - Benutzer gewinnen!
WARNUNG: Die Abfrage generiert ein Dataset mit vielen ungültigen Zeilen, da Benutzer die "coole" Header-Formatierung verwenden und ihre Code-Challenge- Fragen als Code-Golf kennzeichnen . Der von mir bereitgestellte Download hat die meisten Ausreißer entfernt. Verwenden Sie NICHT die mit der Abfrage bereitgestellte CSV.
Viel Spaß beim Codieren!
quelle
C++ <s>6 bytes</s>
. Außerdem habe ich bis heute noch nie T-SQL gemacht und ich bin schon beeindruckt, dass ich es geschafft habe, den bytecount zu extrahieren.Antworten:
Mathematica, 244.719 (245 Byte)
Testfall
Was ist mit anderen Sprachen?
Alternatives Modell :
log(c)=log((n-B)/V)
Ein bemerkenswertes Merkmal von Codegolf (und wahrscheinlich anderen Codierungsproblemen) ist, dass die Verteilung der Programmlängen tendenziell exponentiell ist (im Gegensatz zur gleichmäßigen Verteilung). Daher
log(n)=log(Vc+B)
ist es viel wahrscheinlicher, dass das Modell die Einflüsse zwischen großenc
und kleinen Punkten ausgleichtc
.Wie wir in den folgenden Diagrammen sehen können, eignet sich die Punkteverteilung zur Anpassung an die logarithmische Skala.
Ergebnisse des neuen Modells
Wir haben zwei außergewöhnliche Sprachen gefunden - Ruby mit
V=0.724
und Retina mitV=1.322
und ein Kriterium dafür, dass es sich um eine beliebte Golfsprache handelt - mit einem großen negativen Boilerplate.quelle
csv
.Python3, 765,19 (765) Bytes
Wahrscheinlich etwas Platz zum Golfen hier. Benötigt Numpy für Matrixmaterial. Liest wie folgt aus stdin: [lang] [bytes / n]. Stoppt beim Senden von q.
Ergebnisse
Ich könnte irgendwann etwas falsch gemacht haben; Ich erhalte andere Ergebnisse als die Mathematica-Antwort:
quelle