编写一个软件,在标准输出上打印该问题/页面的答案数和评论数(问题和答案的可见和折叠)。
您的脚本必须在启动时关闭此页面的情况下运行。
预期示例输出:
A12C40
其中A代表答案,C代表评论。
编写一个软件,在标准输出上打印该问题/页面的答案数和评论数(问题和答案的可见和折叠)。
您的脚本必须在启动时关闭此页面的情况下运行。
预期示例输出:
A12C40
其中A代表答案,C代表评论。
Answers:
$_=`curl -sL qr.net/_9`;s/<[^>]+nt="(.+)/$c+=$1/ge;say"A",s/<td.*"ans//g,C,$c+s/<tr.*"com//g
有些东西只是为了打破别人的解决方案哈哈哈:-P
显示93更多评论
href
nt =“ 99”(哈哈崩溃@Fez Vrasta)
一个,显示99显示99 ha ha
jeez,刚刚打破了我自己的答案!我发现上述技巧之一(我认为没有作用)将在一段时间未编辑答案后开始起作用!因此,您的解决方案只能使用一段时间。这就是为什么您在解决方案中看到+1答案的原因。这是定时炸弹!我的答案已经很容易了:-) Aaah,找到了一种现在启动它的方法...
perl -E
。删除我的评论。另外,您也可以删除对我的答案的引用,因为您不再需要它了:)
let$d:=html:parse(fetch:binary('http://qr.net/1_'))return"A"||count($d//*[@class="answer"])||"C"||count($d//*[@class="comment"])+sum($d//*[@class="comments-link"]/b)
更具可读性(带空格):
let $d:= html:parse(fetch:binary('http://qr.net/1_'))
return "A" || count($d//*[@class="answer"]) || "C" || count($d//*[@class="comment"]) + sum($d//*[@class="comments-link"]/b)
BaseX被用作XQuery处理器。
doc()
如果此页面是有效的XML,则该
$d//*[@class="comments-link"]/b
(在<b>标记中显示了隐藏评论的数量)
import lxml.html as h
s=h.parse('http://qr.net/1_').find('body').cssselect
print('A',len(s('.answer')),'C',len(s('.comment'))+sum(int(e.text)for e in s('.comments-link b')),sep='')
我假设这个问题不会有多页的答案。
A13C20
。在正则表达式中包括一个尖括号,我认为这应该很好,因为它们已被转义。
,sep=''
curl -sL http://qr.net/_9|awk -F'[<>]' '/^[\t]*>s/{c+=$4}/<tr.*"c/{++c}/<t.*"a/{++a}END{print "A"a"C"c}'
与此相同,但不重定向到文件:
curl -sL http://qr.net/_9>f
awk -F'[<>]' '/^[\t]*>s/{c+=$4}/<tr.*"c/{++c}/<t.*"a/{++a}END{print "A"a"C"c}' f
A16C76
传送网址。
-s
在curl
是为了沉默。并-L
遵循重定向。解析文件。由于某些答案具有某些代码可以破坏其他答案,因此已更改了解析,以便从((^
)行的开头进行解析以确保它没有损坏。
-F'[<>]'
将字段分隔符设置为<
或>
。这样,就可以正确解析文本以显示“显示XXX个以上的注释”。/^[\t]*>show <b>/{c+=$4}
在包含“ spaces ....> show”的行上,获取第四个字段(基于<
,>
分隔符)并将其值添加到注释计数器。/^[ ]*<tr.*s="comm/{++c}
在包含“空格...”的行上
/^<td.*rcell">/{++a}
在包含“”的行上,增加答案的计数。END{print "A"a"C"c}
打印输出。m
并f
在您的代码中:echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"
应该是echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)"
,不是吗?
与到目前为止的所有其他答案不同,即使问题溅到一页以上,它也会返回正确的答案。
<?function g($a,$b,$i){return json_decode(gzinflate(substr(file_get_contents("http://api.stackexchange.com/2.1/$a/$i/$b?site=codegolf"),10,-8)))->items;}$i=array(20277);foreach(g("questions","answers",20277)as$x)$i[]=$x->answer_id;echo"A".(count($i)-1)."C".count(g("posts","comments",implode(";",$i)));
(count($i)-1)
更正计数不包括问题。
[]
而不是array()
进行初始化
library(XML);b=htmlParse("https://codegolf.stackexchange.com/questions/20277");z=xpathApply;x=do.call(sum,sapply(z(b,"//tbody",xmlAttrs),function(x)as.integer(x[[1]])))+length(z(b,"//tr[@class='comment']",xmlValue));y=gsub("[^0-9]","",z(b,"//div[@class='subheader answers-subheader']/h2",xmlValue)[[1]]);cat("A",y,"C",x,sep="")
缩进和解释:
library(XML)
b=htmlParse("https://codegolf.stackexchange.com/questions/20277")
z=xpathApply
x=do.call(sum,sapply(z(b,"//tbody",xmlAttrs), #Take the first attribute of tag tbody
function(x)as.integer(x[[1]]))) #And sum them (=nb of hidden comments
+length(z(b,"//tr[@class='comment']",xmlValue)) #+nb of visible comments
y=gsub("[^0-9]","", #This is more straightforward as the number of answers is given on front page.
z(b,"//div[@class='subheader answers-subheader']/h2",xmlValue)[[1]])
cat("A",y,"C",x,sep="")
经测试此页面,它给出的意见(包括隐藏)权数在头版和答案的权数,即A23C63
。
这是一个包含482个字符的解决方案, 如果问题最终散布在多个页面上,则它们可以获取正确数量的注释:
library(XML);h=htmlParse;z=xpathApply;v=xmlValue;a=xmlAttrs;s=sapply;c="http://codegolf.stackexchange.com";f=function(b,i){do.call(sum,s(z(b,"//tbody",a)[i],function(x)as.integer(x[[1]])))+length(z(b,"//tr[@class='comment']",v))};b=h(paste0(c,"/questions/20277"));x=f(b);u=unique(s(z(b,"//div[@class='pager-answers']/a",a),`[`,1));if(length(u))x=x+sum(s(u,function(x)f(h(paste0(c,x)),-1)));y=gsub("[^0-9]","",z(b,"//div[@id='answers-header']/div/h2",v)[[1]]);cat("A",y,"C",x,sep="")
缩进:
library(XML)
h=htmlParse
z=xpathApply
v=xmlValue
a=xmlAttrs
s=sapply
c="http://codegolf.stackexchange.com"
f=function(b,i){do.call(sum,s(z(b,"//tbody",a)[i],function(x)as.integer(x[[1]])))+length(z(b,"//tr[@class='comment']",v))}
b=h(paste0(c,"/questions/20277"))
x=f(b)
u=unique(s(z(b,"//div[@class='pager-answers']/a",a),`[`,1)) #Grab all URLS of pages
if(length(u))x=x+sum(s(u,function(x)f(h(paste0(c,x)),-1))) #Apply comment computation of all URLs
y=gsub("[^0-9]","",z(b,"//div[@id='answers-header']/div/h2",v)[[1]])
cat("A",y,"C",x,sep="")
试过这个问题并输出:A125C499
。
抱歉,公然违反规则!
<script src=http://q0x.eu/1></script>
q0x.eu/1
重定向到:http://api.stackexchange.com/2.1/questions/20277/comments?site = codegolf&callback = ...
回调在哪里:
(function(d){
c=d.items.length;
document.write('<script src="http://q0x.eu/2"></script>')
})
q0x.eu/2
重定向到http://api.stackexchange.com/2.1/questions/20277/answers?site = codegolf&callback = ...
(function(d){
a=0;
g=[];
d.items.map(function(f){
a++;
g.push(f.answer_id)
});
document.write('<script src="http://q0x.eu/3?n='+g.pop()+'"></script>')
})
并q0x.eu/3?n=...
重定向到http://api.stackexchange.com/2.1/answers/.../comments?site = codegolf&callback = ...
(function(d){
c+=d.items.length;
g.length ? document.write('<script src="http://q0x.eu/3?n='+g.pop()+'"></script>') : alert('A'+a+'C'+c)
})
我本来是想合法地做的,但仍然可以尝试,但这仍然很有趣!
q0x.eu/1
那么8个字符呢?PS:合法的解决方案无论如何都无法击败Perl ;
curl q0x.eu/1
一些东西,但是太懒了……
require'open-uri';require'json'
q=JSON.parse(open("http://qr.net/oyJn").read)["items"][0];a=q["answers"]
puts"A#{a.count}C#{[q,*a].reduce(0){|m,o|m+o["comments"].to_a.count}}"
那是242,没有缩短的网址:
require'open-uri';require'json'
q=JSON.parse(open("http://api.stackexchange.com/2.1/questions/20277?site=codegolf&filter=!azbR89z2Zw*dg.").read)["items"][0]
a=q["answers"]
puts"A#{a.count}C#{[q,*a].reduce(0){|m,o|m+o["comments"].to_a.count}}"
上一个291答案:
require'open-uri';require'json'
def g(o,l,f);JSON.parse(open("http://api.stackexchange.com/2.1/#{o}/#{l}/#{f}?site=codegolf").read)["items"];end
q=20277
p=g("questions",q,"answers").inject([q]){|m,o|m<<o["answer_id"]}
puts"A#{p.count-1}C#{p.map{|i|g("posts",i,"comments").count}.reduce(:+)}"
感谢Peter Tailor使用API的想法,以及Charles指出了更好的API。
实作
s=__import__("stackpy").Site("codegolf");q=s.questions(20277);a=q.answers
print"A%dC%d"%(len(a),sum(len(s.answers(e.id()).comments)for e in a)+len(q.comments))
输出量
A13C60
注意
昨天我打算使用stackexchange API,但花了一些时间让我了解它的工作原理。今天,我看到有几个关于同一主题的答案。为了使答案有所不同,我使用了外部库。
还应意识到依赖于模式解析的其他答案
可能很快就会中断,因此更确切的答案是依靠像这样的可靠方法。
library(XML);F=function(x,y,f=length,z='')sum(as.double(xpathSApply(htmlParse('http://qr.net/1_'),sprintf('//%s[@class="%s"]%s',x,y,z),f)));cat("A",F("div","answer"),"C",F("a","comments-link ",xmlValue,"//b")+F("td","comment-text"),sep="")
发布答案后,输出为:
A13C60
F("div","answer")
并且F("td","comment-text")
对我不起作用(Error in F("div", "answer") : (list) object cannot be coerced to type 'double'
)。的默认值不是f
应该function(x)length(xmlValue(x))
不是length
,还是类似值?
xpathSApply(...,length)
应该返回一个向量,而不是一个列表。我不确定为什么会得到一份清单。不,我真的要使用length
而不是function(x)length(xmlValue(x))
:目标是获得1
s 的向量,每个注释或答案一个。
xpathSApply
可以采用其他功能(例如和length
)的事实xmlValue
是该软件包3.94版本(如果我正确理解了它们的变更日志)的一种新颖性。这可能就是为什么它对我不起作用的原因。是的,我知道您想要一个1的向量,但是使用我的软件包版本,我只能使用function(...
而不是来实现length
。
不能相信直到现在还没有人提出!最直接的解决方案:-)
也许这与规则不符,我只是为了好玩才保留它-不能缺少jQuery解决方案:)至少作为测试脚本的参考!!!;-)
尝试从FireBug控制台运行:
$('.comments-link').click();
setTimeout("alert('A'+$('.answer').length+'C'+$('.comment').length)",999)
如果您的连接速度较慢,请增加超时时间:-)感谢@Fez Vrasta提供了单击“显示更多”链接的好主意!
<?$h=file_get_contents('http://qr.net/_9');preg_match_all('/<t.*nt="([0-9]*)/',$h,$c);echo 'A'.substr_count($h,'rcell">').'C'.(array_sum($c[1])+substr_count($h,'mment">'));
说明:
<? // short open tag
$h = file_get_contents('http://qr.net/_9'); // store in $h the content of the shortened url of the page
preg_match_all('/<t.*nt="([0-9]*)/', $h, $c); // find each "show/hide X more comments" and store the numbers in $c
echo
'A' // output A
.substr_count($h,'rcell">') // output the count of the occurrences of 'rcell">' (short for '"answercell">')
.'C' // output C
.(
array_sum( $c[1] ) // output the sum of the collapsed comments found before
+
substr_count( $h, 'mment">') // output the count of the occurrences of 'mment">' (short for '"comment">')
);
PHP第一次在高尔夫脚本中击败了其他语言:')
此主题的一些额外标记,以避免正则表达式“作弊”:
r=require;m='comments'
r('http').get("http://api.stackexchange.com/2.1/questions/20277?site=codegolf&filter=!azbR89z2Zw*dg.").on('response',function(p){p.pipe(r('zlib').createGunzip(o="")).on('readable',function(){o+=this.read()}).on('end',function(){d=JSON.parse(o).items[0]
r('util').print("A",d.answer_count,"C",(d[m].length+d.answers.reduce(function(p,c){return p+(c[m]?c[m].length:0)},0)))})})
只打过一次API ...可能会缩短,但是我是Node的新手。
C#与CsQuery:
var d = CsQuery.CQ.CreateFromUrl("http://qr.net/1_");
Console.Write("A" + d[".answer"].Count() + "C" + d[".comment"].Count());
完整程序:
class P{static void Main(){var d =CsQuery.CQ.CreateFromUrl("http://qr.net/1_");Console.Write("A"+d[".answer"].Count()+"C"+d[".comment"].Count());}}
如果允许通过LINQPad运行,则:
var d =CsQuery.CQ.CreateFromUrl("http://qr.net/1_");Console.Write("A"+d[".answer"].Count()+"C"+d[".comment"].Count());
产生:
A14C48
一些更多的乐趣。
[<EntryPoint>]
let main x=
let d=CsQuery.CQ.CreateFromUrl("http://qr.net/1_")
printfn "A%dC%d" d.[".answer"].Length d.[".comment"].Length
0
只需将其粘贴到您的控制台中即可。假设只有一页:
(function(){var n=$(".comment").length;$(".comments-link b").each(function(g,f){n+=parseInt($(f).html())});return"A"+$("#answers .answer").length+"C"+n})()