cantidad de respuestas y comentarios

27

Escriba un software que imprima en stdout el número de respuestas y el número de comentarios (visibles y colapsados ​​de preguntas y respuestas) de esta pregunta / página.

Su script debe ejecutarse con esta página cerrada cuando se inicia.

Salida de ejemplo esperada:

A12C40

Donde A representa Respuestas y C para Comentarios.

Fez Vrasta
fuente
99
Pequeño comentario para verificar algo, si no te importa;)
Teun Pronk
1
Todos los comentarios
Fez Vrasta
1
¿El código tiene que manejar el caso cuando los comentarios se colapsan cuando hay demasiados? Y también está el caso cuando hay demasiadas respuestas (aunque dudo que obtenga tantas).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
44
¿Cuánto tiempo hasta que alguien escriba un programa que lea la respuesta más votada aquí y lo ejecute? : D
C4stor
12
¿Es este un esquema inteligente para obtener la pregunta más vista a través de personas que prueban sus scripts?
Boann

Respuestas:

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

Algunas cosas solo para romper soluciones de otros ja ja ja :-P

mostrar 93 comentarios más

href

nt = "99" (ja, ja, choque @Fez Vrasta)

a, mostrar 99 mostrar 99 ja, ja

href href href ja, ja, ja :-D

jeeez, acabo de romper mi propia respuesta! ¡Descubrí que uno de los trucos anteriores, que pensé que no hace nada, comenzará a funcionar después de que esta respuesta no se edite por un tiempo! Por lo tanto, sus soluciones funcionarán solo por un tiempo. Es por eso que has visto +1 respuesta más en tus soluciones. ¡Es una bomba temporizada! Mi respuesta ya es propensa a eso :-) Aaah, encontré una manera de lanzarlo AHORA ...

Tomás
fuente
En el interés de romper algunos scripts más que usan selectores css, ¿quizás podría funcionar un <a href="" class="comment> enlace de comentario </a>?
Denis de Bernardy
Denis desafortunadamente SE no le permitirá mostrar esto. Puedes probar tu propia respuesta :)
Tomás
Compruebo por> para que no sea frágil
Fez Vrasta
@FezVrasta ermm ... ¿no se puede romper? Entonces, ¿cómo es posible que lo rompí? ;)
Tomas
@Tomas bien, ahora veo una salida adecuada con perl -E. Borrando mi comentario También puede eliminar su referencia a mi respuesta, ya que ya no la está
rompiendo
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)

Más legible (con espacios):

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 se utilizó como procesador XQuery.

Reinstalar a Monica - dirkk
fuente
Sería aún más corto (mediante el uso de la doc()función) si esta página fuera XML válido ...
Restablecer Mónica - dirkk
Y esto parece ser la primera respuesta alguna en el código de golf usando XQuery ... resulta ser muy adecuado :)
Restablecer Mónica - dirkk
2
en este sitio descubro un nuevo idioma todos los días, este es bastante interesante, gracias. ¿Cuenta los comentarios ocultos?
Fez Vrasta
@FezVrasta Sí, y XQuery ni siquiera es esotérico :) Sí, eso $d//*[@class="comments-link"]/bes para lo que sirve (en la etiqueta <b> se muestra el número de comentarios ocultos)
Reinstalar Monica - dirkk
7

Pitón 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='')

Supongo que esta pregunta no tendrá varias páginas de respuestas.

Licuadora
fuente
licuadora: sin suerte incluso con el código de bloque: P
Fez Vrasta
@FezVrasta: Me estoy poniendo A13C20. Incluya un soporte en ángulo en la expresión regular y creo que debería ser bueno, ya que se escapan.
Blender
Sí, ya lo hice. gracias
Fez Vrasta
Hmmm ... "Ignora estas cosas" ¿eh? ¿Qué sucede si alguien edita eso de la respuesta, entonces?
Iszi
Sintaxis 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}'

Que es lo mismo que esto, pero sin redirigir a un archivo:

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

Salida de corriente

A16C76

Explicación

rizo

Transfiere una URL.

  • -sen curles para el silencio. Y -Lpara seguir las redirecciones.
awk

Para analizar el archivo. Como algunas respuestas tenían algún código para romper otras respuestas, el análisis se ha modificado para que se analice desde el principio de la línea (^) para asegurarse de que no esté roto.

  • -F'[<>]'establecer separadores de campo como <o >. De esta forma, el texto se puede analizar correctamente para "mostrar XXX comentarios más".
  • /^[\t]*>show <b>/{c+=$4}en las líneas que contienen "espacios ....> show", consigue el cuarto campo (basado en <, >separadores) y añadir el valor a los comentarios de contador.
  • /^[ ]*<tr.*s="comm/{++c} en líneas que contienen "espacios ...
  • /^<td.*rcell">/{++a} en líneas que contienen "", incremente el contador de respuestas.
  • END{print "A"a"C"c} imprime la salida.
fedorqui
fuente
entonces no cuenta los comentarios colapsados?
Fez Vrasta
Creo que se mezclan my fen su código: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"debería ser echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", ¿no?
plannapus
@plannapus sí, error de copiar y pegar. Resuelto, gracias!
fedorqui
1
Acabo de probar su código e informa "A14C159", que creo que no es del todo correcto.
Abhijit
1
Bueno @Abhijit sucede que la gente sigue actualizando sus publicaciones para romper las condiciones en el resto de las respuestas ... Y no puedo seguir actualizando mi respuesta cada vez que alguien actualiza la suya: D
fedorqui
5

PHP que realmente funciona (302 caracteres)

A diferencia de todas las otras respuestas hasta ahora, esto devuelve la respuesta correcta incluso cuando la pregunta se derrama en más de una 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
fuente
Su número de comentarios es correcto, pero por el momento solo hay 5 respuestas, pero su guión dice que hay 6. ¿Está contando la pregunta?
Felix Eve
@FelixEve, creo que probablemente esté contando la respuesta eliminada. (count($i)-1)corrige el recuento para no incluir la pregunta.
Peter Taylor
@PeterTaylor ¿Cómo puede ver el script la respuesta eliminada? Solo debe estar en el marcado si ha iniciado sesión con un usuario que tiene privilegios.
Cruncher
desde PHP 5.4 puede usar en []lugar de array()inicializar
Einacio
En realidad, este no funcionará si la unión $itiene más de 100 elementos. (Mi propia versión de la misma en ruby no tiene esta limitación. Aunque es cierto que puede toparse con los límites de la 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="")

Con sangría y explicaciones:

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

Probado con esta página , proporciona el número correcto de comentarios (incluidos los ocultos) en la página principal y el número correcto de respuestas, es decir A23C63.

Y aquí hay una solución con 482 caracteres que captura el número correcto de comentarios si la pregunta termina extendiéndose en varias 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="")

Sangrado:

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

Tratado en esta pregunta y da salida: A125C499.

plannapus
fuente
+1 por usar R, claro perdedor pero hermoso lenguaje :)
Tomas
5

HTML, 37

Lo sentimos, sigue el abuso de reglas descaradas.

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

Explicación

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

donde la devolución de llamada es:

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

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

y q0x.eu/3?n=...redirige a 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)
})

Originalmente estaba tratando de hacerlo legítimamente y todavía podría intentarlo, ¡pero fue divertido de todos modos!

Dom Hastings
fuente
1
Bueno, ¿por qué no HTTP, 8 caracteres q0x.eu/1 entonces? PD: las soluciones legítimas no pueden vencer a Perl de todos modos ;-) (desafío descarado)
Tomás
1
@Tomas, eso sería trampa! ;) además, solo redirige a los datos, tiene que ser interpretado como script, pensé en tener todas las llamadas de API al final y simplemente poner curl q0x.eu/1o algo, pero era demasiado vago ...
Dom Hastings
5

Ruby 175 (cuenta a través de las páginas, usando la API en lugar del 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}}"

Eso es 242 sin la URL acortada:

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

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

Créditos a Peter Tailor por la idea de usar la API, y a Charles por apuntar hacia una API mejor.

Denis de Bernardy
fuente
maldita sea, esa fue mi idea!
No es que Charles
En realidad, su uso de la API filtrada fue mejor. Hacer lo mismo aquí elimina casi 120 caracteres de mi respuesta original. :-)
Denis de Bernardy
4

Python con stackpy 160

Implementación

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

Salida

A13C60

Nota

Ayer contemplé el uso de la API de stackexchange, pero me tomó un tiempo entender cómo funciona. Hoy, vi que había un par de respuestas sobre el mismo tema. Para hacer mi respuesta un poco diferente, pensé en usar una biblioteca externa.

También tenga en cuenta que otras respuestas que se basan en el análisis de patrones como

es probable que se rompan pronto, por lo que una respuesta más definitiva es confiar en un método robusto como este.

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

Después de publicar mi respuesta, el resultado es:

A13C60
flodel
fuente
F("div","answer")y F("td","comment-text")no funciona para mí ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double') ¿No debería ser el valor predeterminado para fser en function(x)length(xmlValue(x))lugar de length, o algo similar?
plannapus
A mí me funciona ... xpathSApply(...,length)debería devolver un vector, no una lista. No estoy seguro de por qué obtendrías una lista. Y no, realmente quiero usar lengthy no function(x)length(xmlValue(x)): el objetivo es obtener un vector de 1s, uno para cada comentario o respuesta.
flodel
ok resulta que el hecho de que xpathSApplypuede tomar otras funciones (como length) xmlValuey otras similares es una novedad de la versión 3.94 del paquete (si entiendo correctamente su registro de cambios). Quizás por eso no funcionó para mí. Sí, tengo la idea de que querías un vector de 1s, pero con mi versión del paquete solo puedo lograrlo en function(...lugar de solo length.
plannapus
3

¡No puedo creer que a nadie se le haya ocurrido hasta ahora! La solución más directa para usar :-)

jQuery, 116101 caracteres (fuera de competencia)

Quizás esto no va con las reglas, lo mantengo solo por diversión: ¡no puede faltar la solución jQuery :) Al menos como referencia para probar sus scripts! ;-)

Intenta ejecutar desde la consola FireBug:

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

Si tiene una conexión lenta, aumente el tiempo de espera :-) ¡Gracias @Fez Vrasta por la gran idea de hacer clic en los enlaces "mostrar más"!


Algunas otras cosas para romper la solución de los demás, clase = "comentario" y la bomba temporizada, ja, ja

Tomás
fuente
Esto no funcionará si la página está cerrada, como lo requiere la pregunta.
bodo
Sí, jQuery funciona mal en páginas cerradas :-) Supongo que está fuera de competencia, ¡pero no puede faltar! :)
Tomas
Lo hice y mi respuesta se consideró inválida. Lo borré.
Victor Stafusa
@Victor, ¿por qué no mantenerlo solo por diversión? ¿Cuántos caracteres tuviste?
Tomás
@Tomas. Ok, lo recuperé.
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">'));

Explicación:

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

Por primera vez, PHP supera a otros idiomas en scripts de golf: ')


Algunas marcas adicionales a este tema para evitar "trucos" de expresiones regulares:

mostrar 9999 comentarios más

Fez Vrasta
fuente
2
123456 más encurtidos. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "
Licuadora
1
maldita sea, ok lo arreglará ._.
Fez Vrasta
1
"Por primera vez, PHP supera a otros idiomas en scripts de golf" Es cierto que es raro, pero ha habido algunos
plannapus
3
Bueno, nt = "99" ... su recuento de comentarios parece estar equivocado ... :-P Es especialmente irónico que alguien que castiga a los tramposos de expresiones regulares también esté engañando :-)
Tomás
1
no, pero estoy un poco aburrido de pasar la vida aquí para arreglar este estúpido guión: P
Fez Vrasta
2

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

Solo golpea la API una vez ... probablemente pueda acortarse, pero soy nuevo en Node.

No es que Charles
fuente
2

153 151 147, C # y CsQuery

C # con 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 en LINQPad o en Roslyn

Si se permite ejecutar a través de LINQPad, entonces:

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

Produce:

A14C48

Un poco más de diversión.

F # con 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
fuente
1

RESPUESTA SIN VALOR NO VÁLIDA - AQUÍ SOLO POR DIVERSIÓN

Javascript + jQuery - 155

Solo pégalo en tu consola. Asume que solo habría una 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
fuente
1
Yo creo que "La secuencia de comandos se debe ejecutar con esta página cerrada cuando se inicia." estaba destinado a descalificar este tipo de respuesta.
Peter Taylor
exactamente, esta respuesta no es válida
Fez Vrasta
Podría optimizarse mucho, pero dado que es inválido e insalvable de todos modos, no hice esfuerzos para mejorarlo.
Victor Stafusa
Simplemente podría expandir los comentarios contraídos llamando al evento de clic en cada "show x more"
Fez Vrasta