Beri aku beberapa pertanyaan untuk dijawab!

15

pengantar

Terkadang saya bosan dan tidak ada pertanyaan baru di PPCG, jadi saya ingin Anda menggali pertanyaan acak dari masa lalu PPCG.

Tantangan

Diberikan ID PPCG pengguna sebagai input (mis. ID saya 30525 ), mengeluarkan URL pertanyaan PPCG yang dipilih secara acak. Jika pertanyaan tidak memenuhi kriteria berikut, Anda harus memilih pertanyaan lain sampai memenuhi kriteria:

  • Penanya pertanyaan tidak boleh pengguna yang IDnya dimasukkan ke pertanyaan
  • Pertanyaan harus belum dijawab oleh pengguna yang IDnya dimasukkan ke pertanyaan
  • Pertanyaannya jangan sampai tidak dijawab: mungkin terlalu sulit
  • Pertanyaannya tidak boleh memiliki lebih dari 10 jawaban: itu mungkin terlalu mudah
  • Pertanyaan harus ditandai dengan

Aturan

Penyingkat URL tidak diizinkan.

Anda dapat menggunakan Stack Exchange API dan Stack Exchange Data Explorer.

Anda hanya akan diberikan ID pengguna PPCG sungguhan.

Jika tidak ada pertanyaan yang cocok, Anda tidak perlu mengeluarkan apa pun (perilaku yang tidak jelas baik-baik saja).

Tantangan Samping

Meskipun Anda tidak akan diberikan poin tambahan, akan sangat dihargai jika seseorang merancang bookmarklet yang dapat digunakan yang, ketika dijalankan, membuka jendela browser ke pertanyaan PPCG acak yang mengikuti kriteria di atas. ID pengguna harus dibuat secara manual ke dalam program (untuk bookmarklet hanya ).

Tantangan

Kode terpendek dalam byte menang.

Peluruhan Beta
sumber

Jawaban:

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

Penjelasan:

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

tambahkan 4 byte untuk versi yang membukanya di 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
sumber
5

JavaScript (ES6), 333 329 327 323 283 byte

Perlu dijalankan dari dalam api.stackexchange.comdomain ( meta yang relevan ). Mengembalikan yang Promiseberisi URL ( meta yang relevan ).

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

Cobalah

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

Dan ini dia sebagai bookmarklet yang dapat disesuaikan, yang akan memuat pertanyaan acak yang belum Anda jawab. Untuk menggunakannya, cukup tambahkan bookmark baru ke bilah alat browser Anda dan masukkan kode lengkap ke dalam bidang URL.

Tidak seperti solusi di atas, ini bekerja dengan semua pertanyaan di situs karena itu mungkin lambat untuk berjalan (tergantung pada situs dan tag) dan juga bisa mahal dalam jumlah pertanyaan yang perlu dibuat ke API, karena API dapat hanya mengembalikan 100 pertanyaan sekaligus.

Untuk menyesuaikan, ubah variabel berikut

  • k: Kunci API Anda - Anda dapat mendaftarkannya di sini .
  • s: Situs Stack Exchange yang ingin Anda ajukan pertanyaan.
  • i: ID pengguna Anda di situs itu.
  • t: Tag yang ingin Anda filter. Ada 4 opsi yang tersedia untuk ini:
    1. "": Sebuah string kosong; jika Anda tidak ingin memfilter dengan tag apa pun,
    2. "code-golf;string": Daftar tag yang dipisahkan tanda titik koma yang ingin Anda filter,
    3. prompt("Tags:"): Anda akan diminta memasukkan tag yang ingin Anda filter, atau,
    4. prompt("Tags:","code-golf;string"): Anda akan diminta untuk memasukkan tag yang ingin Anda filter, dengan daftar default yang disediakan.
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)))()
Shaggy
sumber
1
berdasarkan jawaban powershell saya yang satu ini, penggunaan kembali string yang bagus untuk api.
colsw
Pada titik mana Anda dilarang secara permanen? ;)
Beta Decay
@BetaDecay, jika tantangan API meningkat lagi, saya mungkin segera mengetahuinya! : D
Shaggy
Anda dapat menggunakan token api dari sini: stackapps.com/q/7384/45852 untuk meningkatkan batas nilai Anda.
programmer5000
1
@ BetaDecay, saya memang berniat mengembangkannya menjadi skrip yang dapat digunakan tetapi kehabisan waktu; Saya akan mencoba kembali lagi besok.
Shaggy