Jeder weiß, dass der Inhalt die Frage stellt. Aber ein guter Titel hilft auch, und das ist das Erste, was wir sehen. Es ist Zeit, diesen ersten Eindruck in ein Programm zu verwandeln und herauszufinden, welche Arten von Titeln mehr positive Stimmen erhalten.
Sie werden hiermit aufgefordert, ein Programm oder eine Funktion zu schreiben, die den Titel einer PPCG-Frage als Eingabe verwendet und eine Vorhersage der Punktzahl zurückgibt.
Beispielsweise könnten Sie Counting Grains of Rice
als Eingabe empfangen und 59
in diesem Fall versuchen, etwas zurückzugeben, das in der Nähe der Punktzahl liegt . Nicht ganzzahlige Vermutungen sind in Ordnung, Vermutungen bei oder darunter -20
jedoch nicht.
Hier sind die Daten zum Testen und Bewerten:
http://data.stackexchange.com/codegolf/query/244871/names-and-upvotes
Bewertung: Ihr Programm wird für jede Frage im Verlauf dieser Site (PPCG) ausgeführt, wobei geschlossene Fragen nicht berücksichtigt werden. Die Funktion ln(score + 20)
wird dann auf jede Punktzahl und auf jede Vermutung angewendet. Der quadratische Mittelwertfehler zwischen den beiden resultierenden Wertesätzen ist Ihre Punktzahl. Weniger ist besser.
Zum Beispiel würde ein Programm, das jedes Mal 0 erraten hat, 0,577 Punkte erzielen, während eines, das jedes Mal 11 erraten hat, 0,362 Punkte erzielen würde.
Bitte berechnen Sie Ihre Punktzahl und fügen Sie sie in den Titel Ihrer Antwort ein. Bitte geben Sie auch die Vorhersage Ihres Programms an, wie viele Upvotes diese Frage erhalten wird.
Beschränkungen:
Um eine übermäßige Kodierung zu vermeiden, dürfen nicht mehr als 1000 Zeichen eingegeben werden.
Muss auf einem vernünftigen Computer in weniger als einer Minute mit dem gesamten oben genannten Datensatz ausgeführt werden.
Standardlücken sind geschlossen.
Hier ist ein in Python geschriebener Tester, der Sie verwenden und / oder Unklarheiten beseitigen kann:
import sys
import math
import csv
scores_dict = {}
with open(sys.argv[1], 'r') as csv_file:
score_reader = csv.reader(csv_file)
for score, title in score_reader:
if score == 'Score':
continue
scores_dict[title] = int(score)
def rate_guesses(guesser):
def transform(score):
return math.log(score + 20) if score > -20 else 0
off_by_total = 0
lines_count = 0
for title in scores_dict:
guessed_score = guesser(title)
real_score = scores_dict[title]
off_by_total += (transform(real_score) - transform(guessed_score)) ** 2
return (off_by_total/len(scores_dict)) ** .5
def constant11(title):
return 11
print(rate_guesses(constant11))
quelle
[closed]
und[on hold]
gegebenenfalls ein oder aus ?Antworten:
Python 2, 991 Zeichen, Ergebnis 0.221854834221, Vorhersage 11
Erläuterung:
Dies ist eine unverschämte Hardcodierung, die jedoch effizient durchgeführt werden muss.
Vorverarbeitung:
In einem separaten Code habe ich jeden Titel auf einen Wert zwischen 0 und 256 ^ 2-1 gehasht. Nennen wir diese Wertefächer. Für jeden Behälter habe ich die durchschnittliche Punktzahl berechnet. (Der Durchschnitt wird benötigt, da für einen kleinen Teil der Bins Kollisionen vorliegen - mehr als 1 Titel-Hash für denselben Bin. Bei der überwiegenden Mehrheit wird jeder Titel einem eigenen Bin zugeordnet.)
Die Idee hinter dem 2-Byte-Code für jeden Titel ist, dass 1 Byte nicht ausreicht - wir bekommen zu viele Kollisionen, sodass wir nicht genau wissen, welche Punktzahl jedem 1-Byte-Bin zugewiesen werden soll. Bei 2-Byte-Bins gibt es jedoch fast keine Kollisionen, und wir erhalten effektiv eine 2-Byte-Darstellung jedes Titels.
Dann zählt die Behälter - die Verstärkung in der Partitur berechnen , wenn wir dieses Fach seinen berechneten Wert zuweisen, anstatt nur 11. den Top - N - Bins Nehmen Sie erraten, und Code sie in einen String (die in dem eigentlichen Code ist d).
Die Kodierung: Der Schlüssel der Bin wird mit 2 Bytes kodiert. Der Wert wird mit 1 Byte codiert. Ich habe Werte zwischen -8 und 300 + gefunden, musste also ein wenig drücken, um 1 Byte zu erhalten: x -> (x + 8) / 2.
Tatsächlicher Code:
lese d als Byte-Triplets und decodiere die oben erläuterte Codierung. Wenn ein Titel angegeben wird, berechnen Sie seinen Hash (Modulo 256 ^ 2). Wenn dieser Schlüssel im Diktat gefunden wird, geben Sie den Wert zurück, dem er zugeordnet ist. Andernfalls geben Sie 11 zurück.
quelle
Javascript ES6
Bewertung: 0.245663
Länge: 1000 Bytes
Vorhersage: 5
(Ich denke, die Frage ist auf eine unerwartete Lawine von Abstimmungen zurückzuführen.: P)
Minimiert
Erweitert
Die Funktion
S
akzeptiert einen String (Titel) und gibt dessen Punktzahl zurück.Hinweise zum Verhalten:
quelle
Python 2, Score = 0.335027, 999 Zeichen, Sagen Sie 11.34828 für diese Frage voraus
Nur um den Ball ins Rollen zu bringen. Das ist nirgends optimal.
Das ausgefallene SVM-Ding ist nur meine zufällige Idee und ich wollte es implementieren, also hier ist es. Es verbessert die Grundlinie um 0,02 Punkte, also bin ich damit zufrieden. Aber um zu zeigen, dass der Großteil der Verbesserungen auf die harte Codierung der Eingabe zurückzuführen ist, habe ich auch einige Antworten hart codiert.
Ohne die Hardcodierung liegt der Wert bei 0,360 (und tatsächlich liegen alle Vorhersagen bei 11, haha).
Ich benutze scikit-learn und nltk
quelle
Python 2, 986 Zeichen, 0,3480188 Punkte, vorhergesagt 12
Die relevante Funktion ist
J
.Das Programm ist im Wesentlichen Naive Bayes und verwendet Titelwörter als Funktionen, ist aber dank der Zeichenbeschränkung extrem eingeschränkt. Wie eingeschränkt? Gut...
w
). Die Komprimierung erfolgt durch Neuanordnung der Triplets, sodass möglichst viele Doppelbuchstaben vorhanden sind, und diese Paare werden durch die entsprechenden ASCII-Großbuchstaben ersetzt (z. B. fiLoNoN ... → fil, lon, non, ...).m
,s
über, unter Ausnutzung der Tatsache , dass die mittlere / sd ist höchstens 90 (eine direkte ASCII - Kodierung ermöglicht, da es 95 druckbaren ASCII)G
ist die Normalverteilungsfunktion - wir runden e auf 2dp und die Quadratwurzel von 2 pi auf 1 dp, um Zeichen zu sparen.Insgesamt hat das extreme Zeichenlimit dies zu einer der schlechtesten Ideen gemacht, die ich mir je ausgedacht habe, aber ich bin ziemlich glücklich darüber, wie viel ich hineingepfercht habe (auch wenn es nicht sehr gut funktioniert). Wenn jemand bessere Ideen für die Komprimierung hat, lass es mich wissen :)
(Danke an KennyTM für den Hinweis auf meine sinnlose Komprimierung)
quelle
w='grge…scse';w=[w[i:i+2]for i in range(0,len(w),2)]
ist 165 Byte lang, während Ihr CodeC=lambda:…;w=C('…')
179 Byte lang ist.Python 2, 535 Zeichen, 0,330910 Punkte, sagt 11,35 voraus
Mitteln Sie die Punktzahl für Titel, die jedes Wort enthalten, und verwenden Sie dann die oberen und unteren 50 Wörter, um möglicherweise die BASIS-Punktzahl in der
guess(title)
Funktion zu ändern .Python-Code:
quelle
C
Punktzahl: Unbekannt
Länge: 5 Bytes
Voraussagen: 5
Golf gespielt:
Ungolfed:
Eine Abfrage der Bewertungen ergibt eine durchschnittliche Bewertung von 5.
Ich habe im Moment nicht die Möglichkeit, es zu testen, andere können es gerne ausführen / bearbeiten.
quelle