¡Dame algunas preguntas para responder!

15

Introducción

A veces me aburro y no hay nuevas preguntas sobre PPCG, por lo que quiero que hagas una pregunta al azar del pasado de PPCG.

Desafío

Dada la ID PPCG de un usuario como entrada (por ejemplo, mi ID es 30525 ), genera la URL de una pregunta PPCG elegida al azar. Si la pregunta no cumple con los siguientes criterios, debe elegir otra pregunta hasta que cumpla con los criterios:

  • El que hace la pregunta no debe ser el usuario cuyo ID se ingresó a la pregunta
  • La pregunta ya no debe haber sido respondida por el usuario cuya ID fue ingresada a la pregunta
  • La pregunta no debe quedar sin respuesta: probablemente sea demasiado difícil
  • La pregunta no debe tener más de 10 respuestas: probablemente sea demasiado fácil
  • La pregunta debe ser etiquetada

Reglas

Los acortadores de URL no están permitidos.

Puede usar la API de Stack Exchange y el Explorador de datos de Stack Exchange.

Solo se le dará una identificación de usuario PPCG real.

En el caso improbable de que no haya preguntas adecuadas, no tiene que mostrar nada (el comportamiento indefinido está bien).

Desafío lateral

Aunque no se le otorgarán puntos adicionales, se agradecería que alguien diseñara un marcador utilizable que, cuando se ejecuta, abre la ventana del navegador a una pregunta PPCG aleatoria que sigue los criterios anteriores. El ID de usuario debe ser codificado en el programa (por el bookmarklet solamente ).

Desafío

El código más corto en bytes gana.

Decaimiento Beta
fuente

Respuestas:

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

Explicación:

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

agregue 4 bytes para una versión que lo abra en el navegador 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
fuente
5

JavaScript (ES6), 333 329 327 323 283 bytes

Debe ejecutarse desde dentro del api.stackexchange.comdominio ( meta relevante ). Devuelve un que Promisecontiene la 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

Intentalo

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

Y aquí está como un marcador personalizable, que cargará una pregunta aleatoria que aún no has respondido. Para usarlo, simplemente agregue un nuevo marcador a la barra de herramientas de su navegador y suelte el código completo en el campo URL.

A diferencia de la solución anterior, esto funciona con todas las preguntas en un sitio, por lo tanto, puede ser lento de ejecutar (dependiendo del sitio y las etiquetas) y también podría ser costoso en la cantidad de consultas que necesita hacer a la API, ya que la API puede solo devuelve 100 preguntas a la vez.

Para personalizar, cambie las siguientes variables

  • k: Su clave API - puede registrarse para obtener una aquí .
  • s: El sitio de Stack Exchange para el que desea obtener una pregunta.
  • i: Su ID de usuario en ese sitio.
  • t: Las etiquetas por las que desea filtrar. Hay 4 opciones disponibles para este:
    1. "": Una cadena vacía; si no quieres filtrar por ninguna etiqueta,
    2. "code-golf;string": Una lista de etiquetas separadas por punto y coma por las que desea filtrar,
    3. prompt("Tags:"): Se le pedirá que ingrese las etiquetas por las que desea filtrar, o,
    4. prompt("Tags:","code-golf;string"): Se le pedirá que ingrese las etiquetas por las que desea filtrar, con una lista predeterminada proporcionada.
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)))()
Lanudo
fuente
1
basé mi respuesta de PowerShell en esta, buena reutilización de las cadenas para la API.
colsw
¿En qué punto te expulsan de forma permanente? ;)
Beta Decay
@BetaDecay, si los desafíos de la API vuelven a acelerar, ¡pronto lo descubriré! : D
Shaggy
Puede usar los tokens api desde aquí: stackapps.com/q/7384/45852 para aumentar su límite de velocidad.
programador
1
@BetaDecay, tenía la intención de expandirlo en un script utilizable pero se me acabó el tiempo; Intentaré volver a eso mañana.
Shaggy