Dê-me algumas perguntas para responder!

15

Introdução

Às vezes fico entediado e não há novas perguntas sobre o PPCG, então quero que você faça uma pergunta aleatória do passado do PPCG.

Desafio

Dado o ID PPCG de um usuário como entrada (por exemplo, meu ID é 30525 ), imprima o URL de uma pergunta PPCG escolhida aleatoriamente. Se a pergunta não atender aos seguintes critérios, você deverá escolher outra pergunta até que ela atenda aos critérios:

  • O solicitante da pergunta não deve ser o usuário cujo ID foi inserido na pergunta
  • A pergunta ainda não deve ter sido respondida pelo usuário cujo ID foi inserido na pergunta.
  • A questão não deve ser respondida: provavelmente é muito difícil
  • A pergunta não deve ter mais de 10 respostas: provavelmente é muito fácil
  • A pergunta deve ser marcada como

Regras

Os encurtadores de URL não são permitidos.

Você pode usar a API do Stack Exchange e o Stack Exchange Data Explorer.

Você receberá apenas um ID de usuário PPCG real.

No caso improvável de não haver perguntas adequadas, você não precisa produzir nada (o comportamento indefinido é bom).

Side Challenge

Embora você não receba pontos extras, seria apreciado se alguém projetasse um bookmarklet utilizável que, quando executado, abriu a janela do navegador para uma pergunta aleatória do PPCG que segue os critérios acima. O ID do usuário deve ser codificado no programa (para o bookmarklet única ).

Desafio

O código mais curto em bytes vence.

Beta Decay
fonte

Respostas:

4

PowerShell, 261 bytes

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

Explicação:

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

adicione 4 bytes para uma versão que a abre no navegador da web

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
fonte
5

JavaScript (ES6), 333 329 327 323 283 bytes

Precisa ser executado dentro do api.stackexchange.comdomínio ( meta relevante ). Retorna um Promisecontendo o URL ( meta relevante ).

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

Tente

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

E aqui está como um bookmarklet personalizável, que carregará uma pergunta aleatória que você ainda não respondeu. Para usá-lo, basta adicionar um novo marcador à barra de ferramentas do navegador e soltar o código completo no campo URL.

Ao contrário da solução acima, isso funciona com todas as perguntas em um site, portanto, pode ser lento para executar (dependendo do site e das tags) e também pode ser caro no número de consultas que ele precisa fazer na API, pois ela pode retorne apenas 100 perguntas por vez.

Para personalizar, altere as seguintes variáveis

  • k: Sua chave de API - você pode se registrar para uma aqui .
  • s: O site do Stack Exchange para o qual você deseja fazer uma pergunta.
  • i: Seu ID de usuário nesse site.
  • t: As tags pelas quais você deseja filtrar. Existem 4 opções disponíveis para este:
    1. "": Uma string vazia; se você não deseja filtrar por nenhuma tag,
    2. "code-golf;string": Uma lista separada por ponto e vírgula de tags pelas quais você deseja filtrar,
    3. prompt("Tags:"): Você será solicitado a inserir as tags pelas quais deseja filtrar ou,
    4. prompt("Tags:","code-golf;string"): Você será solicitado a inserir as tags pelas quais deseja filtrar, com uma lista padrão fornecida.
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)))()
Shaggy
fonte
1
baseiei a resposta do meu powershell nesta, boa reutilização das strings para a API.
colsw
Em que ponto você é banido permanentemente? ;)
Decay Beta
@BetaDecay, se os desafios da API acelerarem novamente, em breve descobriremos! : D
Shaggy
Você pode usar os tokens de API aqui: stackapps.com/q/7384/45852 para aumentar seu limite de taxa.
Programmer5000 #:
1
@BetaDecay, pretendia expandi-lo para um script utilizável, mas o tempo acabou; Vou tentar voltar amanhã.
Shaggy