给我一些问题来解答!


15

介绍

有时候我很无聊,关于PPCG并没有新的问题,所以我希望您从PPCG的过去中随机抽取一个问题。

挑战

给定用户的PPCG ID作为输入(例如,我的ID为30525),输出随机选择的PPCG问题的URL。如果问题不符合以下条件,则必须选择另一个问题,直到满足条件:

  • 问题提问者不能是为其问题输入ID的用户
  • 输入其问题ID的用户一定不能回答该问题
  • 这个问题一定不能回答:这可能太难了
  • 这个问题不能有10个以上的答案:这可能太容易了
  • 该问题必须标记为

规则

不允许使用URL缩短器。

您可以使用Stack Exchange API和Stack Exchange Data Explorer。

您只会获得真实的PPCG用户ID。

万一没有合适的问题,您不必输出任何东西(未定义的行为就可以了)。

侧面挑战

尽管不会获得加分,但是如果有人设计了可用的书签,则该书签会在运行时打开浏览器窗口,显示符合上述条件的随机PPCG问题,我们将不胜感激。用户ID应该被硬编码到程序中(用于书签)。

挑战

以字节为单位的最短代码获胜。

Answers:


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

为在webbrowser中打开它的版本添加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域(相关meta)中运行。返回一个Promise包含URL(相关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

尝试一下

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>


书签

这是一个可定制的书签,它将加载您尚未回答的随机问题。要使用它,只需在浏览器的工具栏中添加一个新书签,然后将完整的代码放入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
毛茸茸的

您可以从以下位置使用api令牌:stackapps.com/q/7384/45852来提高速率限制。
程序员

1
@BetaDecay,我确实打算将其扩展为可用的脚本,但是时间不够了;我明天会再尝试。
毛茸茸的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.