кількість відповідей та коментарів


27

Напишіть програмне забезпечення, яке друкує на stdout кількість відповідей та кількість коментарів (видимих ​​та згорнутих питань та відповідей) цього питання / сторінки.

Ваш сценарій повинен працювати із закритою сторінкою, коли вона починається.

Очікуваний приклад результату:

A12C40

Де A означає відповіді, а C - коментарі.


9
Маленький коментар, щоб перевірити щось, якщо ви не проти;)
Teun Pronk

1
Усі коментарі
Fez Vrasta

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

4
Скільки часу, поки хтось не напише програму, яка читає тут найбільш схвалену відповідь, і запускає її? : D
C4stor

12
Це розумна схема отримати найбільш переглянуте питання через людей, які тестують свої сценарії?
Боан

Відповіді:


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" (ha ha crash @Fez Vrasta)

а, шоу 99 шоу 99 га

href href href ha ha haha ​​:-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=''
Руніум

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 так, помилка в пасті для копіювання. Вирішено, спасибі!
fedorqui

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 предметів. (Моя власна версія того ж у рубіні не має цього обмеження. Хоча, правда, він може натрапити на обмеження 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
@Tomas, це було б обманом! ;) плюс він лише переспрямовує дані, це має бути інтерпретовано як сценарій, я думав про те, щоб завершити всі виклики API і просто поставити curl q0x.eu/1чи щось таке, але було занадто ледачим ...
Дом Гастінгс

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чи іншого подібного?
планнапус

Це працює для мене ... xpathSApply(...,length)повинен повернути вектор, а не список. Я не впевнений, чому ви отримаєте список. І ні, я дійсно маю на увазі використовувати, lengthа не function(x)length(xmlValue(x)): мета - отримати вектор 1s, по одному для кожного коментаря чи відповіді.
flodel

Ок, виявляється, те, що xpathSApplyможе виконувати інші функції (як length), ніж xmlValueподібні, - це новинка версії 3.94 пакета (якщо я правильно розумію їхній журнал змін). Ось чому це не спрацювало для мене. Так, у мене з'явилася думка, що ви хочете вектор 1, але з моєю версією пакету я можу досягти цього лише за допомогою, function(...а не просто length.
планнапус

3

Не можу повірити, що ніхто до цього не придумав! Найбільш пряме рішення для використання :-)

jQuery, 116 101 знак (поза конкуренцією)

Можливо, це не відповідає правилам, я тримаю це просто заради задоволення - рішення jQuery не може бути відсутнє :) Принаймні, як посилання на тестування ваших сценаріїв !!! ;-)

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

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

Якщо у вас повільний зв'язок, збільште час очікування :-) Дякую @Fez Vrasta за чудову ідею натиснути на посилання "показати більше"!


Деякі інші речі , щоб зламати рішення інших, клас = "коментар" і бомба уповільненої дії ха - ха


Це не спрацює, якщо сторінка закрита, як вимагає питання.
BODO

Так, 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" rcell "
Blender

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
Я думаю, що "Ваш сценарій повинен працювати із закритою сторінкою, коли вона починається". мав на меті дискваліфікувати подібну відповідь.
Пітер Тейлор

точно, ця відповідь не вірна
Fez Vrasta

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

Ви можете просто розгорнути згорнуті коментарі, закликаючи подію натискання на кожне "показати x більше"
Fez Vrasta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.