Отношение к голосованию

18

Этот вопрос вдохновлен тем фактом, что я люблю видеть вопросы с равным количеством голосов и количеством ответов ...


Итак, вот простая задача для вас:

Вызов:

Для данного codegolf.stackexchangeидентификатора вопроса выведите соотношение между количеством голосов в вопросе и количеством ответов (например, votes/answers).

Особенности:

  • Вы можете получить доступ к Интернету, но вы можете получить доступ только к stackexchange.comего различным поддоменам. Вы не можете использовать сокращения URL.

  • Вы можете принимать и выводить данные в любом стандартном формате.

  • Вы должны вывести отношение в виде десятичного числа в базе 10, по крайней мере с 4 точными цифрами после десятичного числа (нули могут быть усечены).

  • Если вопрос остается без ответа, ваша программа может вызвать неопределенное поведение.

  • Вы должны использовать scoreвопрос в качестве подсчета голосов, см. Здесь .

Это : наименьшее количество байт на каждом языке выигрывает для этого языка, наименьшее количество байт в общем выигрывает.

Вот пример программы на Python 3 + requests:

import requests
import json

id = input("id> ")
url = "https://api.stackexchange.com/2.2/questions/" + id + "?site=codegolf"
content = requests.get(url).text
question = json.loads(content)["items"][0]

print(float(question["score"]) / question["answer_count"])
Сократовский феникс
источник
Нужно ли для отношения по крайней мере 4 десятичных знака после десятичной точки, даже если они равны нулю? Например, 41/4 = 10.25 или 10.2500
pizzapants184
@ pizzapants184 10.25 в порядке
сократовский феникс
Что делать, если на вызов не ответили? Тогда соотношение будет бесконечным?
г-н Xcoder
Вы имеете в виду балл или общее количество голосов по этому вопросу?
AdmBorkBork
@ Mr.Xcoder в этом случае, неопределенное поведение в порядке
Сократик Феникс

Ответы:

10

JavaScript (ES6), 103 102 байта

Необходимо запустить с корневого уровня api.stackexchange.com. Возвращает Promiseобъект, содержащий результат.

n=>fetch(`questions/${n}?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)
  • 1 байт сохранен благодаря kamoroso94 .

Если разрешено запускать его по определенному пути, тогда это становится 92 90 байтами.

n=>fetch(n+`?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)

Попытайся

Добавлен полный URL, чтобы он работал здесь.

f=
n=>fetch(`//api.stackexchange.com/questions/${n}?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)
onchange=_=>f(+i.value).then(t=>o.innerText=t)
<input id=i type=number><pre id=o>

мохнатый
источник
7
Заменить i=>(j=i.items[0])на, ({items:[j]})=>jчтобы сохранить байт.
kamoroso94
Хороший трюк, спасибо, @ kamoroso94. Я должен запомнить это.
Лохматый
8

Стратос , 40 байт

-4 байта благодаря Shaggy

f"¹⁵s/%²"r"⁷s"@0
{s"answer_⁰"
⁰s"score"/

Попытайся!

Stratos специализируется на вопросах .

Объяснение:

Код распаковывается к следующему:

f"api.stackexchange.com/questions/%?site=codegolf"r"items"@0
{s"answer_count"
⁰s"score"/

Начиная с первой строки, Стратос оценивает диады справа налево.

f"api.stackexchange.com/questions/%?site=codegolf"r"items"@0означает "оценить диаду @с левым аргументом f"api.stackexchange.com/questions/%?site=codegolf"r"items"и правым аргументом 0. @получает n-й элемент массива JSON.

Чтобы оценить f"api.stackexchange.com/questions/%?site=codegolf"r"items", мы затем оценим диаду rс левым аргументом f"api.stackexchange.com/questions/%?site=codegolf"и правым аргументом "items". rполучает массив JSON с указанным именем.

Далее нам нужно будет оценить f"api.stackexchange.com/questions/%?site=codegolf". Сначала %заменяется на вход. fозначает «получить содержимое этого URL».

Теперь мы можем перейти ко второй строке. Новая строка означает «добавить то, что мы оценили, в список неявных аргументов»

Далее мы оцениваем s(получаем строку в объекте JSON с определенным именем) с помощью {и "answer_count". {берет элемент из стека неявных аргументов, возвращает его и добавляет обратно в стек.

Затем мы добавляем вывод этого в стек неявных аргументов.

Для оценки ⁰s"score"/мы применяем диаду /(деление) ⁰s"score"и элемент из неявного стека аргументов.

Для оценки ⁰s"score"мы получаем строку "score"из объекта JSON из 0-го элемента в стеке имплицитных аргументов.

Теперь вывод /распечатывается и программа завершается.

Okx
источник
Сохраните 4 байта, исключив версию API ( 2.2/).
Лохматый
1
@ Shaggy Не понимаю, что версия API не требуется, спасибо. Не
вычеркивает
5

R + jsonlite , 111 байт

function(n,x=jsonlite::fromJSON(sprintf('http://api.stackexchange.com/questions/%s?site=codegolf',n))$i)x$s/x$a

R-скриптовая ссылка

jsonlite - это хорошая библиотека преобразования JSON <-> R, которая работает довольно хорошо. Я не собирался играть в гольф парсером JSON для R ...

Giuseppe
источник
Вы можете сохранить байт, используя httpпротокол. Кроме того, я предполагаю, 142729что там не должно быть жестко закодировано?
Лохматый
@ Шэгги, хороший звонок, спасибо. Я скопировал и вставил слишком быстро.
Джузеппе
4

T-SQL, 64 54 байта

Редко SQL может побить (большинство) других языков! Вместо URL-адреса API я обратился непосредственно к Обозревателю данных Stack Exchange :

SELECT 1.0*Score/AnswerCount FROM Posts WHERE Id=##i##

Это ##i##не стандартный SQL, это формат Stack Exchange для запроса ввода.

Обратите внимание, что источник проводника данных обновляется только ночью, поэтому значения не являются текущими.

Будет выбрасывать ошибку деления на ноль на вопросы без ответов.

Изменить : 10 байт путем умножения на 1,0 вместо явного CONVERTдля FLOAT.

BradC
источник
может побить других, но не всех :)
Okx
О, Мааан, у меня было другое решение, но я учился в школе, поэтому я так и не опубликовал его ... Не слишком ли похож мой ответ на ваш? Должен ли я удалить мой?
полностью человек
@icrieverytim Ха, да, похоже на тот же запрос, хотя я только что отредактировал свой, чтобы сохранить еще 10 байтов.
BradC
@BradC Я отредактировал свой ответ в ответе Mathematica.
полностью человек
3

PowerShell , 130 байт

($a=(ConvertFrom-Json(iwr("http://api.stackexchange.com/questions/"+$args+"?site=codegolf")).content).items).score/$a.answer_count

Выполняет Invoke- WЕВА REquest против URL, получает .contentих, делает ConvertFrom-Jsonэто содержание, и получает .itemsэтот объект JSON. Сохраняет это $aи вытаскивает .scoreкак числитель. Знаменатель это .answer_count. Это значение остается в конвейере, а вывод неявным.

Если вопрос остается без ответа, это должно привести к ошибке «Делить на ноль».

AdmBorkBork
источник
3

Japt , 83 82 байта

Хотелось попробовать, чтобы посмотреть, как это получится, потому что Джапт не может этого сделать. По сути, все это делает evalсжатую версию моего решения JS . Поскольку Japt - это JS, мы можем потребовать, чтобы он был запущен с корневого уровня api.stackexchange.comи также возвращал Promiseобъект, содержащий результат.

Ox`fet®("quÀËs/{U}?ÐÒ=¬¸golf").È(r=>r.js()).È(i=>(j=i.ems[0]).sÖ/j.s³r_Öt)
  • Посмотреть это
  • Попробуйте - дополнительные байты в этой версии учитываются при включении //api.stackexchange.com/в URL-адреса и, console.logтаким образом, вы можете увидеть, как это работает
мохнатый
источник
1
o0 Почему вы сделали код ссылкой? Это даже портит отображение количества байтов в пользовательском скрипте. i.imgur.com/SO2zgAy.png
полностью человек
2

Mathematica, 124 байта

N@("score"/.(u="items"/.Import["http://api.stackexchange.com/questions/"<>#<>"?site=codegolf","JSON"]))/("answer_count"/.u)&

У Mathematica есть тип данных, который называется, Ruleи это выводит меня из себя. :П

totallyhuman
источник
1

Python 3 + запросы, 149 байт

-1 байт благодаря мистеру Xcoder.

from requests import*
u=get('http://api.stackexchange.com/questions/%s?site=codegolf'%input()).json()['items'][0]
print(u['score']/u['answer_count'])
totallyhuman
источник
Ссылка на Python 2. Кстати, он выдает ошибку как в Python 2, так и в Python 3 (на TIO).
Нет доступа в интернет на TIO упс. Я просто использовал TIO для форматирования ответа.
полностью человек
Я думаю, что (пока) httpдостаточно.
г-н Xcoder
0

PHP, 167 байт

<?$f=json_decode(gzdecode(file_get_contents('https://api.stackexchange.com/2.2/questions/'.$argv[1].'?site=codegolf')))->items[0];echo $f->score/$f->answer_count;

Турбо-быстрый треск на этом. Сохранить как файл и выполнить в терминале так:

php -f file.php 143083

Может быть, способ уменьшить это.

Орфей
источник