количество ответов и комментариев


27

Напишите программное обеспечение, которое выводит на стандартный вывод количество ответов и количество комментариев (видимых и свернутых вопросов и ответов) этого вопроса / страницы.

Ваш скрипт должен запускаться с закрытой страницей при запуске.

Ожидаемый пример вывода:

A12C40

Где А означает Ответы, а С - Комментарии.


9
Небольшой комментарий, чтобы проверить что-то, если вы не возражаете;)
Теун Пронк

1
Все комментарии
Фес Враста

1
Должен ли код обрабатывать случай, когда комментарии свернуты, когда их слишком много? И есть также случай, когда есть слишком много ответов (хотя я сомневаюсь, что получит так много).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4
Как долго, пока кто-то не напишет здесь программу, которая прочитает ответ с наибольшим количеством голосов и запустит ее? : D
C4stor

12
Это умная схема, чтобы получить самый просматриваемый вопрос через людей, тестирующих свои сценарии?
Boann

Ответы:


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 га га

HREF HREF HREF ха-ха-ха-ха :-D

Боже, просто сломал мой собственный ответ! Я обнаружил, что один из вышеперечисленных приемов, который, как я думал, ничего не делает, начнет работать после того, как этот ответ не будет отредактирован в течение некоторого времени! Таким образом, ваши решения будут работать только в течение некоторого времени. Вот почему вы видели еще +1 ответ в ваших решениях ... Это бомба с таймером! Мой ответ уже склонен к этому :-) Аааа, нашел способ, как запустить его СЕЙЧАС ...


В интересах взлома еще нескольких сценариев, использующих селекторы css, возможно, сработает <a href="" class="comment> ссылка на комментарий </a>?
Денис де Бернарди

Денис, к сожалению, SE не позволит вам показать это. Вы можете проверить свой ответ :)
Томас

Я проверяю> так, чтобы это не
ломалось

@FezVrasta ermm .. не ломается? Тогда как это возможно, чем я это сломал? ;)
Томас

@ Томас хорошо, теперь я вижу правильный вывод с perl -E. Удаление моего комментария. Также вы можете удалить свою ссылку на мой ответ, так как вы больше не торгуете ею :)
fedorqui

9

XQuery, 169 , 160 , 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 ...
Восстановите Монику - dirkk

И это, кажется, первый ответ в код-гольфе с использованием XQuery ... оказывается вполне подходящим :)
Восстановить Монику - dirkk

2
на этом сайте я открываю новый язык каждый день, этот довольно интересный, спасибо. Считает ли он скрытые комментарии?
Фес Враста

@FezVrasta Да, и XQuery даже не эзотерический :) Да, это так, вот для чего $d//*[@class="comments-link"]/b(в теге <b> показано количество скрытых комментариев)
Восстановить Монику - dirkk

7

Питон 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
Фес Враста

@FezVrasta: Я получаю A13C20. Включите угловую скобку в регулярное выражение, и я думаю, что это должно быть хорошо, так как те избегают.
Блендер

Да, я уже сделал это. спасибо
Фес Враста

Хммм ... "Игнорируй это", а? Что произойдет, если кто-то изменит это из ответа, тогда?
Изи

Неверный синтаксис. ,sep=''
Runium

7

BASH + AWK 163 , 144 , 138 , 111 , 110 , 114 , 131 , 132 , 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

объяснение

локон

Передать URL.

  • -sв curlдля молчит. И -Lследовать перенаправлениям.
AWK

Разобрать файл. Так как некоторые ответы содержали код для разрыва других ответов, синтаксический анализ был изменен таким образом, чтобы он анализировался с начала строки (^), чтобы убедиться, что он не поврежден.

  • -F'[<>]'установить разделители полей как <или >. Таким образом, текст может быть правильно проанализирован для «показать XXX больше комментариев».
  • /^[\t]*>show <b>/{c+=$4}в строках , содержащие «пространства ....> шоу», получить 4 - е поля (на основе <, >сепараторы) и добавить значение к комментариям счетчика.
  • /^[ ]*<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)", нет?
plannapus

@plannapus да, ошибка при копировании и вставке. Решено, спасибо!
Федорки

1
Только что проверил ваш код, и он сообщает «A14C159», что я считаю не совсем правильным.
Абхиджит

1
Ну, @Abhijit, случается, что люди продолжают обновлять свои сообщения, чтобы нарушить условия в остальных ответах ... И я не могу продолжать обновлять свой ответ каждый раз, когда кто-то обновляет его: D
fedorqui

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

из PHP 5.4 вы можете использовать []вместо array()инициализации
Einacio

Это на самом деле не сработает, если в объединении $iболее 100 предметов. (Моя собственная версия этого же в ruby не имеет этого ограничения. Хотя по общему признанию это может столкнуться с ограничениями API. ;-))
Денис де Бернарди

5

R 326

library(XML);b=htmlParse("/codegolf/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("/codegolf/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, ясное слабое, но прекрасный язык :)
Томас

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, тогда 8 символов q0x.eu/1 ? PS: законные решения не могут победить Perl в любом случае ;-) (вопиющий вызов)
Томас

1
@ Томас, это было бы обманом! ;) плюс он только перенаправляет данные, его нужно интерпретировать как скрипт, я действительно думал о том, чтобы все вызовы 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 без сокращенного URL:

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(:+)}"

Благодарность Питеру Тейлору за идею использования API и Чарльзу за указание на лучший API.


блин, это была моя идея!
Не то, чтобы Чарльз

На самом деле, ваше использование отфильтрованного API было лучше. Если сделать то же самое, я получаю почти 120 символов моего первоначального ответа. :-)
Дени де Бернарди

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

Заметка

Вчера я размышлял об использовании API stackexchange, но мне потребовалось некоторое время, чтобы понять, как это работает. Сегодня я увидел пару ответов на одну и ту же тему. Чтобы сделать мой ответ немного другим, я использовал внешнюю библиотеку.

Также осознайте, что другие ответы, которые основаны на разборе шаблонов

скорее всего сломается в ближайшее время, поэтому более точный ответ - использовать надежный метод, подобный этому.


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

Это работает для меня ... xpathSApply(...,length)должен вернуть вектор, а не список. Я не уверен, почему вы получите список. И нет, я действительно хочу использовать, lengthа не function(x)length(xmlValue(x)): цель состоит в том, чтобы получить вектор 1s, по одному на каждый комментарий или ответ.
flodel

Хорошо, тот факт, что xpathSApplycan принимает другие функции (например length) xmlValueи подобные, является новинкой в ​​версии 3.94 пакета (если я правильно понимаю их список изменений). Возможно, поэтому это не сработало для меня. Да, я понял, что вам нужен вектор 1, но с моей версией пакета я могу добиться этого только с помощью function(...вместо всего length.
plannapus

3

Не могу поверить, что до сих пор никто не придумал это! Самое прямое решение для использования :-)

JQuery, 116 101 символ (вне конкуренции)

Возможно, это не соответствует правилам, я оставляю это просто для удовольствия - решение jQuery не может отсутствовать :) По крайней мере, как ссылка для тестирования ваших сценариев !!! ;-)

Попробуйте запустить из консоли FireBug:

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

Если у вас медленное соединение, увеличьте время ожидания :-) Спасибо @Fez Vrasta за прекрасную идею нажать на ссылку «показать больше»!


Некоторые другие вещи, чтобы сломать решение других, class = "comment" и бомба с таймером, ха-ха


Это не будет работать, если страница закрыта, как требует вопрос.
Бодо

Да, jQuery плохо работает на закрытых страницах :-) Я думаю, что это вне конкуренции, но на самом деле не может быть пропущено! :)
Томас

Я сделал это, и мой ответ был признан недействительным. Я удалил это.
Виктор Стафуса

@Victor, почему бы не оставить это для развлечения? Сколько у вас было символов?
Томас

@Tomas. Хорошо, я восстановил это.
Виктор Стафуса

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"
Блендер

1
черт побери, ладно исправлю.
Фес Враста

1
«Впервые PHP превосходит другие языки в сценариях игры в гольф» Это правда, что это редко, но их было немного
plannapus

3
Ну, nt = "99" ... ваш счет комментариев кажется неправильным ... :-P Особенно забавно, что кто-то, кто наказывает читеров регулярных выражений, тоже обманывает :-)
Томас

1
нет, но мне скучно тратить жизнь здесь, чтобы исправить этот глупый сценарий: P
Fez Vrasta

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

118 C # & CsQuery в LINQPad или в Roslyn

Если запуск через LINQPad разрешен, тогда:

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

Производит:

A14C48

Еще немного веселья.

F # с CsQuery, 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
Я думаю, что «Ваш скрипт должен запускаться с закрытой страницей при запуске». был предназначен для дисквалификации такого рода ответа.
Питер Тейлор

точно, этот ответ недействителен
Фес Враста

Можно было бы много оптимизировать, но, поскольку он в любом случае недействителен и не спасен, я не стал прилагать усилия для его улучшения.
Виктор Стафуса

Вы можете просто развернуть свернутые комментарии, вызывая событие щелчка на каждом "показать х больше"
Фес Враста
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.