nombre de réponses et commentaires

27

Écrivez un logiciel qui imprime sur stdout le nombre de réponses et le nombre de commentaires (visibles et regroupés des questions et réponses) de cette question / page.

Votre script doit s'exécuter avec cette page fermée au démarrage.

Exemple de sortie attendue:

A12C40

Où A représente les réponses et C les commentaires.

Fez Vrasta
la source
9
Petit commentaire pour vérifier quelque chose, si cela ne vous dérange pas;)
Teun Pronk
1
Tous les commentaires
Fez Vrasta
1
Le code doit-il gérer le cas lorsque les commentaires sont réduits lorsqu'il y en a trop? Et il y a aussi le cas quand il y a trop de réponses (bien que je doute qu'il en obtienne autant).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
4
Combien de temps jusqu'à ce que quelqu'un écrive un programme qui lit la réponse la plus votée ici et l'exécute? : D
C4stor
12
Est-ce un schéma intelligent pour obtenir la question la plus consultée par des personnes testant leurs scripts?
Boann

Réponses:

18

Perl, 91 96   92 caractères

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

Quelques trucs juste pour casser les solutions des autres ha ha ha :-P

afficher 93 autres commentaires

href

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

a, montrer 99 montrer 99 ha ha

href href href ha ha haha ​​:-D

jeeez, vient de casser ma propre réponse! J'ai découvert que l'une des astuces ci-dessus, que je pensais ne rien faire, commencerait à fonctionner après que cette réponse ne soit pas modifiée pendant un certain temps! Vos solutions ne fonctionneront donc que pendant un certain temps. C'est pourquoi vous aviez vu +1 réponse de plus dans vos solutions .. C'est une bombe chronométrée! Ma réponse y est déjà sujette :-) Aaah, a trouvé un moyen de le lancer MAINTENANT ...

Tomas
la source
Dans l'intérêt de casser quelques scripts supplémentaires qui utilisent des sélecteurs css, peut-être qu'un <a href="" class="comment> lien de commentaire </a> pourrait fonctionner?
Denis de Bernardy
Denis malheureusement ne vous permettra pas d'afficher cela. Vous pouvez tester sur votre propre réponse :)
Tomas
Je vérifie> donc ce n'est pas cassable
Fès Vrasta
@FezVrasta ermm .. pas cassable? Alors comment est-ce possible que je l'ai cassé? ;)
Tomas
@Tomas bien, maintenant je vois une sortie correcte avec perl -E. Suppression de mon commentaire. Vous pouvez également supprimer votre référence à ma réponse, car vous ne la
brisez
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)

Plus lisible (avec des espaces):

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 a été utilisé comme processeur XQuery.

Réintégrer Monica - dirkk
la source
Ce serait encore plus court (en utilisant la doc()fonction) si cette page serait XML valide ...
Réintégrer Monica - dirkk
Et cela semble être la première réponse jamais sur le code-golf en utilisant XQuery ... se révèle être tout à fait approprié :)
Réintégrer Monica - dirkk
2
sur ce site je découvre chaque jour une nouvelle langue, celle-ci est assez intéressante, merci. Est-ce que ça compte les commentaires cachés?
Fez Vrasta
@FezVrasta Ouais, et XQuery est même pas ésotérique :) Oui , il fait, c'est ce que $d//*[@class="comments-link"]/bVISE (dans la balise <b> le nombre de commentaires cachés est affiché)
Réintégrer Monica - 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='')

Je suppose que cette question n'aura pas plusieurs pages de réponses.

Mixeur
la source
blender: pas de chance même avec le code bloc: P
Fez Vrasta
@FezVrasta: Je reçois A13C20. Inclure un support incliné dans l'expression régulière et je pense que cela devrait être bon, car ceux-ci sont échappés.
Blender
Oui, je l'ai déjà fait. merci
Fez Vrasta
Hmmm ... "Ignore ce truc" hein? Que se passe-t-il si quelqu'un retire cela de la réponse, alors?
Iszi
Syntaxe invalide. ,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}'

C'est la même chose que cela, mais sans rediriger vers un fichier:

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

Sortie courant

A16C76

Explication

boucle

Transférez une URL.

  • -sen curlest pour le silence. Et -Lpour suivre les redirections.
awk

Pour analyser le fichier. Comme certaines réponses avaient du code pour casser d'autres réponses, l'analyse a été modifiée de sorte qu'elle analyse depuis le début de la ligne (^) pour s'assurer qu'elle n'est pas rompue.

  • -F'[<>]'définissez les séparateurs de champ sur <ou >. De cette façon, le texte peut être analysé correctement pour "afficher XXX autres commentaires".
  • /^[\t]*>show <b>/{c+=$4}sur les lignes contenant "espaces ....> afficher", obtenez le 4ème champ (basé sur <, >séparateurs) et ajoutez la valeur au compteur de commentaires.
  • /^[ ]*<tr.*s="comm/{++c} sur les lignes contenant "espaces ...
  • /^<td.*rcell">/{++a} sur les lignes contenant "", incrémentez le compteur des réponses.
  • END{print "A"a"C"c} imprimer la sortie.
fedorqui
la source
donc il ne compte pas les commentaires effondrés?
Fez Vrasta
je pense que vous avez mélangé met fdans votre code: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"devrait être echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", non?
plannapus
@plannapus oui, erreur de copier-coller. Résolu, merci!
fedorqui
1
Je viens de tester votre code et il indique "A14C159", ce qui, je crois, n'est pas tout à fait correct.
Abhijit
1
Eh bien @Abhijit, il arrive que les gens continuent à mettre à jour leurs messages pour briser les conditions dans le reste des réponses ... Et je ne peux pas continuer à mettre à jour ma réponse chaque fois que quelqu'un met à jour la sienne: D
fedorqui
5

PHP qui fonctionne réellement (302 caractères)

Contrairement à toutes les autres réponses jusqu'à présent, cela renvoie la bonne réponse même lorsque la question se répand sur plusieurs pages.

<?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
la source
Votre nombre de commentaires est correct mais pour le moment il n'y a que 5 réponses mais votre script dit qu'il y en a 6. Est-ce que ça compte la question?
Felix Eve
@FelixEve, je pense que cela compte probablement la réponse supprimée. (count($i)-1)corrige le décompte pour ne pas inclure la question.
Peter Taylor
@PeterTaylor Comment le script peut-il voir la réponse supprimée? Il ne doit figurer dans le balisage que s'il est connecté avec un utilisateur disposant de privilèges.
Cruncher
à partir de PHP 5.4, vous pouvez utiliser []au lieu de array()pour initialiser
Einacio
Celui-ci ne fonctionnera pas réellement si le joint $ia plus de 100 éléments. (Ma propre version de la même chose en rubis n'a pas cette limitation. Bien qu'il soit vrai qu'elle peut se heurter aux limites de l'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="")

Avec indentation et explications:

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

Testé avec cette page , il donne le bon nombre de commentaires (y compris cachés) sur la première page et le bon nombre de réponses, ie A23C63.

Et voici une solution à 482 caractères qui saisit le bon nombre de commentaires si la question finit par s'étaler sur plusieurs pages:

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

Dentelé:

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

Essayé sur cette question et émis: A125C499.

plannapus
la source
+1 pour l'utilisation de R, underdog clair mais beau langage :)
Tomas
5

HTML, 37

Désolé, l'abus flagrant des règles suit!

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

Explication

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

où le rappel est:

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

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

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

J'essayais à l'origine de le faire légitimement et je pourrais peut-être encore y aller, mais c'était quand même amusant!

Dom Hastings
la source
1
Eh bien, pourquoi pas HTTP, 8 caractères q0x.eu/1 alors? PS: les solutions légitimes ne peuvent pas battre Perl de toute façon ;-) (défi flagrant)
Tomas
1
@Tomas, ce serait de la triche! ;) en plus, il ne redirige que vers les données, il doit être interprété comme un script, j'ai pensé à avoir tous les appels API en arrière-plan et juste à mettre curl q0x.eu/1ou quelque chose, mais c'était trop paresseux ...
Dom Hastings
5

Ruby 175 (compte sur plusieurs pages, en utilisant l'API au lieu du 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}}"

C'est 242 sans l'URL raccourcie:

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

Réponse précédente 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(:+)}"

Remerciements à Peter Tailor pour l'idée d'utiliser l'API et à Charles pour avoir pointé vers une meilleure API.

Denis de Bernardy
la source
putain, c'était mon idée!
Pas que Charles
En fait, votre utilisation de l'API filtrée était meilleure. Faire la même chose ici rase près de 120 caractères de ma réponse d'origine. :-)
Denis de Bernardy
4

Python avec stackpy 160

la mise en oeuvre

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

Sortie

A13C60

Remarque

Hier, j'ai envisagé d'utiliser l'API stackexchange, mais j'ai mis du temps à comprendre comment cela fonctionne. Aujourd'hui, j'ai vu qu'il y avait quelques réponses sur le même thème. Pour rendre ma réponse un peu différente, j'ai pensé à utiliser une bibliothèque externe.

Sachez également que d'autres réponses qui reposent sur l'analyse de modèles comme

sont susceptibles de se casser à tout moment, donc une réponse plus définitive est de s'appuyer sur une méthode robuste comme celle-ci.

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

Après avoir posté ma réponse, la sortie est:

A13C60
flodel
la source
F("div","answer")et F("td","comment-text")ne fonctionne pas pour moi ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). Ne doit pas la valeur par défaut pour fêtre au function(x)length(xmlValue(x))lieu de length, ou quelque chose de similaire?
plannapus
Cela fonctionne pour moi ... xpathSApply(...,length)devrait renvoyer un vecteur, pas une liste. Je ne sais pas pourquoi vous obtiendriez une liste. Et non, je veux vraiment utiliser lengthet non function(x)length(xmlValue(x)): le but est d'obtenir un vecteur de 1s, un pour chaque commentaire ou réponse.
flodel
ok s'avère que le fait que xpathSApplypeut prendre d'autres fonctions (comme length) que des fonctions xmlValuesimilaires est une nouveauté de la version 3.94 du paquet (si je comprends bien leur changelog). C'est peut-être pourquoi cela n'a pas fonctionné pour moi. Oui, j'ai eu l'idée que vous vouliez un vecteur de 1, mais avec ma version du package, je ne peux y parvenir qu'avec function(...au lieu de juste length.
plannapus
3

Je ne peux pas croire que personne ne l'a inventé jusqu'à présent! Solution la plus directe à utiliser :-)

jQuery, 116 101 caractères (hors compétition)

Peut-être que cela ne va pas avec les règles, je le garde juste pour le plaisir - la solution jQuery ne peut pas manquer :) Au moins comme référence pour tester vos scripts !!! ;-)

Essayez d'exécuter à partir de la console FireBug:

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

Si vous avez une connexion lente, augmentez le délai :-) Merci @Fez Vrasta pour la bonne idée de cliquer sur les liens "afficher plus"!


Quelques autres trucs pour casser la solution des autres, class = "comment" et la bombe chronométrée ha ha

Tomas
la source
Cela ne fonctionnera pas si la page est fermée, comme l'exige la question.
bodo
Ouais, jQuery fonctionne mal sur les pages fermées :-) Je suppose que c'est hors compétition alors, mais ne peut pas vraiment manquer! :)
Tomas
Je l'ai fait et ma réponse a été jugée invalide. Je l'ai effacé.
Victor Stafusa
@Victor, pourquoi ne pas le garder juste pour le plaisir? Combien de caractères aviez-vous?
Tomas
@Tomas. Ok, je l'ai restitué.
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">'));

Explication:

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

Pour la première fois, PHP bat d'autres langages dans les scripts de golf: ')


Quelques balises supplémentaires à ce sujet pour éviter les "tricheurs" regex:

Afficher 9 999 autres commentaires

Fez Vrasta
la source
2
123456 plus de cornichons. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "
Blender
1
bon sang, ok va le réparer ._.
Fez Vrasta
1
"pour la première fois PHP bat d'autres langages dans les scripts de golf" C'est vrai que c'est rare, mais il y en a eu quelques uns
plannapus
3
Eh bien, nt = "99" ... votre nombre de commentaires semble être faux ... :-P Il est particulièrement ironique que quelqu'un qui punit les tricheurs de regex triche aussi :-)
Tomas
1
non mais je m'ennuie un peu de passer la vie ici pour réparer ce stupide script: P
Fez Vrasta
2

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

Ne frappe l'API qu'une seule fois ... peut probablement être raccourci, mais je suis nouveau sur Node.

Pas que Charles
la source
2

153 151 147, Requête C # & Cs

C # avec CsQuery:

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

Programme complet:

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 dans LINQPad ou à Roslyn

Si l'exécution via LINQPad est autorisée, alors:

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

Produit:

A14C48

Un peu plus de plaisir.

F # avec 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
la source
1

RÉPONSE NON VALIDÉE INVALIDE - ICI JUSTE POUR LE PLAISIR

Javascript + jQuery - 155

Collez-le simplement dans votre console. Suppose qu'il n'y aurait qu'une seule page:

(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
la source
1
Je pense que "Votre script doit s'exécuter avec cette page fermée lorsqu'elle démarre." était destiné à disqualifier ce genre de réponse.
Peter Taylor
exactement, cette réponse n'est pas valide
Fez Vrasta
Pourrait être optimisé beaucoup, mais comme il est de toute façon invalide et inaltérable, je n'ai pas fait d'efforts pour l'améliorer.
Victor Stafusa
Vous pouvez simplement développer les commentaires
réduits