Daj mi kilka pytań, na które odpowiem!

15

Wprowadzenie

Czasami się nudzę i nie ma nowych pytań na temat PPCG, więc chcę, żebyś wybrał przypadkowe pytanie z przeszłości PPCG.

Wyzwanie

Biorąc pod uwagę identyfikator PPCG użytkownika jako dane wejściowe (np. Mój identyfikator to 30525 ), wyślij adres URL losowo wybranego pytania PPCG. Jeśli pytanie nie spełnia następujących kryteriów, musisz wybrać inne pytanie, dopóki nie spełni kryteriów:

  • Pytający nie może być użytkownikiem, którego identyfikator został wprowadzony do pytania
  • Użytkownik nie może już odpowiedzieć na pytanie, którego identyfikator został wprowadzony do pytania
  • Na pytanie nie można odpowiedzieć bez odpowiedzi: prawdopodobnie jest to zbyt trudne
  • Pytanie nie może zawierać więcej niż 10 odpowiedzi: prawdopodobnie jest to zbyt łatwe
  • Pytanie musi być oznaczone

Zasady

Skracacze URL są niedozwolone.

Możesz użyć interfejsu API Stack Exchange i Eksploratora danych Stack Exchange.

Otrzymasz tylko prawdziwy identyfikator użytkownika PPCG.

W mało prawdopodobnym przypadku, gdy nie ma odpowiednich pytań, nie musisz nic wypisywać (niezdefiniowane zachowanie jest w porządku).

Wyzwanie poboczne

Chociaż nie otrzymasz dodatkowych punktów, byłoby mile widziane, gdyby ktoś zaprojektował użyteczną bookmarklet, który po uruchomieniu otworzył okno przeglądarki na losowe pytanie PPCG, które spełnia powyższe kryteria. Identyfikator użytkownika powinien być ustalony w programie (dla bookmarklet tylko ).

Wyzwanie

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło

Odpowiedzi:

4

PowerShell, 261 bajtów

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

Wyjaśnienie:

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

dodaj 4 bajty dla wersji, która otwiera go w przeglądarce

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
źródło
5

JavaScript (ES6), 333 329 327 323 283 bajtów

Musi być uruchamiany z poziomu api.stackexchange.comdomeny ( odpowiednie meta ). Zwraca wartość Promisezawierającą adres URL ( odpowiedni 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

Spróbuj

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

A tutaj jest to bookmarklet z możliwością dostosowania, który załaduje losowe pytanie, na które jeszcze nie ma odpowiedzi. Aby z niego skorzystać, po prostu dodaj nową zakładkę do paska narzędzi przeglądarki i upuść pełny kod w polu adresu URL.

W przeciwieństwie do powyższego rozwiązania, działa to ze wszystkimi pytaniami w witrynie, dlatego jego uruchomienie może być powolne (w zależności od witryny i tagów), a także może być kosztowne pod względem liczby zapytań do interfejsu API, ponieważ interfejs API może zwracaj tylko 100 pytań na raz.

Aby dostosować, zmień następujące zmienne

  • k: Twój klucz API - można zarejestrować się do jednego tutaj .
  • s: Witryna wymiany stosu, dla której chcesz pobrać pytanie.
  • i: Twój identyfikator użytkownika w tej witrynie.
  • t: Tagi, według których chcesz filtrować. Dostępne są 4 opcje dla tego:
    1. "": Pusty ciąg znaków; jeśli nie chcesz filtrować według żadnych tagów,
    2. "code-golf;string": Lista tagów oddzielona średnikami, według których chcesz filtrować,
    3. prompt("Tags:"): Zostaniesz poproszony o wprowadzenie tagów, które chcesz filtrować, lub,
    4. prompt("Tags:","code-golf;string"): Zostaniesz poproszony o wprowadzenie tagów, według których chcesz filtrować, z domyślną listą.
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)))()
Kudłaty
źródło
1
oparłem moją odpowiedź PowerShell na tym jednym, miłym ponownym użyciu ciągów dla interfejsu API.
colsw
W którym momencie zostajesz zbanowany na stałe? ;)
Rozpad Beta
@BetaDecay, jeśli wyzwania API ponownie przyspieszą, wkrótce się dowiem! : D
Kudłaty
Możesz użyć tokenów API tutaj: stackapps.com/q/7384/45852, aby zwiększyć limit stawek.
programator5000
1
@BetaDecay, miałem zamiar rozwinąć go do użytecznego skryptu, ale zabrakło mi czasu; Spróbuję wrócić do tego jutro.
Kudłaty