Відповідь на коефіцієнт голосування


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
піцарі184

@ 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 байти завдяки Шаггі

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

Спробуй це!

Стратос спеціалізується на питаннях .

Пояснення:

Код розгортається до наступного:

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-го елемента в степі аргументів implict.

Тепер вихід /друкується і програма припиняється.


Збережіть 4 байти, викинувши версію API ( 2.2/).
Кудлатий

1
@Shaggy Не зрозумів, що версія API не потрібна, дякую. Не перекреслившись 44: P
Okx

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 ...


Ви можете зберегти байт за допомогою httpпротоколу. Крім того, я здогадуюсь, 142729не слід там бути жорстким кодом?
Кудлатий

@Shaggy гарний дзвінок, дякую Я занадто швидко скопіював і вставив.
Джузеппе

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.


можна обіграти інших, але не всіх :)
Okx

О, Мааан, у мене було інше рішення, але я був у школі, тому я ніколи не закінчував його публікацією ... Чи моя відповідь занадто схожа на вашу? Чи слід видалити шахту?
повністюлюдський

@icrieverytim Ha, так, схоже, майже той самий запит, хоча я тільки що відредагував шахту, щоб зберегти ще 10 байт.
BradC

@BradC Я змінив свою відповідь у відповідь Mathematica lol.
повністюлюдський

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. Це значення залишене на конвеєрі, а вихід неявний.

Якщо питання без відповіді, це повинно призвести до помилки "Поділити на нуль".


3

Japt , 83 82 байт

Хотів спробувати це спробувати побачити, як це вийде, бачачи, як Japt не зможе цього зробити. По суті, все це робить - 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

Математика, 124 байти

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

Математика має тип даних, який називається, Ruleі це плутає чорт у мене. : P


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'])

Посилання на Python 2. Btw, воно видає помилку як у 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

Це може бути способом зменшити це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.