Die ideale Frage


16

Was macht die ideale Frage aus? Vielleicht ist es nur die Abstraktion eines tiefen Gedankens und die Initialisierung eines Traumes, einer Hoffnung, eines Gedankens, eines (… 5.024,2 Zeichen weggelassen ). Daher schlage ich vor, dass wir einen solchen Faktor finden, um Fragen zu quantifizieren. Ich schlage auch vor, dass dieser Faktor Q F oder der Q-Faktor genannt wird. Ich bestimme den Q-Faktor einer Frage wie folgt:

(Daran erinnern .)

Ziel Ermitteln Sie anhand einer Zahl als Eingabe den Q-Faktor der jeweiligen Frage zu PPCG.SE. Wenn die Frage nicht existiert, einfach ausgeben ;-;(das weinende Emote).

Nehmen Sie zum Beispiel . ( diese Frage ):

Die Nettovoten bedeuten in diesem Fall .

views     = 23435
net votes = 33
edits     = 6
answers   = 30, answers^2 = 900
comments  = 19
charsIOPN = "Joe Z.".length = 6

So:

r_F = 6 / 6 = 1
Q_F = r_F * (23435 * 33 + 6) / (900 - 19)
    =  1  *      773361      /    881
    ~ 877.821793

Bitte geben Sie mindestens 2 signifikante Zahlen auf Q F .

Dies ist ein , also gewinnt das kürzeste Programm in Bytes.


Hinweis: Bitte geben Sie drei Beispiele für Ihr laufendes Programm an, von denen eines diese Frage sein muss. Die anderen beiden können Sie selbst entscheiden. (Dies ist nur eine Bestätigungsprüfung.) Geben Sie auch den Zeitpunkt an, zu dem Sie die Abfrage eingegeben haben.


1
@AlexA. Beides ist in Ordnung. Und sieh dir meinen Repräsentanten an! : D Es ist eine Wiederholungszahl ! (Es ist 888, falls jemand aufschlägt.)
Conor O'Brien

3
Es kann von Interesse sein, zu beachten, dass die SE-API die Anzahl der Bearbeitungen in einem Beitrag nicht verfügbar macht.
Alex A.

2
Alex macht einen guten Punkt über die Änderungen. Möglicherweise ist genau so viel Code erforderlich, um die Anzahl der Bearbeitungen zu ermitteln, wie alle anderen Statistiken zusammen, da es keine schnelle Möglichkeit gibt, die API dafür zu verwenden. Können auch URL-Shortenger verwendet werden?
Calvins Hobbys

1
@DJMcMayhem Kommentare machen es zu einer wertvolleren Frage - sie verkleinern den Nenner.
Daniel M.

5
Obwohl ich vielleicht nicht weiß, was die Frage ist, bin ich mir ziemlich sicher, dass die Antwort 42 ist.
Status

Antworten:


11

Julia, 411 382 367 355 353 Bytes

Es ist ziemlich lang, aber ich freue mich sehr, dass es funktioniert!

using Requests
n->(R(t)=readall(get(t));G(t)=JSON.parse(R("http://api.stackexchange.com/2.2/questions/$t?site=codegolf"))["items"];j=G(n)[1];d=parse(Int,match(r"<span \S+n (\d+)",R("http://codegolf.xyz/posts/$n/revisions")).captures[1]);d/length(j["owner"]["display_name"])*(j["view_count"]*j["score"]+d)/(j["answer_count"]^2-length(G("$n/comments"))))

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl als Eingabe verwendet und einen Gleitkommawert zurückgibt.

Es erfordert das RequestsPaket, das mit installiert werden kann Pkg.add("Requests"). Dieses Paket enthält Methoden Base.get()zum Senden von HTTP-Anforderungen. Es importiert auch das JSONPaket (von dem es abhängt, damit es nicht separat installiert werden muss), das wir verwenden, um die JSON-Ausgabe in der Antwort zu analysieren.

Ungolfed:

using Requests

function f(n::Int)
    # Define a function to submit an HTTP request and read
    # the response, returning a string
    R(t) = readall(get(t))

    # Define a function that submits a request, reads all text
    # as JSON, parses it, and extracts the items field
    G(t) = begin
        api = "http://api.stackexchange.com/questions"
        JSON.parse(R("$api/$t?site=codegolf"))["items"]
    end

    # Get the data for the question using the API
    j = G(n)[1]

    # Scrape the number of edits from the revision history HTML
    # using minxomat's handy shortened PPCG URL
    h = R("http://codegolf.xyz/posts/$n/revisions")
    d = parse(Int, match(r"<span \S+n (\d+)", h).captures[1])

    # Compute the coefficient r_F
    r = d / length(j["owner"]["display_name"])

    # Compute the Q-factor
    Q = r * (j["view_count"] * j["score"] + d) /
        (j["answer_count"]^2 - length(G("$n/comments")))

    return Q
end

Vielen Dank an Dennis und Martin Büttner für die Golfhilfe!


Nett! Wo kann ich das testen?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Für optimale Ergebnisse empfehle ich, Julia 0.4.0 (derzeit die neueste Version) auf Ihrem Computer zu installieren und lokal auszuführen. Sie können der Lambda einen Namen wie geben f=n->...und legen f(16327)an der REPL oder println(f(16327))wenn Sie es von einer läufst .jlDatei. Es funktioniert auf JuliaBox (erfordert ein Google-Konto) mit Julia 0.4.0-rc2, gibt aber beim Vorkompilieren des RequestsModuls Warnungen aus .
Alex A.

3

Mathematica 10, 381 Bytes

f=(a=StringTemplate["http://api.stackexchange.com/``````?site=codegolf"];j=Import[a["questions/",#,""],"JSON"];c=Import[a["questions/",#,"/comments"],"JSON"];r=Import[a["posts/",#,"/revisions"],"JSON"];N[#5/#6*(#1*#2+#5)/(#3^2-#4)]&@@j[[3,2,1,{5,2,12},2]]~Join~{Length@c[[3,2]],Length@DeleteCases[r[[3,2]],_?(("revision_type"/.#)=="vote_based"&)],StringLength@j[[3,2,1,3,2,6,2]]})&

Wirklich nur drei API-Abfragen und viel Indizierung. Das Schwierigste war, zu verstehen, wie man editsdas zur Verfügung stellt revisions, hoffentlich habe ich es richtig verstanden.


1
Dies funktioniert in Mathematica 9 nicht. Es besagt, dass das StringTemplateArgument ungültig ist, eine Reihe von Fehlern ausgibt und kein Ergebnis zurückgibt.
Alex A.

Entschuldigung, ich habe vergessen, die Versionsnummer in den Titel einzufügen. Fest!

Es kommt also auf Funktionen an, die nur in Mathematica 10 verfügbar sind.
Alex A.

StringTemplateSoweit ich weiß, haben Sie keine vor 10. Sie können dieses Teil durch ersetzen a=Function["http://api.stackexchange.com/"<>#1<>ToString[#2]<>#3<>"?site=codegolf"];und prüfen, ob es funktioniert.

2

Python 2, 392 Bytes

Nun, ich habe es ausprobiert.

from requests import*;from re import*;l=len
def i(n):
 try:s,r="http://api.stackexchange.com/2.2/questions/%s?site=codegolf","http://codegolf.xyz/posts/%i/revisions"%n;q,c=s%n,s%('%i/comments'%n);i=get(q).json()['items'][0];m=float(l(findall("<span \S+n (\d+)",get(r).text)));r=m/l(i["owner"]["display_name"]);print r*(i["view_count"]*i["score"]+m)/(i["answer_count"]**2-m)
 except:print';-;'

Sehr ähnliche Logik zu Alex ' Julia-Antwort . Ich würde dies gerne durchgehen, um zu sehen, welche Frage die idealste ist, aber ich möchte lieber nicht stundenlang die API aufrufen.


Requests ist ein Drittanbieterpaket. Seit wann waren die erlaubt.
Paprika

1
@ppperry Da immer, wenn nicht ausdrücklich vom OP verboten. Die Verwendung externer Ressourcen, die die Herausforderung genau lösen, ist standardmäßig verboten, dies ist hier jedoch nicht der Fall.
Alex A.

2

Groovy, 459 457 Bytes

Ziemlich genau wie der Rest der Antworten.

import groovy.json.JsonSlurper
import java.util.zip.GZIPInputStream
def f={n->def j,d,u={p->new JsonSlurper().parseText(new GZIPInputStream("http://api.stackexchange.com/2.2/questions/$p?site=codegolf".toURL().getContent()).getText()).items}
j=u(n)[0]
d=("http://codegolf.xyz/posts/$n/revisions".toURL().text=~/<span \S+n (\d+)/).getCount()
println((d/j.owner.display_name.length())*(j.view_count*j.score+d)/(j.answer_count**2-u("$n/comments").size()))}

2 Bytes gespart dank C 2 O'Bʀɪᴇɴ!

Ungolfed:

import groovy.json.JsonSlurper
import java.util.zip.GZIPInputStream

def f = { n->

    def stackApi = "http://api.stackexchange.com/2.2"

    // Fetch json from stackexchange rest api
    def getItems = { pathParam ->
        //Stackexchange compresses data, decompress before parsing json
        def httpData = "$stackApi/questions/$pathParam?site=codegolf".toURL().getContent()
        def deCompressedData = new GZIPInputStream(httpData).getText()
        def json = new JsonSlurper().parseText(deCompressedData)
        return json.items
    }

    // Get the edit count from the html page
    def htmlPage = "http://codegolf.xyz/posts/$n/revisions".toURL()
    def editCount = (htmlPage.text=~/<span \S+n (\d+)/).getCount()

    // apply formula
    def json = getItems(n)[0]
    def r = editCount/json.owner.display_name.length()
    def Q = r * ( json.view_count * json.score + editCount) /
                (json.answer_count**2 - getItems("$n/comments").size())
    println(Q)
}

f(16327)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.