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.


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!


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.


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.


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.