Dammi alcune domande a cui rispondere!


15

introduzione

A volte mi annoio e non ci sono nuove domande su PPCG, quindi voglio che scavi una domanda a caso dal passato di PPCG.

Sfida

Dato l'ID PPCG di un utente come input (ad esempio, il mio ID è 30525 ), genera l'URL di una domanda PPCG scelta casualmente. Se la domanda non soddisfa i seguenti criteri, è necessario scegliere un'altra domanda fino a quando non soddisfa i criteri:

  • Il richiedente non deve essere l'utente il cui ID è stato inserito nella domanda
  • La domanda non deve essere già stata risolta dall'utente il cui ID è stato inserito nella domanda
  • La domanda non deve essere senza risposta: probabilmente è troppo difficile
  • La domanda non deve avere più di 10 risposte: probabilmente è troppo facile
  • La domanda deve essere taggata

Regole

Gli accorciatori di URL non sono consentiti.

È possibile utilizzare l'API Stack Exchange e Explorer Explorer dati Stack Stack.

Ti verrà mai dato un vero ID utente PPCG.

Nel caso improbabile che non vi siano domande adeguate, non è necessario produrre nulla (il comportamento indefinito va bene).

Side Challenge

Anche se non ti verranno assegnati punti extra, sarebbe gradito se qualcuno avesse progettato un bookmarklet utilizzabile che, una volta eseguito, apriva la finestra del browser a una domanda PPCG casuale che segue i criteri di cui sopra. L'ID utente deve essere insita nel programma (per il bookmarklet unica ).

Sfida

Vince il codice più breve in byte.

Risposte:


4

PowerShell, 261 byte

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

Spiegazione:

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

aggiungere 4 byte per una versione che lo apre nel browser 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

5

JavaScript (ES6), 333 329 327 323 283 byte

Deve essere eseguito all'interno del api.stackexchange.comdominio ( meta rilevante ). Restituisce un PromiseURL contenente ( meta rilevante ).

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

Provalo

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

Ed ecco come un bookmarklet personalizzabile, che caricherà una domanda casuale a cui non hai ancora risposto. Per usarlo, basta aggiungere un nuovo segnalibro alla barra degli strumenti del browser e rilasciare il codice completo nel campo URL.

A differenza della soluzione di cui sopra, funziona con tutte le domande su un sito, pertanto potrebbe essere lento (a seconda del sito e dei tag) e potrebbe anche essere costoso nel numero di query che deve fare all'API, poiché l'API può restituire solo 100 domande alla volta.

Per personalizzare, modificare le seguenti variabili

  • k: La tua chiave API: puoi registrarne una qui .
  • s: Il sito Stack Exchange per il quale desideri rispondere a una domanda.
  • i: Il tuo ID utente su quel sito.
  • t: I tag per cui si desidera filtrare. Ci sono 4 opzioni disponibili per questo:
    1. "": Una stringa vuota; se non vuoi filtrare per tag,
    2. "code-golf;string": Un elenco separato da punti e virgola di tag da filtrare,
    3. prompt("Tags:"): Ti verrà richiesto di inserire i tag che desideri filtrare per, o,
    4. prompt("Tags:","code-golf;string"): Ti verrà richiesto di inserire i tag per i quali vuoi filtrare, con un elenco predefinito fornito.
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
basato la mia risposta PowerShell su questo, buon riutilizzo delle stringhe per l'API.
Colsw,

A che punto vieni bandito in modo permanente? ;)
Beta Decay

@BetaDecay, se le sfide dell'API riprendono ritmo, potrei presto scoprirlo! : D
Shaggy,

Puoi utilizzare i token API da qui: stackapps.com/q/7384/45852 per aumentare il limite di velocità.
programmatore

1
@BetaDecay, avevo intenzione di espanderlo in uno script utilizzabile, ma ho finito il tempo; Proverò a tornarci domani.
Shaggy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.