Gib mir ein paar Fragen zu beantworten!

15

Einführung

Manchmal langweile ich mich und es gibt keine neuen Fragen zu PPCG. Deshalb möchte ich, dass Sie eine zufällige Frage aus der Vergangenheit von PPCG herausgreifen.

Herausforderung

Wenn Sie die PPCG-ID eines Benutzers als Eingabe angegeben haben (z. B. meine ID ist 30525 ), geben Sie die URL einer zufällig ausgewählten PPCG-Frage aus. Wenn die Frage die folgenden Kriterien nicht erfüllt, müssen Sie eine andere Frage auswählen, bis sie die Kriterien erfüllt:

  • Der Fragesteller darf nicht der Benutzer sein, dessen ID in die Frage eingegeben wurde
  • Die Frage darf nicht bereits von dem Benutzer beantwortet worden sein, dessen ID in die Frage eingegeben wurde
  • Die Frage darf nicht unbeantwortet bleiben: Es ist wahrscheinlich zu schwer
  • Die Frage darf nicht mehr als 10 Antworten haben: Es ist wahrscheinlich zu einfach
  • Die Frage muss mit

Regeln

URL-Kürzungen sind nicht zulässig.

Sie können die Stack Exchange-API und den Stack Exchange-Datenexplorer verwenden.

Sie erhalten immer nur eine echte PPCG-Benutzer-ID.

In dem unwahrscheinlichen Fall, dass es keine geeigneten Fragen gibt, müssen Sie nichts ausgeben (undefiniertes Verhalten ist in Ordnung).

Nebenherausforderung

Obwohl Sie keine Extrapunkte erhalten, wäre es hilfreich, wenn jemand ein verwendbares Lesezeichen entwerfen würde, das beim Ausführen das Browserfenster für eine zufällige PPCG-Frage öffnet, die den obigen Kriterien entspricht. Die Benutzer - ID sollte in einem Programm fest einprogrammiert wird (für das Bookmarklet nur ).

Herausforderung

Der kürzeste Code in Bytes gewinnt.

Beta-Zerfall
quelle

Antworten:

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

Erläuterung:

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

addiere 4 Bytes für eine Version, die es im Webbrowser öffnet

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

JavaScript (ES6), 333 329 327 323 283 Byte

Muss innerhalb der api.stackexchange.comDomain ausgeführt werden ( relevantes Meta ). Liefert eine Promisemit der URL ( relevantes Meta ).

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

Versuch es

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>


Lesezeichen

Und hier handelt es sich um ein anpassbares Lesezeichen, das eine zufällige Frage lädt, die Sie noch nicht beantwortet haben. Fügen Sie dazu einfach ein neues Lesezeichen in die Symbolleiste Ihres Browsers ein und fügen Sie den vollständigen Code in das URL-Feld ein.

Im Gegensatz zur obigen Lösung funktioniert dies bei allen Fragen auf einer Site. Daher kann die Ausführung langsam sein (abhängig von der Site und den Tags) und die Anzahl der Abfragen, die an die API gestellt werden müssen, kann teuer sein, wie dies bei der API der Fall ist Es werden jeweils nur 100 Fragen zurückgegeben.

Ändern Sie zum Anpassen die folgenden Variablen

  • k: Ihr API - Schlüssel - können Sie sich für eine registrieren hier .
  • s: Die Stack Exchange-Site, für die Sie eine Frage stellen möchten.
  • i: Ihre Benutzer-ID auf dieser Site.
  • t: Die Tags, nach denen Sie filtern möchten. Hierfür gibt es 4 Möglichkeiten:
    1. "": Eine leere Zeichenfolge; Wenn Sie nicht nach Tags filtern möchten,
    2. "code-golf;string": Eine durch Semikolon getrennte Liste von Tags, nach denen Sie filtern möchten,
    3. prompt("Tags:"): Sie werden aufgefordert, die Tags einzugeben, nach denen Sie filtern möchten, oder
    4. prompt("Tags:","code-golf;string"): Sie werden aufgefordert, die Tags einzugeben, nach denen Sie filtern möchten, wobei eine Standardliste bereitgestellt wird.
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)))()
Zottelig
quelle
1
Basierte meine Powershell-Antwort auf dieser, nette Wiederverwendung der Saiten für die API.
Colsw
Wann wirst du dauerhaft gesperrt? ;)
Beta Decay
@BetaDecay, wenn die API-Herausforderungen wieder schneller werden, werde ich es vielleicht bald herausfinden! : D
Shaggy
Sie können die API-Token von hier aus verwenden: stackapps.com/q/7384/45852 , um Ihr Ratenlimit zu erhöhen.
programmer5000
1
@BetaDecay, ich hatte vor, es zu einem brauchbaren Skript zu erweitern, aber mir ging die Zeit davon; Ich werde versuchen, morgen darauf zurückzukommen.
Shaggy