Hãy cho tôi một số câu hỏi để trả lời!


15

Giới thiệu

Đôi khi tôi cảm thấy buồn chán và không có câu hỏi mới nào về PPCG, vì vậy tôi muốn bạn đào một câu hỏi ngẫu nhiên từ quá khứ của PPCG.

Thử thách

Đưa ra ID PPCG của người dùng làm đầu vào (ví dụ: ID của tôi là 30525 ), hãy xuất URL của câu hỏi PPCG được chọn ngẫu nhiên. Nếu câu hỏi không đáp ứng các tiêu chí sau, bạn phải chọn một câu hỏi khác cho đến khi nó đáp ứng các tiêu chí:

  • Người hỏi câu hỏi không được là người dùng có ID được nhập vào câu hỏi
  • Câu hỏi chưa được trả lời bởi người dùng có ID đã được nhập vào câu hỏi
  • Câu hỏi không được trả lời: có lẽ nó quá khó
  • Câu hỏi không được có quá 10 câu trả lời: có lẽ quá dễ
  • Câu hỏi phải được gắn thẻ

Quy tắc

Công cụ rút ngắn URL không được phép.

Bạn có thể sử dụng API trao đổi Stack và Explorer Exchange Data Explorer.

Bạn sẽ chỉ được cấp ID người dùng PPCG thực sự.

Trong trường hợp không chắc là không có câu hỏi phù hợp, bạn không phải xuất bất cứ điều gì (hành vi không xác định là ổn).

Thử thách phụ

Mặc dù bạn sẽ không được thưởng thêm điểm, nhưng sẽ được đánh giá cao nếu ai đó thiết kế bookmarklet có thể sử dụng được , khi chạy, đã mở cửa sổ trình duyệt cho câu hỏi PPCG ngẫu nhiên tuân theo các tiêu chí trên. ID người dùng nên được mã hóa trong các chương trình (đối với các bookmarklet chỉ ).

Thử thách

Mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


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

Giải trình:

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

thêm 4 byte cho một phiên bản mở nó trong 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

5

JavaScript (ES6), 333 329 327 323 283 byte

Cần phải được chạy từ trong api.stackexchange.commiền ( meta có liên quan ). Trả về một PromiseURL có chứa ( meta có liên quan ).

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

Thử nó

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

Và đây là một bookmarklet có thể tùy chỉnh, nó sẽ tải một câu hỏi ngẫu nhiên mà bạn chưa trả lời. Để sử dụng nó, chỉ cần thêm dấu trang mới vào thanh công cụ của trình duyệt và thả toàn bộ mã vào trường URL.

Không giống như giải pháp trên, giải pháp này hoạt động với tất cả các câu hỏi trên một trang web do đó có thể chạy chậm (tùy thuộc vào trang web và thẻ) và cũng có thể tốn kém về số lượng truy vấn cần thực hiện đối với API, vì API có thể chỉ trả lại 100 câu hỏi một lúc.

Để tùy chỉnh, thay đổi các biến sau

  • k: Khóa API của bạn - bạn có thể đăng ký một cái ở đây .
  • s: Trang web Stack Exchange mà bạn muốn lấy một câu hỏi cho.
  • i: ID người dùng của bạn trên trang web đó.
  • t: Các thẻ bạn muốn lọc theo. Có 4 tùy chọn có sẵn cho cái này:
    1. "": Một chuỗi rỗng; nếu bạn không muốn lọc theo bất kỳ thẻ nào,
    2. "code-golf;string": Danh sách các thẻ được phân tách bằng dấu hai chấm mà bạn muốn lọc theo,
    3. prompt("Tags:"): Bạn sẽ được nhắc nhập các thẻ bạn muốn lọc theo, hoặc,
    4. prompt("Tags:","code-golf;string"): Bạn sẽ được nhắc nhập các thẻ bạn muốn lọc theo, với một danh sách mặc định được cung cấp.
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
dựa trên câu trả lời về quyền hạn của tôi cho câu hỏi này, việc sử dụng lại các chuỗi cho api.
colsw

Tại thời điểm nào bạn bị cấm vĩnh viễn? ;)
Beta Decay

@BetaDecay, nếu các thách thức API tăng tốc trở lại, tôi có thể sớm tìm ra! : D
Xù xì

Bạn có thể sử dụng mã thông báo api từ đây: stackapps.com/q/7384/45852 để tăng giới hạn tỷ lệ của bạn.
lập trình

1
@BetaDecay, tôi đã có ý định mở rộng nó thành một kịch bản có thể sử dụng được nhưng đã hết thời gian; Tôi sẽ cố gắng trở lại vào ngày mai.
Xù xì
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.