A pergunta ideal

16

O que faz a pergunta ideal? Talvez seja apenas a abstração de um pensamento profundo e a inicialização de um sonho, uma esperança, um pensamento, um (… 5.024,2 caracteres omitidos ). Portanto, proponho que encontremos esse fator para quantificar perguntas. Proponho também que esse fator seja chamado Q F , ou o fator Q. Eu determino o fator Q de uma pergunta da seguinte forma:

(Lembre-se disso .)

Objetivo Dado um número como entrada, determine o fator Q da respectiva pergunta no PPCG.SE. Se a pergunta não existir, basta imprimir ;-;(o emoticon chorando).

Tome, por exemplo ,. ( esta pergunta ):

Os votos líquidos, neste caso, significa .

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

Então:

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

Por favor, forneça pelo menos 2 algarismos significativos sobre Q F .

Este é um , portanto o programa mais curto em bytes vence.


Nota: inclua três exemplos de seu programa em execução, um dos quais deve ser esta pergunta. Os outros dois são seus para decidir. (Essa é apenas uma verificação de confirmação.) Informe também o horário em que você inseriu a consulta.

Conor O'Brien
fonte
11
@AlexA. Qualquer um serve. E olhe para o meu representante! : D É um dígito repetitivo ! (É 888, no caso de alguém upvotes.)
Conor O'Brien
3
Pode ser interessante observar que a API do SE não expõe o número de edições em uma postagem.
Alex A.
2
Alex faz um bom argumento sobre as edições. Pode exigir tanto código para obter o número de edições quanto todas as outras estatísticas combinadas, já que não há uma maneira rápida de usar a API. Além disso, os encurtadores de URL podem ser usados?
Hobbies de Calvin
11
Os comentários do @DJMcMayhem tornam a pergunta mais valiosa - eles tornam o denominador menor.
13135 Daniel M.
5
Embora eu possa não saber qual é a pergunta, tenho certeza de que a resposta é 42.
Status

Respostas:

11

Julia, 411 382 367 355 353 bytes

É bastante longo, mas estou muito satisfeito que funcione!

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

Isso cria uma função sem nome que recebe um número inteiro como entrada e retorna um número flutuante.

Requer o Requestspacote, que pode ser instalado usando Pkg.add("Requests"). Esse pacote fornece métodos Base.get()para o envio de solicitações HTTP. Também importa o JSONpacote (do qual depende, para que não precise ser instalado separadamente) que usamos para analisar a saída JSON na resposta.

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

Obrigado a Dennis e Martin Büttner pela ajuda no golfe!

Alex A.
fonte
Agradável! Algum lugar onde eu possa testar isso?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Para obter melhores resultados, recomendo instalar o Julia 0.4.0 (atualmente a versão mais recente) em sua máquina e executá-la localmente. Você pode dar um nome ao lambda f=n->...e enviar f(16327)no REPL ou println(f(16327))se estiver executando a partir de um .jlarquivo. Ele funciona no JuliaBox (requer uma conta do Google) com o Julia 0.4.0-rc2, mas emite avisos ao pré-compilar o Requestsmódulo.
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]]})&

Apenas três consultas à API e muita indexação, na verdade. A parte mais difícil foi tentar entender como obter editsos dados disponíveis revisions, espero que eu tenha entendido direito.


fonte
11
Isso não funciona para mim no Mathematica 9. Ele diz que o StringTemplateargumento é inválido, imprime vários erros e não retorna um resultado.
Alex A.
Desculpe, esqueci de colocar o número da versão no título. Fixo!
Portanto, depende de recursos exclusivos do Mathematica 10?
Alex A.
Você não tem StringTemplateantes das 10, tanto quanto eu sei. Você pode substituir essa peça a=Function["http://api.stackexchange.com/"<>#1<>ToString[#2]<>#3<>"?site=codegolf"];e ver se funciona.
2

Python 2, 392 bytes

Bem, eu tentei.

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

Lógica muito semelhante à resposta de Julia de Alex . Gostaria de percorrer isso para ver qual pergunta é a mais ideal, mas prefiro não ligar continuamente para a API por horas a fio.

Status
fonte
Solicitações é um pacote de terceiros. Desde quando eram permitidos.
pppery
11
@ppperry Desde sempre, a menos que explicitamente proibido pelo OP. O uso de recursos externos que resolvem exatamente o desafio é proibido por padrão, mas esse não é o caso aqui.
Alex A.
2

Groovy, 459 457 bytes

Muito parecido com o resto das respostas.

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

Economizou 2 bytes graças a Cᴏɴᴏʀ 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)
Rnet
fonte