Идеальный вопрос


16

Что делает идеальный вопрос? Возможно, это просто абстракция глубокой мысли и инициализация мечты, надежды, мысли, (… 5024,2 символа опущено ). Поэтому я предлагаю найти такой фактор для количественной оценки вопросов. Я предлагаю также назвать этот фактор Q F , или Q-фактор. Я определяю добротность вопроса следующим образом:

(Напомним, что .)

Цель Дано число входных данных указать Определить добротность соответствующего вопроса на сайте PPCG.SE. Если вопрос не существует, просто выведите ;-;(плачущая эмоция).

Взять, к примеру ,. ( этот вопрос ):

Чистые голоса в данном случае означают .

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

Так:

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

Просьба представить по крайней мере 2 значащих цифр на Q F .

Это , поэтому выигрывает самая короткая программа в байтах.


Примечание: пожалуйста, включите три примера запуска вашей программы, один из которых должен быть этим вопросом. Два других - решать вам. (Это просто проверка подтверждения.) Также сообщите время, когда вы ввели запрос.


1
@AlexA. Либо в порядке. И посмотри на мою репутацию! : D Это повторяющаяся цифра! (Это 888, в случае, если кто-то проголосует.)
Конор О'Брайен

3
Может быть интересно отметить, что SE API не показывает количество правок в сообщении.
Алекс А.

2
Алекс делает хорошее замечание по поводу правок. Для получения количества правок может потребоваться столько же кода, сколько и для всей другой статистики, так как для этого нет быстрого способа использовать API. Кроме того, можно ли использовать сокращения URL?
Увлечения Кэлвина

1
@DJMcMayhem Комментарии делают это более ценным вопросом - они уменьшают знаменатель.
Даниэль М.

5
Хотя я, возможно, и не знаю, в чем вопрос, я почти уверен, что ответ 42.
Статус

Ответы:


11

Юлия, 411 382 367 355 353 байта

Это довольно долго, но я очень рад, что это работает!

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

Это создает безымянную функцию, которая принимает целое число в качестве входных данных и возвращает число с плавающей запятой.

Требуется Requestsпакет, который можно установить с помощью Pkg.add("Requests"). Этот пакет предоставляет методы Base.get()для отправки HTTP-запросов. Он также импортируетJSON пакет (от которого он зависит, поэтому его не нужно устанавливать отдельно), который мы используем для анализа вывода JSON в ответе.

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

Спасибо Деннису и Мартину Бюттнеру за помощь в игре в гольф!


Ницца! В каком месте я могу это проверить?
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Для достижения наилучших результатов я рекомендую установить Julia 0.4.0 (в настоящее время последний выпуск) на вашем компьютере и запускать его локально. Вы можете дать лямбда-имя такое же имя f=n->...и отправить f(16327)в REPL или, println(f(16327))если вы запускаете его из .jlфайла. Он работает на JuliaBox (требуется учетная запись Google) с Julia 0.4.0-rc2, но выдает предупреждения при предварительной компиляции Requestsмодуля.
Алекс А.

3

Mathematica 10, 381 байт

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

На самом деле всего три API-запроса и много индексации. Сложнее всего было попытаться понять, как получить editsдоступное из имеющегося revisions, надеюсь, я правильно понял.


1
Это не работает для меня в Mathematica 9. Он говорит, что StringTemplateаргумент недействителен, печатает кучу ошибок и не возвращает результат.
Алекс А.

Извините, я забыл указать номер версии в заголовке. Исправлена!

Таким образом, это зависит от особенностей, уникальных для Mathematica 10?
Алекс А.

У вас нет StringTemplateдо 10, насколько я знаю. Вы можете заменить эту часть a=Function["http://api.stackexchange.com/"<>#1<>ToString[#2]<>#3<>"?site=codegolf"];и посмотреть, работает ли она.

2

Python 2, 392 байта

Ну, я дал ему шанс.

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

Очень похожая логика на Алекса ответ Юлии . Я хотел бы пройтись по этому вопросу, чтобы увидеть, какой вопрос является наиболее идеальным, но я бы не хотел непрерывно звонить в API часами подряд.


Запросы это сторонний пакет. С каких пор это было разрешено?
pppery

1
@ppperry Так как всегда, если явно не запрещено OP. Использование внешних ресурсов, которые точно решают проблему, по умолчанию запрещено, но здесь это не так.
Алекс А.

2

Groovy, 459 457 байт

Очень похоже на остальные ответы.

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 байта благодаря C Sa 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.