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

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 ответ в ваших решениях ... Это бомба с таймером! Мой ответ уже склонен к этому :-) Аааа, нашел способ, как запустить его СЕЙЧАС ...

Tomas
источник
В интересах взлома еще нескольких сценариев, использующих селекторы 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} распечатать вывод.
fedorqui
источник
так что не в счет свернутых комментариев?
Фес Враста
я думаю, что вы смешали 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.

plannapus
источник
+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, но мне потребовалось некоторое время, чтобы понять, как это работает. Сегодня я увидел пару ответов на одну и ту же тему. Чтобы сделать мой ответ немного другим, я использовал внешнюю библиотеку.

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

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

Abhijit
источник
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
flodel
источник
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" и бомба с таймером, ха-ха

Tomas
источник
Это не будет работать, если страница закрыта, как требует вопрос.
Бодо
Да, 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
Я думаю, что «Ваш скрипт должен запускаться с закрытой страницей при запуске». был предназначен для дисквалификации такого рода ответа.
Питер Тейлор
точно, этот ответ недействителен
Фес Враста
Можно было бы много оптимизировать, но, поскольку он в любом случае недействителен и не спасен, я не стал прилагать усилия для его улучшения.
Виктор Стафуса
Вы можете просто развернуть свернутые комментарии, вызывая событие щелчка на каждом "показать х больше"
Фес Враста