İdeal Soru


16

İdeal soruyu ne yapar? Belki de sadece derin bir düşüncenin soyutlanması ve bir rüyanın, bir umutun , bir düşüncenin başlatılmasıdır (… 5.024.2 karakter atlanmıştır ). Bu nedenle, soruları ölçmek için böyle bir faktör bulmamızı öneriyorum. Ayrıca bu faktörün Q F veya Q faktörü olarak adlandırılmasını öneriyorum . Bir sorunun Q faktörünü şu şekilde belirlerim:

(Hatırlayın .)

Hedef Girdi olarak bir sayı verildiğinde PPCG.SE'de ilgili sorunun Q faktörünü belirleyin. Soru mevcut değilse, sadece çıktı alın ;-;(ağlayan ifadeler).

Örneğin ,. ( bu soru ):

Bu durumda net oylar demektir .

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

Yani:

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

Üzerinde en az 2 önemli rakamlar verin Q F .

Bu bir , bu yüzden bayttaki en kısa program kazanıyor.


Not: Lütfen programınızın çalışan üç örneği ekleyin, bunlardan biri bu soru olmalıdır. Diğer ikisi siz karar verin. (Bu sadece bir onay kontrolüdür.) Ayrıca sorguyu girdiğiniz saati de bildirin.


1
@AlexA. Her ikisi de iyi. Ve benim temsilcime bak! : D Bu bir rep basamağı! (Birisi kaçarsa 888'dir.)
Conor O'Brien

3
SE API'nin bir yayındaki düzenleme sayısını göstermediğini belirtmek ilgi çekici olabilir.
Alex

2
Alex düzenlemeler hakkında iyi bir noktaya değindi. Düzenleme sayısını elde etmek için diğer tüm istatistiklerin toplamı kadar kod alması gerekebilir, çünkü API için bunun için hızlı bir yol yoktur. Ayrıca, URL kısaltıcıları kullanılabilir mi?
Calvin'in Hobileri

1
@DJMcMayhem Yorumlar bunu daha değerli bir soru yapar - paydayı daha küçük yaparlar.
Daniel

5
Sorunun ne olduğunu
Durum

Yanıtlar:


11

Julia, 411 382 367 355 353 bayt

Oldukça uzun ama işe yaradığı için çok memnunum!

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

Bu, girdi olarak bir tamsayıyı alan ve bir kayan nokta döndüren adsız bir işlev oluşturur.

RequestsKullanarak kurulabilen paketi gerektirir Pkg.add("Requests"). Bu paket Base.get()HTTP isteklerini göndermek için yöntemler sağlar . Ayrıca JSON, yanıtta JSON çıktısını ayrıştırmak için kullandığımız paketi (bağlı olduğu, ayrı olarak yüklenmesi gerekmez) içe aktarır .

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

Dennis ve Martin Büttner'e golf yardımı için teşekkürler!


Güzel! Bunu test edebileceğim herhangi bir yer var mı?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ En iyi sonuçlar için Julia 0.4.0'ı (şu anda en son sürüm) makinenize yüklemenizi ve yerel olarak çalıştırmanızı tavsiye ederim. Lambda'ya benzer bir ad verebilir ve REPL'de veya bir dosyadan çalıştırıyorsanız f=n->...gönderebilirsiniz . Julia 0.4.0-rc2 ile JuliaBox'ta (Google hesabı gerektirir) çalışır, ancak modülü önceden derlerken uyarılar verir . f(16327)println(f(16327)).jlRequests
Alex

3

Mathematica 10, 381 bayt

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

Gerçekten sadece üç API sorgusu ve çok sayıda dizinleme. En zor kısmı nasıl anlamaya çalışıyordum editsmevcut den revisionsumarım doğru tahmin ediyorum.


1
Mathematica 9'da bu benim için işe StringTemplateyaramıyor.
Alex

Maalesef, sürüm numarasını başlığa koymayı unuttum. Sabit!

Yani Mathematica 10'a özgü özelliklere mi bağlı?
Alex A.

StringTemplateBildiğim kadarıyla 10'dan önce yok . Bu parçayı değiştirebilir a=Function["http://api.stackexchange.com/"<>#1<>ToString[#2]<>#3<>"?site=codegolf"];ve çalışıp çalışmadığını görebilirsiniz.

2

Python 2, 392 Bayt

Ben de denedim.

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

Alex'in Julia cevabına çok benzer bir mantık . Hangi sorunun en ideal olduğunu görmek için bunun üzerinden geçmek istiyorum, ancak sürekli olarak api'yi saatlerce aramamayı tercih ediyorum.


İstekler bir üçüncü taraf paketidir. Ne zamandan beri izin verildi.
pppery

1
@ppperry Her zamandan beri OP tarafından açıkça izin verilmediği sürece. Sorunu tam olarak çözen harici kaynakların kullanılması varsayılan olarak yasaklanmıştır, ancak burada durum böyle değildir.
Alex

2

Groovy, 459 457 bayt

Diğer cevaplara çok benziyor.

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

Cᴏɴᴏʀ O'Bʀɪᴇɴ sayesinde 2 bayt tasarruf edildi!

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.