Ідеальне питання


16

Що робить ідеальним питання? Можливо, це просто абстрагування глибокої думки та ініціалізація мрії, надії, думки (… опущено 5,024,2 символу ). Тому я пропоную знайти такий чинник для кількісної оцінки питань. Я пропоную також цей фактор назвати Q F , або Q-коефіцієнтом. Я визначаю Q-фактор питання таким чином:

(Нагадаємо .)

Завдання З огляду на число, яке є вхідним, визначте коефіцієнт 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 у відповіді.

Безголівки:

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

Дякуємо Деннісу та Мартіну Бюттнеру за допомогу в гольфі!


Приємно! Я можу це перевірити?
Conor O'Brien

@ 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

Пітон 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 Оскільки завжди, якщо явно не заборонено ОП. Використання зовнішніх ресурсів, які точно вирішують завдання, заборонено за замовчуванням, але це не так.
Олексій А.

2

Гровий, 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ᴏɴᴏʀ O'Bʀɪᴇɴ!

Безголівки:

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.