答案和评论数


27

编写一个软件,在标准输出上打印该问题/页面的答案数和评论数(问题和答案的可见和折叠)。

您的脚本必须在启动时关闭此页面的情况下运行。

预期示例输出:

A12C40

其中A代表答案,C代表评论。


9
如果您不介意的话,很少有评论来检查某事;)
Teun Pronk 2014年

1
所有评论
Fez Vrasta 2014年

1
当注释太多时折叠起来时,代码是否必须处理这种情况?而且在某些情况下答案太多(尽管我怀疑会得到这么多答案)。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

4
有人编写了一个程序,在此处读取了最高评价的答案并运行它,需要多长时间?:D
C4stor 2014年

12
这是一个聪明的方案,可以通过人们测试其脚本来获得最受关注的问题吗?
Boann 2014年

Answers:


18

Perl,91 96   92个字符

$_=`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

HREF HREF HREF 哈哈哈哈:-D

jeez,刚刚打破了我自己的答案!我发现上述技巧之一(我认为没有作用)将一段时间未编辑答案开始起作用!因此,您的解决方案只能使用一段时间。这就是为什么您在解决方案中看到+1答案的原因。这是定时炸弹!我的答案已经很容易了:-) Aaah,找到了一种现在启动它的方法...


为了打破更多使用CSS选择器的脚本,也许<a href="" class="comment>评论链接</a>“可能
有用

不幸的是,Denis SE不允许您显示此内容。您可以根据自己的答案进行测试:)
Tomas

我检查>,所以它不是易碎
菲斯·弗拉斯塔

@FezVrasta ermm ..不易碎吗?那怎么可能比我破产呢?;)
Tomas

@Tomas很好,现在我确实看到了正确的输出perl -E。删除我的评论。另外,您也可以删除对我的答案的引用,因为您不再需要它了:)
fedorqui 2014年

9

XQuery中,169160,165

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,则该
字段将更

这似乎是有史以来使用XQuery进行代码高尔夫的第一个答案……事实证明非常合适:)
恢复莫妮卡-dirkk 2014年

2
在这个网站上,我每天都会发现一种新的语言,这很有趣,谢谢。它算隐藏评论吗?
Fez Vrasta 2014年

@FezVrasta是的,XQuery甚至都不是深奥的:)是的,多数民众赞成在做什么$d//*[@class="comments-link"]/b(在<b>标记中显示了隐藏评论的数量)
恢复莫妮卡-dirkk 2014年

7

Python 3、180

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='')

我假设这个问题不会有多页的答案。


搅拌器:即使使用块代码也没有运气:P
Fez Vrasta 2014年

@FezVrasta:我要A13C20。在正则表达式中包括一个尖括号,我认为这应该很好,因为它们已被转义。
Blender 2014年

是的,我已经做到了。感谢
Fez Vrasta 2014年

嗯...“忽略这些东西”吧?如果有人在答案之外进行编辑,会发生什么?
Iszi 2014年

无效的语法。,sep=''
Runium

7

BASH + AWK 163144138111110114131132,105

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

说明

卷曲

传送网址。

  • -scurl是为了沉默。并-L遵循重定向。
awk

解析文件。由于某些答案具有某些代码可以破坏其他答案,因此已更改了解析,以便从((^)行的开头进行解析以确保它没有损坏。

  • -F'[<>]'将字段分隔符设置为<>。这样,就可以正确解析文本以显示“显示XXX个以上的注释”。
  • /^[\t]*>show <b>/{c+=$4}在包含“ spaces ....> show”的行上,获取第四个字段(基于<>分隔符)并将其值添加到注释计数器。
  • /^[ ]*<tr.*s="comm/{++c} 在包含“空格...”的行上
  • /^<td.*rcell">/{++a} 在包含“”的行上,增加答案的计数。
  • END{print "A"a"C"c} 打印输出。

因此,它不计入已折叠的评论吗?
菲斯·弗拉斯塔

我认为您感到困惑,mf在您的代码中:echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"应该是echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)",不是吗?
plannapus 2014年

@plannapus是的,复制粘贴时出错。解决了,谢谢!
fedorqui 2014年

1
刚刚测试了您的代码,并报告了“ A14C159”,我认为这不是很正确。
阿披吉特(Abhijit)2014年

1
好吧,@ Abhijit,人们不断更新自己的帖子以破坏其余答案的条件...而我每次有人更新他的:D时都无法更新我的答案
fedorqui 2014年

5

PHP实际有效(302个字符)

与到目前为止的所有其他答案不同,即使问题溅到一页以上,它也会返回正确的答案。

<?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)));

您的评论数量是正确的,但目前只有5个答案,但您的脚本说有6个答案。这算问题吗?
菲利克斯·夏娃

@FelixEve,我想可能是在统计删除的答案。(count($i)-1)更正计数不包括问题。
彼得·泰勒

@PeterTaylor脚本如何查看已删除的答案?仅当使用具有特权的用户登录时,它才应位于标记中。
Cruncher 2014年

从PHP 5.4开始,您可以使用它[]而不是array()进行初始化
Einacio 2014年

如果加入的$i项目超过100个,则此项目实际上将无法工作。(我自己的红宝石版本没有此限制。尽管可以承认它可能会
遇到

5

R,326

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


+1使用R,清除劣势但语言优美:)
Tomas

5

HTML,37

抱歉,公然违反规则!

<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)
})

我本来是想合法地做的,但仍然可以尝试,但这仍然很有趣!


1
好吧,为什么不使用HTTP, q0x.eu/1那么8个字符呢?PS:合法的解决方案无论如何都无法击败Perl ;
Tomas

1
@Tomas,那太骗人了!;)再加上它只能重定向到数据,必须将其解释为脚本,我确实考虑过将所有API都调用到后端,然后放curl q0x.eu/1一些东西,但是太懒了……
Dom Hastings

5

Ruby 175(使用API​​而非DOM跨页计数)

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。


该死的,那是我的主意!
并不是查尔斯(Charles)

实际上,您最好使用过滤后的API。在这里做同样的事情将我原来的答案减少了近120个字符。:-)
Denis de Bernardy 2014年

4

带有堆栈的 Python 160

实作

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,但花了一些时间让我了解它的工作原理。今天,我看到有几个关于同一主题的答案。为了使答案有所不同,我使用了外部库。

还应意识到依赖于模式解析的其他答案

可能很快就会中断,因此更确切的答案是依靠像这样的可靠方法。


3

R 239

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,还是类似值?
plannapus 2014年

它对我有用... xpathSApply(...,length)应该返回一个向量,而不是一个列表。我不确定为什么会得到一份清单。不,我真的要使用length而不是function(x)length(xmlValue(x)):目标是获得1s 的向量,每个注释或答案一个。
flodel 2014年

ok证明了xpathSApply可以采用其他功能(例如和length)的事实xmlValue是该软件包3.94版本(如果我正确理解了它们的变更日志)的一种新颖性。这可能就是为什么它对我不起作用的原因。是的,我知道您想要一个1的向量,但是使用我的软件包版本,我只能使用function(...而不是来实现length
plannapus 2014年

3

不能相信直到现在还没有人提出!最直接的解决方案:-)

jQuery的,116个 101字符(关闭竞争)

也许这与规则不符,我只是为了好玩才保留它-不能缺少jQuery解决方案:)至少作为测试脚本的参考!!!;-)

尝试从FireBug控制台运行:

$('.comments-link').click();
setTimeout("alert('A'+$('.answer').length+'C'+$('.comment').length)",999)

如果您的连接速度较慢,请增加超时时间:-)感谢@Fez Vrasta提供了单击“显示更多”链接的好主意!


一些其他的东西,别人的class =“评论”破发液和计时炸弹 哈哈 哈哈


如问题所要求的那样,如果页面关闭则无法使用。
bodo 2014年

是的,jQuery在关闭的页面上的表现很差:-)我想这在竞争中是没有竞争的,但确实不能错过!:)
Tomas

我这样做了,我的回答被认为是无效的。我已经把它删了。
Victor Stafusa 2014年

@Victor,为什么不保留它只是为了好玩?你有几个字符?
Tomas

@Tomas。好的,我不删除它。
Victor Stafusa 2014年

3

PHP:184 172

<?$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第一次在高尔夫脚本中击败了其他语言:')


此主题的一些额外标记,以避免正则表达式“作弊”:

再显示9999条评论


2
还有123456个泡菜。rcell“ rcell” rcell“ rcell” rcell“ rcell” rcell“ rcell” rcell“ rcell” rcell“ rcell” rcell“ rcell” rcell“
Blender

1
该死的,好的。
菲斯·弗拉斯塔

1
“ PHP首次在高尔夫脚本中击败了其他语言”,这确实是罕见的,但是确实有一些
plannapus 2014年

3
好吧,nt =“ 99” ...您的评论计数似乎是错误的... :-P讽刺正则表达式作弊者的作弊行为也很讽刺:-)
Tomas

1
不,但我有点无聊地花时间在这里解决这个愚蠢的脚本:P
Fez Vrasta 2014年

2

节点403

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的新手。


2

153 151 147,C#&CsQuery

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或Roslyn中的118 C#和CsQuery

如果允许通过LINQPad运行,则:

var d =CsQuery.CQ.CreateFromUrl("http://qr.net/1_");Console.Write("A"+d[".answer"].Count()+"C"+d[".comment"].Count());

产生:

A14C48

一些更多的乐趣。

带有CsQuery的F#143:

[<EntryPoint>]
let main x= 
 let d=CsQuery.CQ.CreateFromUrl("http://qr.net/1_")
 printfn "A%dC%d" d.[".answer"].Length d.[".comment"].Length
 0 

1

无效的未删除的答案-这里只是为了乐趣

Javascript + jQuery-155

只需将其粘贴到您的控制台中即可。假设只有一页:

(function(){var n=$(".comment").length;$(".comments-link b").each(function(g,f){n+=parseInt($(f).html())});return"A"+$("#answers .answer").length+"C"+n})()

1
认为 “您的脚本必须在启动时关闭此页面的情况下运行。” 旨在取消这种答案的资格。
彼得·泰勒

确切地说,此答案无效
Fez Vrasta 2014年

可以进行很多优化,但是由于它仍然无效且无法挽救,因此我没有做出任何改进。
Victor Stafusa 2014年

您只需展开折叠的注释即可在每个“显示更多”上调用click事件
Fez Vrasta 2014年
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.