Дайте мне несколько вопросов, чтобы ответить!

15

Вступление

Иногда мне становится скучно, и нет новых вопросов по PPCG, поэтому я хочу, чтобы вы нашли случайный вопрос из прошлого PPCG.

Вызов

Если в качестве входных данных указан идентификатор пользователя PPCG (например, мой идентификатор 30525 ), выведите URL-адрес случайно выбранного вопроса PPCG. Если вопрос не соответствует следующим критериям, вы должны выбрать другой вопрос, пока он не будет соответствовать критериям:

  • Запрашивающий вопрос не должен быть пользователем, чей ID был введен в вопрос
  • Пользователь не должен был ответить на вопрос, чей ID был введен в вопрос.
  • Вопрос не должен оставаться без ответа: это, вероятно, слишком сложно
  • На вопрос не должно быть более 10 ответов: возможно, это слишком просто
  • Вопрос должен быть помечен

правила

Сокращения URL запрещены.

Вы можете использовать API стека Exchange и Проводник данных стека Exchange.

Вам будет предоставлен только реальный идентификатор пользователя PPCG.

В маловероятном случае, когда нет подходящих вопросов, вам не нужно ничего выводить (неопределенное поведение подходит).

Side Challenge

Хотя вам не будут начисляться дополнительные баллы, было бы полезно, если бы кто-то разработал пригодный для использования букмарклет, который при запуске открыл окно браузера для случайного вопроса 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
colsw
источник
5

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

Необходимо запустить изнутри api.stackexchange.comдомена ( соответствующая мета ). Возвращает Promiseсодержащий 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>


Bookmarklet

И здесь это настраиваемый букмарклет, который будет загружать случайный вопрос, на который вам еще предстоит ответить. Чтобы использовать его, просто добавьте новую закладку на панель инструментов своего браузера и поместите полный код в поле 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
основанный на моем ответе PowerShell на этот, хорошее повторное использование строк для API.
colsw
В какой момент вас забанят навсегда? ;)
Beta Decay
@ BetaDecay, если вызовы API снова наберут темп, я скоро узнаю! : D
Лохматый
Вы можете использовать токены API здесь: stackapps.com/q/7384/45852, чтобы увеличить ограничение скорости.
programmer5000
1
@BetaDecay, я намеревался расширить его до пригодного для использования сценария, но не хватило времени; Я постараюсь вернуться к нему завтра.
Лохматый