ตอบคำถามให้ฉันหน่อย!


15

บทนำ

บางครั้งฉันเบื่อและไม่มีคำถามใหม่เกี่ยวกับ PPCG ดังนั้นฉันต้องการให้คุณขุดคำถามแบบสุ่มจากอดีตของ PPCG

ท้าทาย

รับรหัส PPCG ของผู้ใช้เป็นอินพุต (เช่น ID ของฉันคือ30525 ) ส่งออก URL ของคำถาม PPCG ที่เลือกแบบสุ่ม หากคำถามไม่ตรงตามเกณฑ์ต่อไปนี้คุณต้องเลือกคำถามอื่นจนกว่าจะเป็นไปตามเกณฑ์:

  • ผู้ถามคำถามต้องไม่เป็นผู้ใช้ที่มีการป้อน ID ให้กับคำถาม
  • คำถามต้องไม่ได้รับคำตอบจากผู้ใช้ที่มี ID ถูกป้อนเข้ากับคำถาม
  • คำถามต้องไม่ได้รับการตอบ: อาจยากเกินไป
  • คำถามต้องมีคำตอบไม่เกิน 10 ข้อ: อาจเป็นเรื่องง่ายเกินไป
  • คำถามจะต้องติดแท็ก

กฎระเบียบ

ตัวย่อ URL ไม่ได้รับอนุญาต

คุณสามารถใช้ Stack Exchange API และ Stack Exchange Data Explorer

คุณจะได้รับ ID ผู้ใช้ PPCG ที่แท้จริงเท่านั้น

ในเหตุการณ์ที่ไม่น่าเป็นไปได้ที่ไม่มีคำถามที่เหมาะสมคุณไม่จำเป็นต้องแสดงผลลัพธ์ใด ๆ (พฤติกรรมที่ไม่ได้กำหนดเป็นสิ่งที่ดี)

ท้าทายด้าน

แม้ว่าคุณจะไม่ได้รับคะแนนพิเศษ แต่ก็จะได้รับการชื่นชมถ้ามีคนออกแบบbookmarklet ที่ใช้งานได้ซึ่งเมื่อเปิดใช้งานจะเปิดหน้าต่างเบราว์เซอร์เป็นคำถาม PPCG แบบสุ่มที่เป็นไปตามเกณฑ์ด้านบน ID ผู้ใช้ควรจะฮาร์ดโค้ดลงในโปรแกรม (สำหรับ bookmarklet เท่านั้น )

ท้าทาย

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


4

PowerShell, 261 ไบต์

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

คำอธิบาย:

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

เพิ่ม 4 ไบต์สำหรับรุ่นที่เปิดในเว็บเบราว์เซอร์

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 ไบต์

จำเป็นต้องเรียกใช้จากภายในapi.stackexchange.comโดเมน ( เมตาที่เกี่ยวข้อง ) ส่งคืนPromiseURL ที่มี ( เมตาที่เกี่ยวข้อง )

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

ลองมัน

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

และที่นี่เป็นเหมือน bookmarklet ที่ปรับแต่งได้ซึ่งจะโหลดคำถามแบบสุ่มที่คุณยังไม่ได้ตอบ หากต้องการใช้งานเพียงเพิ่มบุ๊คมาร์คใหม่ไปยังแถบเครื่องมือของเบราว์เซอร์และวางรหัสเต็มลงในช่อง URL

แตกต่างจากโซลูชันด้านบนการทำงานกับคำถามทั้งหมดในไซต์ดังนั้นจึงอาจทำงานช้า (ขึ้นอยู่กับไซต์และแท็ก) และอาจมีราคาแพงในจำนวนข้อความค้นหาที่ต้องใช้กับ API เนื่องจาก API สามารถ ส่งคืน 100 คำถามพร้อมกัน

ในการปรับแต่งให้เปลี่ยนตัวแปรต่อไปนี้

  • k: คีย์ API ของคุณ - คุณสามารถลงทะเบียนสำหรับหนึ่งที่นี่
  • s: ไซต์ Stack Exchange ที่คุณต้องการคว้าคำถาม
  • i: ID ผู้ใช้ของคุณบนไซต์นั้น
  • t: แท็กที่คุณต้องการกรองด้วย มี 4 ตัวเลือกสำหรับสิ่งนี้:
    1. "": สตริงว่าง หากคุณไม่ต้องการกรองด้วยแท็กใด ๆ
    2. "code-golf;string": รายการแท็กที่คั่นด้วยเครื่องหมายโคลอนที่คุณต้องการกรอง
    3. prompt("Tags:"): คุณจะได้รับแจ้งให้ป้อนแท็กที่คุณต้องการกรองหรือ
    4. prompt("Tags:","code-golf;string"): คุณจะได้รับแจ้งให้ป้อนแท็กที่คุณต้องการกรองด้วยรายการค่าเริ่มต้นที่ให้ไว้
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
ตามคำตอบของฉัน powershell หนึ่งนี้นำมาใช้ใหม่ที่ดีของสายสำหรับ API
colsw

คุณถูกแบนอย่างถาวร ณ จุดใด ;)
Beta Decay

@BetaDecay หากความท้าทายของ API กลับมาเป็นอีกครั้งฉันอาจจะทราบ! : D
Shaggy

คุณสามารถใช้โทเค็นของ api ได้จากที่นี่: stackapps.com/q/7384/45852เพื่อเพิ่มขีด จำกัด อัตราของคุณ
programmer5000

1
@BetaDecay ฉันตั้งใจจะขยายมันเป็นสคริปต์ที่ใช้งานได้ แต่หมดเวลา พรุ่งนี้ฉันจะพยายามกลับมาหามัน
Shaggy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.