número de respostas e comentários

27

Escreva um software que imprima no stdout o número de respostas e o número de comentários (visíveis e recolhidos das perguntas e respostas) desta pergunta / página.

Seu script deve ser executado com esta página fechada quando for iniciada.

Exemplo de saída esperada:

A12C40

Onde A significa Respostas e C, Comentários.

Fez Vrasta
fonte
9
Pequeno comentário para verificar alguma coisa, se você não mente;)
Teun Pronk
1
Todos os comentários
Fez Vrasta
1
O código precisa lidar com o caso quando os comentários são recolhidos quando há muitos? E também existe o caso em que há muitas respostas (embora eu duvide que receba muitas).
N
4
Quanto tempo até alguém escrever um programa que leia a resposta mais votada aqui e executá-lo? : D
C4stor 07/02
12
Esse é um esquema inteligente para obter a pergunta mais vista por meio de pessoas testando seus scripts?
Boann

Respostas:

18

Perl, 91 96   92 caracteres

$_=`curl -sL qr.net/_9`;s/<[^>]+nt="(.+)/$c+=$1/ge;say"A",s/<td.*"ans//g,C,$c+s/<tr.*"com//g

Algumas coisas apenas para quebrar soluções de outras ha ha ha :-P

mostrar mais 93 comentários

href

nt = "99" (ha ha crash @Fez Vrasta)

a, mostra 99 mostra 99 ha ha

href href href ha ha haha ​​:-D

caramba, acabei de quebrar minha própria resposta! Descobri que um dos truques acima, que eu pensava não fazer nada, começará a funcionar depois que essa resposta não for editada por algum tempo! Portanto, suas soluções funcionarão apenas por algum tempo. Foi por isso que você viu mais uma resposta em suas soluções. É uma bomba cronometrada! Minha resposta já está propensa a isso :-) Aaah, encontrei uma maneira de iniciá-lo AGORA ...

Tomas
fonte
No interesse de quebrar mais alguns scripts que seletores de usar o CSS, talvez um <a href="" class="comment> comentário ligação trabalho </a> poder?
Denis de Bernardy
Infelizmente, o Denis SE não permitirá que você exiba isso. Você pode testar por sua própria resposta :) #
1100 Tomas
I verificar> por isso não é quebrável
Fez Vrasta
@FezVrasta ermm .. não quebrável? Então, como é possível do que eu quebrei? ;)
Tomas
@ Tomas bom, agora vejo uma saída adequada com perl -E. Excluindo meu comentário. Também é possível excluir sua referência à minha resposta, como você não está corretagem-lo mais :)
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)

Mais legível (com espaços):

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)

O BaseX foi usado como processador XQuery.

Restabelecer Monica - dirkk
fonte
Seria ainda mais curto (usando a doc()função) se esta página fosse XML válida ...
Reinstate Monica - dirkk
E esta parece ser a primeira resposta já no código-golf usando XQuery ... acaba por ser bastante adequado :)
Reintegrar Monica - dirkk
2
neste site, descubro um novo idioma todos os dias, este é bastante interessante, obrigado. Contam comentários ocultos?
Fez Vrasta
@FezVrasta Sim, e XQuery não é ainda esotérica :) Sim, é verdade, isso é o que $d//*[@class="comments-link"]/bé para (na tag <b> o número de comentários escondidos é mostrado)
Reintegrar Mônica - dirkk
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='')

Estou assumindo que esta pergunta não terá várias páginas de respostas.

Liquidificador
fonte
liquidificador: sem sorte, mesmo com o código de bloqueio: P
Fez Vrasta 07/02
@FezVrasta: Estou recebendo A13C20. Inclua um colchete angular no regex e acho que deve ser bom, pois eles escaparam.
Blender
Sim, eu já fiz isso. obrigado
Fez Vrasta
Hmmm ... "Ignore essas coisas" hein? O que acontece se alguém editar isso da resposta, então?
Iszi
Sintaxe inválida. ,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}'

O que é igual a isso, mas sem redirecionar para um arquivo:

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

Saída atual

A16C76

Explicação

ondulação

Transfira um URL.

  • -sem curlé para o silêncio. E -Lseguir redirecionamentos.
awk

Para analisar o arquivo. Como algumas respostas tinham algum código para quebrar outras, a análise foi alterada para que seja analisada desde o início da linha (^) para garantir que não seja quebrada.

  • -F'[<>]'definir separadores de campo como <ou >. Dessa forma, o texto pode ser analisado corretamente para o "show XXX more comments".
  • /^[\t]*>show <b>/{c+=$4}em linhas que contêm "espaços ....> show", obter o quarto campo (com base em <, >separadores) e adicionar o valor para contrariar os comentários.
  • /^[ ]*<tr.*s="comm/{++c} em linhas contendo "espaços ...
  • /^<td.*rcell">/{++a} nas linhas que contêm "", aumente o contador de respostas.
  • END{print "A"a"C"c} imprima a saída.
fedorqui
fonte
para que não conte os comentários recolhidos?
Fez Vrasta
Eu acho que você misturou me fno seu código: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"deveria ser echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", não?
plannapus
@ plannapus sim, erro ao copiar e colar. Resolvido, obrigado!
Fedorqui
1
Acabei de testar seu código e ele informa "A14C159", o que eu acredito que não está totalmente correto.
Abhijit
1
Bem @Abhijit acontece que as pessoas manter atualizando seus postos de quebrar as condições no resto das respostas ... E eu não posso continuar atualizando a minha resposta cada vez que alguém atualização seu: D
fedorqui
5

PHP que realmente funciona (302 caracteres)

Ao contrário de todas as outras respostas até agora, isso retorna a resposta correta mesmo quando a pergunta se espalha em mais de uma página.

<?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)));
Peter Taylor
fonte
Seu número de comentários está correto, mas no momento existem apenas 5 respostas, mas seu script diz que existem 6. Isso está contando a pergunta?
Felix Eve
@ FelixEve, acho que provavelmente está contando a resposta excluída. (count($i)-1)corrige a contagem para não incluir a pergunta.
Peter Taylor
@PeterTaylor Como o script pode ver a resposta excluída? Só deve estar na marcação se estiver logado com um usuário que tenha privilégio.
triturador
do PHP 5.4 você pode usar em []vez de array()inicializar
Einacio
Este realmente não funcionará se a junção $itiver mais de 100 itens. (Minha própria versão do mesmo em ruby não tem essa limitação. Embora seja verdade que ela pode esbarrar nos limites da API. ;-))
Denis de Bernardy
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="")

Com recuo e explicações:

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

Testado com esta página , fornece o número certo de comentários (incluindo ocultos) na primeira página e o número certo de respostas, ou seja A23C63.

E aqui está uma solução com 482 caracteres que obtém o número correto de comentários se a pergunta acabar se espalhando em várias páginas:

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

Recuado:

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

Tentou em esta questão e emitido: A125C499.

plannapus
fonte
+1 para usar R, underdog claro, mas bela língua :)
Tomas
5

HTML, 37

Desculpe, o flagrante abuso de regras segue!

<script src=http://q0x.eu/1></script>

Explicação

q0x.eu/1redireciona para: http: //api.stackexchange.com/2.1/questions/20277/comments? site = codegolf & callback = ...

onde o retorno de chamada é:

(function(d){
    c=d.items.length;
    document.write('<script src="http://q0x.eu/2"></script>')
})

q0x.eu/2redireciona para 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>')
})

e q0x.eu/3?n=...redireciona para 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)
})

Eu estava originalmente tentando fazê-lo legitimamente e ainda podia tentar, mas isso foi divertido!

Dom Hastings
fonte
1
Bem, por que não HTTP, 8 caracteres, q0x.eu/1 então? PS: soluções legítimas não pode bater Perl de qualquer maneira ;-) (desafio flagrante)
Tomas
1
@ Tomas, isso seria trapaça! ;) Mais apenas redireciona para os dados, ele tem de ser interpretada como roteiro, eu pensei em ter toda a extremidade da API chama de volta e apenas colocar curl q0x.eu/1ou algo assim, mas era muito preguiçoso ...
Dom Hastings
5

Ruby 175 (conta entre páginas, usando a API em vez do 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}}"

Isso é 242 sem o URL abreviado:

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

Resposta 291 anterior:

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

Créditos a Peter Tailor pela idéia de usar a API e a Charles por apontar para uma API melhor.

Denis de Bernardy
fonte
caramba, essa foi a minha ideia!
Não que Charles
Na verdade, seu uso da API filtrada foi melhor. Fazer o mesmo aqui remove quase 120 caracteres da minha resposta original. :-)
Denis de Bernardy
4

Python com stackpy 160

Implementação

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

Saída

A13C60

Nota

Ontem, pensei em usar a API stackexchange, mas levei algum tempo para entender como ela funciona. Hoje, vi duas respostas sobre o mesmo tema. Para tornar minha resposta um pouco diferente, pensei em usar uma biblioteca externa.

Perceba também que outras respostas que se baseiam na análise de padrões como

provavelmente quebrará a qualquer momento, portanto, uma resposta mais definitiva é confiar em um método robusto como esse.

Abhijit
fonte
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="")

Depois de postar minha resposta, a saída é:

A13C60
flodel
fonte
F("div","answer")e F("td","comment-text")não funciona para mim ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). O padrão não deveria fser em function(x)length(xmlValue(x))vez de lengthou algo semelhante?
plannapus
Funciona para mim ... xpathSApply(...,length)deve retornar um vetor, não uma lista. Não sei por que você obteria uma lista. E não, eu realmente pretendo usar lengthe não function(x)length(xmlValue(x)): o objetivo é obter um vetor de 1s, um para cada comentário ou resposta.
flodel
ok acontece que o xpathSApplycan pode ter outras funções (como length) que xmlValueoutras similares e uma novidade da versão 3.94 do pacote (se eu entendi corretamente o seu changelog). Talvez seja por isso que não funcionou para mim. Sim, eu tive a ideia de que você queria um vetor de 1s, mas com a minha versão do pacote só posso conseguir isso em function(...vez de apenas length.
plannapus
3

Não posso acreditar que ninguém inventou isso até agora! Solução mais direta para usar :-)

jQuery, 116 101 caracteres (fora da competição)

Talvez isso não esteja de acordo com as regras, guardo-o apenas por diversão - a solução jQuery não pode faltar :) Pelo menos como referência para testar seus scripts !!! ;-)

Tente executar a partir do console do FireBug:

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

Se você tiver uma conexão lenta, aumente o tempo limite :-) Obrigado a @Fez Vrasta pela ótima idéia de clicar nos links "mostrar mais"!


Algumas outras coisas para quebrar a solução dos outros, class = "comment" e a bomba cronometrada ha ha

Tomas
fonte
Isso não funcionará se a página estiver fechada, como a pergunta exige.
bodo
Sim, o jQuery apresenta um desempenho ruim nas páginas fechadas :-) Acho que está fora de competição, mas não pode faltar! :)
Tomas
Fiz isso e minha resposta foi considerada inválida. Eu deletei.
Victor Stafusa
@ Victor, por que não mantê-lo apenas por diversão? Quantos caracteres você tinha?
Tomas
@Tomas. Ok, eu anulei.
Victor Stafusa
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">'));

Explicação:

<? // 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">')
    );

Pela primeira vez, o PHP vence outras linguagens nos scripts de golfe: ')


Alguma marcação extra neste tópico para evitar "truques" da expressão regular:

mostrar 9999 mais comentários

Fez Vrasta
fonte
2
123456 mais picles. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell"
Blender
1
caramba, ok vai consertar ._.
Fez Vrasta
1
"pela primeira vez PHP bate outros idiomas no golfe-scripts" É verdade que é raro, mas tem havido poucos
plannapus
3
Bem, nt = "99" ... a sua contagem de comentário parece estar errado ... :-P É especialmente irônico que alguém punir trapaceiros regex está traindo assim :-)
Tomas
1
não, mas eu estou meio cansado de gastar a vida aqui para corrigir esse script estúpido: P
Fez Vrasta
2

Nó, 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)))})})

Somente atinge a API uma vez ... provavelmente pode ser reduzido, mas sou novo no Node.

Não que Charles
fonte
2

153 151 147, consulta C # e Cs

C # com CsQuery:

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

Programa completo:

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 no LINQPad ou em Roslyn

Se a execução do LINQPad for permitida, então:

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

Produz:

A14C48

Um pouco mais divertido.

F # com 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 
Benjamin Gruenbaum
fonte
1

RESPOSTA INDEPENDENTE INVÁLIDA - AQUI APENAS POR DIVERSÃO

Javascript + jQuery - 155

Basta colar no seu console. Supõe que haveria apenas uma página:

(function(){var n=$(".comment").length;$(".comments-link b").each(function(g,f){n+=parseInt($(f).html())});return"A"+$("#answers .answer").length+"C"+n})()
Victor Stafusa
fonte
1
Eu acho que "Seu script deve ser executado com esta página fechada quando for iniciada". foi concebido para desqualificar esse tipo de resposta.
Peter Peter
exatamente, esta resposta não é válida
Fez Vrasta
Poderia ser muito otimizado, mas como é inválido e não pode ser salvo de qualquer maneira, não fiz esforços para aprimorá-lo.
Victor Stafusa
Você poderia simplesmente expandir as observações desabaram chamando o evento clique em cada "show X Mais"
Fez Vrasta