Donnez-moi quelques questions pour répondre!

15

introduction

Parfois je m'ennuie et il n'y a pas de nouvelles questions sur PPCG, donc je veux que vous creusiez une question aléatoire du passé de PPCG.

Défi

Étant donné l'ID PPCG d'un utilisateur en entrée (par exemple, mon ID est 30525 ), affichez l'URL d'une question PPCG choisie au hasard. Si la question ne répond pas aux critères suivants, vous devez choisir une autre question jusqu'à ce qu'elle réponde aux critères:

  • Le demandeur ne doit pas être l'utilisateur dont l'ID a été entré dans la question
  • La question ne doit pas avoir déjà été répondue par l'utilisateur dont l'ID a été entré dans la question
  • La question ne doit pas rester sans réponse: c'est probablement trop difficile
  • La question ne doit pas avoir plus de 10 réponses: c'est probablement trop facile
  • La question doit être étiquetée

Règles

Les raccourcisseurs d'URL sont interdits.

Vous pouvez utiliser l'API Stack Exchange et l'explorateur de données Stack Exchange.

Vous ne recevrez jamais qu'un véritable identifiant d'utilisateur PPCG.

Dans le cas peu probable où il n'y a pas de questions appropriées, vous n'avez rien à produire (un comportement indéfini est correct).

Défi latéral

Bien que vous n'obtiendrez pas de points supplémentaires, il serait apprécié que quelqu'un conçoive un bookmarklet utilisable qui, lorsqu'il est exécuté, ouvre la fenêtre du navigateur à une question PPCG aléatoire qui suit les critères ci-dessus. L'ID utilisateur doit être codé en dur dans le programme (pour le bookmarklet uniquement ).

Défi

Le code le plus court en octets gagne.

Beta Decay
la source

Réponses:

4

PowerShell, 261 octets

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

Explication:

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

ajouter 4 octets pour une version qui l'ouvre dans webbrowser

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
la source
5

JavaScript (ES6), 333 329 327 323 283 octets

Doit être exécuté à partir du api.stackexchange.comdomaine ( méta pertinente ). Renvoie un Promisecontenant l'URL ( méta pertinente ).

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

Essayez-le

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

Et ici, il s'agit d'un bookmarklet personnalisable, qui chargera une question aléatoire à laquelle vous n'avez pas encore répondu. Pour l'utiliser, ajoutez simplement un nouveau signet à la barre d'outils de votre navigateur et déposez le code complet dans le champ URL.

Contrairement à la solution ci-dessus, cela fonctionne avec toutes les questions sur un site, donc il peut être lent à exécuter (en fonction du site et des balises) et peut également coûter cher en nombre de requêtes qu'il doit faire à l'API, comme l'API peut ne renvoyez que 100 questions à la fois.

Pour personnaliser, modifiez les variables suivantes

  • k: Votre clé API - vous pouvez vous inscrire pour un ici .
  • s: Le site Stack Exchange pour lequel vous souhaitez saisir une question.
  • i: Votre identifiant sur ce site.
  • t: Les balises que vous souhaitez filtrer. Il y a 4 options disponibles pour celui-ci:
    1. "": Une chaîne vide; si vous ne souhaitez pas filtrer par balises,
    2. "code-golf;string": Une liste de balises séparées par des points-virgules que vous souhaitez filtrer,
    3. prompt("Tags:"): Vous serez invité à saisir les balises par lesquelles vous souhaitez filtrer, ou,
    4. prompt("Tags:","code-golf;string"): Vous serez invité à saisir les balises par lesquelles vous souhaitez filtrer, avec une liste par défaut fournie.
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)))()
Hirsute
la source
1
basé ma réponse powershell sur celui-ci, belle réutilisation des cordes pour l'api.
colsw
À quel moment êtes-vous banni définitivement? ;)
Beta Decay
@BetaDecay, si les défis de l'API s'accélèrent à nouveau, je pourrais bientôt le découvrir! : D
Shaggy
Vous pouvez utiliser les jetons api à partir d'ici: stackapps.com/q/7384/45852 pour augmenter votre limite de taux.
programmer5000
1
@BetaDecay, j'avais l'intention de l'étendre en un script utilisable mais j'ai manqué de temps; J'essaierai d'y revenir demain.
Shaggy