Дайте мені кілька запитань, щоб відповісти!


15

Вступ

Іноді мені нудно і нових питань щодо PPCG немає, тому я хочу, щоб ви копали випадкове запитання з минулого PPCG.

Виклик

Враховуючи ідентифікатор PPCG користувача (наприклад, мій ідентифікатор - 30525 ), виведіть URL випадково вибраного питання PPCG. Якщо питання не відповідає наступним критеріям, потрібно вибрати інше питання, поки воно не відповідає критеріям:

  • Автор запитання не повинен бути тим користувачем, чий ідентифікатор був введений до питання
  • На питання не повинен відповісти той користувач, чий ідентифікатор був внесений у запитання
  • Питання не повинно бути без відповіді: це, мабуть, занадто важко
  • На запитання не повинно бути більше 10 відповідей: це, мабуть, занадто просто
  • Питання повинно бути позначене

Правила

Скорочувачі URL-адрес заборонені.

Ви можете використовувати API Stack Exchange та Провідник даних Stack Exchange.

Вам буде надано лише справжній ідентифікатор користувача PPCG.

У тому випадку, коли немає відповідних питань, вам нічого не доведеться (невизначена поведінка - це нормально).

Бічний виклик

Хоча додаткові бали вам не нараховують, було б вдячно, якби хтось розробив корисну закладку, яка під час запуску відкрила вікно браузера на випадкове запитання PPCG, яке відповідає вищевказаним критеріям. Ідентифікатор користувача повинен бути зашитий в програму (для букмарклета тільки ).

Виклик

Виграє найкоротший код у байтах.

Відповіді:


4

PowerShell, 261 байт

param($i)$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf"))
do{$t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random}while((irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i)
$t.link

Пояснення:

param($i)
$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf")) #run this query
do{ #until we find a valid question, get a random one that fits the basic specs
    $t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random
}while( #Get all of the answers, and their owners into an array, check it doens't contain the provided id
(irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i
)
$t.link #output the question link

додати 4 байти для версії, яка відкриває його в веб-браузері

param($i)$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf"))
do{$t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random}while((irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i)
saps $t.link

5

JavaScript (ES6), 333 329 327 323 283 байт

Потрібно запускатись із api.stackexchange.comдомену ( відповідна мета ). Повертає PromiseURL-адресу, що містить URL ( відповідна мета ).

f=async i=>await(u="/questions/",s="?tagged=code-golf&site=codegolf",q=await(await(await fetch(u+s)).json()).items.filter(x=>x.owner.user_id!=i&x.answer_count<11).sort(_=>.5-Math.random())[0],await(await fetch(u+q.question_id+s)).json()).items.some(x=>x.owner.user_id==i)?f(i):q.link

Спробуй це

f=async i=>await(u="//api.stackexchange.com/questions/",s="?tagged=code-golf&site=codegolf",q=await(await(await fetch(u+s)).json()).items.filter(x=>x.owner.user_id!=i&x.answer_count<11).sort(_=>.5-Math.random())[0],await(await fetch(u+q.question_id+s)).json()).items.some(x=>x.owner.user_id==i)?f(i):q.link
k.previousSibling.value=58974 // me
k.onclick=_=>f(+k.previousSibling.value).then(p=>k.nextSibling.innerText=p)
<input type=number><button id=k>Fetch</button><pre>


Закладка

І ось це як налаштована закладка, яка завантажить випадкове запитання, на яке ви ще повинні відповісти. Щоб скористатися нею, просто додайте нову закладку на панель інструментів веб-переглядача та вкажіть повний код у поле URL.

На відміну від вищезазначеного рішення, це працює з усіма питаннями на сайті, тому його запуск може бути повільним (залежно від сайту та тегів), а також може бути дорогим у кількості запитів, які йому потрібно внести до API, оскільки API може повертайте одночасно 100 запитань.

Щоб налаштувати, змініть наступні змінні

  • k: Ваш ключ API - його можна зареєструвати тут .
  • s: Сайт Stack Exchange, до якого потрібно захопити питання.
  • i: Ваш ідентифікатор користувача на цьому веб-сайті.
  • t: Теги, за якими потрібно відфільтрувати. Для цього доступні 4 варіанти:
    1. "": Порожній рядок; якщо ви не хочете фільтрувати за якимись тегами,
    2. "code-golf;string": Список розділених напівкрапкою тегів, за якими потрібно відфільтрувати,
    3. prompt("Tags:"): Вам буде запропоновано ввести теги, за якими потрібно відфільтрувати, або,
    4. prompt("Tags:","code-golf;string"): Вам буде запропоновано ввести теги, за якими потрібно відфільтрувати, із зазначенням списку за замовчуванням.
javascript:(f=(

/* See /codegolf//a/122400/58974 for documenation */
k="",
s="codegolf",
i=58974,
t="code-golf",

p=1,q=[],r=1)=>fetch((u="//api.stackexchange.com/questions/")+(d=`?key=${k}&tagged=${t}&site=`+s)+`&page=${p}&pagesize=100`).then(r=>r.json()).then(j=>r&&(q=[...q,...j.items.filter(x=>x.owner.user_id!=i&(a=x.answer_count)&a<11)])^j.has_more?f(i,k,s,t,p+1,q,1):q.sort(_=>.5-Math.random())[0]).then(y=>fetch(u+y.question_id+"/answers"+d).then(r=>r.json()).then(j=>j.items.some(x=>x.owner.user_id==i)?f(i,k,s,t,q,0):window.location=y.link)))()

1
на основі моєї відповіді на це було повною мірою повторне використання рядків для api.
colsw

У який момент вас постійно забороняють? ;)
Бета-розпад

@BetaDecay, якщо проблеми з API знову наберуть темп, я, можливо, незабаром дізнаюся! : D
Кудлатий

Ви можете використовувати маркери api тут: stackapps.com/q/7384/45852, щоб збільшити ліміт тарифу.
програміст5000

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