Idealne pytanie

16

Co stanowi idealne pytanie? Być może jest to jedynie abstrakcja głębokiej myśli i inicjacja snu, nadzieja, myśl, a (… 5044,2 znaków pominięto ). Dlatego proponuję znaleźć taki czynnik do kwantyfikacji pytań. Proponuję również, aby czynnik ten nazwać Q F lub współczynnikiem Q. Współczynnik Q pytania określam w ten sposób:

(Przypomnij to .)

Cel Biorąc pod uwagę liczbę jako dane wejściowe, określ współczynnik Q odpowiedniego pytania na PPCG.SE. Jeśli pytanie nie istnieje, po prostu wyjdź ;-;(płacząca emotka).

Weźmy na przykład . ( to pytanie ):

W tym przypadku liczba głosów netto oznacza .

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

Więc:

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

Proszę podać co najmniej 2 istotne dane dotyczące Q F .

To jest , więc wygrywa najkrótszy program w bajtach.


Uwaga: dołącz trzy przykłady uruchomionego programu, z których jeden musi być tym pytaniem. Pozostałe dwa należy do ciebie. (To tylko sprawdzenie potwierdzenia.) Podaj także godzinę, w której wprowadziłeś zapytanie.

Conor O'Brien
źródło
1
@AlexA. Albo jedno jest w porządku. I spójrz na mojego przedstawiciela! : D To cyfra rep ! (Jest 888, na wypadek, gdyby ktoś głosował).
Conor O'Brien
3
Warto zauważyć, że SE API nie ujawnia liczby zmian w poście.
Alex A.,
2
Alex ma rację co do zmian. Może to wymagać tyle samo kodu, aby uzyskać liczbę zmian, jak wszystkie inne statystyki łącznie, ponieważ nie ma szybkiego sposobu na użycie interfejsu API do tego. Czy można również stosować skracacze adresów URL?
Calvin's Hobbies
1
@DJMcMayhem Komentarze sprawiają, że jest to bardziej wartościowe pytanie - zmniejszają mianownik.
Daniel M.
5
Chociaż może nie wiem, jakie jest pytanie, jestem pewien, że odpowiedź brzmi 42.
Stan

Odpowiedzi:

11

Julia, 411 382 367 355 353 bajtów

Jest dość długi, ale bardzo się cieszę, że działa!

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"))))

Tworzy to nienazwaną funkcję, która przyjmuje na wejściu liczbę całkowitą i zwraca liczbę zmiennoprzecinkową.

Wymaga Requestspakietu, który można zainstalować za pomocą Pkg.add("Requests"). Ten pakiet zawiera metody Base.get()przesyłania żądań HTTP. Importuje również JSONpakiet (od którego to zależy, więc nie trzeba go instalować osobno), którego używamy do analizowania danych wyjściowych JSON w odpowiedzi.

Nie golfowany:

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

Podziękowania dla Dennisa i Martina Büttnera za pomoc w grze w golfa!

Alex A.
źródło
Ładny! Jakieś miejsce, gdzie mogę to przetestować?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Aby uzyskać najlepsze wyniki, zalecam zainstalowanie Julii 0.4.0 (obecnie najnowszej wersji) na twoim komputerze i uruchomienie jej lokalnie. Możesz nadać lambda nazwę jak f=n->...i przesłać f(16327)na REPL lub println(f(16327))jeśli uruchamiasz ją z .jlpliku. Działa na JuliaBox (wymaga konta Google) z Julią 0.4.0-rc2, ale daje ostrzeżenia podczas wstępnej kompilacji Requestsmodułu.
Alex A.,
3

Mathematica 10, 381 bajtów

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]]})&

Tylko trzy zapytania API i dużo indeksowania, naprawdę. Najtrudniejsza była próba zrozumienia, jak uzyskać editsdostęp do dostępnych revisions, mam nadzieję, że dobrze to zrozumiałem .


źródło
1
To nie działa dla mnie w Mathematica 9. Mówi, że StringTemplateargument jest niepoprawny, drukuje wiele błędów i nie zwraca wyniku.
Alex A.,
Przepraszam, zapomniałem podać numer wersji w tytule. Naprawiony!
Czy to zależy od funkcji unikalnych w Mathematica 10?
Alex A.,
StringTemplateO ile mi wiadomo, nie masz przed 10. Możesz zastąpić tę część a=Function["http://api.stackexchange.com/"<>#1<>ToString[#2]<>#3<>"?site=codegolf"];i sprawdzić, czy to działa.
2

Python 2, 392 bajtów

Cóż, dałem mu szansę.

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';-;'

Bardzo podobna logika do odpowiedzi Julii Alexa . Chciałbym przejrzeć tę kwestię, aby zobaczyć, które pytanie jest najbardziej idealne, ale wolałbym nie wywoływać interfejsu API godzinami.

Status
źródło
Żądania to pakiet innej firmy. Od kiedy były dozwolone.
pppery
1
@ppperry Ponieważ zawsze, chyba że zostanie to wyraźnie zabronione przez PO. Korzystanie z zasobów zewnętrznych, które dokładnie rozwiązują wyzwanie, jest domyślnie zabronione, ale tutaj tak nie jest.
Alex A.
2

Groovy, 459 457 bajtów

Prawie jak pozostałe odpowiedzi.

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()))}

Zaoszczędzono 2 bajty dzięki Cᴏɴᴏʀ O'Bʀɪᴇɴ!

Nie golfowany:

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)
Rnet
źródło