numero di risposte e commenti


27

Scrivi un software che stampa su stdout il numero di risposte e il numero di commenti (visibili e compressi di domande e risposte) di questa domanda / pagina.

Lo script deve essere eseguito con questa pagina chiusa all'avvio.

Esempio di output previsto:

A12C40

Dove A sta per Risposte e C per Commenti.


9
Piccolo commento per controllare qualcosa, se non ti dispiace;)
Teun Pronk

1
Tutti i commenti
Fez Vrasta,

1
Il codice deve gestire il caso quando i commenti vengono compressi quando ce ne sono troppi? E c'è anche il caso in cui ci sono troppe risposte (anche se dubito che otterrà così tante).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4
Quanto tempo prima che qualcuno scriva un programma che legge la risposta più votata qui ed esegue? : D
C4stor,

12
È uno schema intelligente per ottenere la domanda più vista attraverso le persone che testano i loro script?
Boann,

Risposte:


18

Perl, 91 96   92 caratteri

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

Alcune cose solo per rompere le soluzioni di altri ah ah ah :-P

mostra altri 93 commenti

href

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

a, mostra 99 mostra 99 ha ha

href href href ah ah ah ah MrGreen

Dio, ho appena rotto la mia risposta! Ho scoperto che uno dei trucchi di cui sopra, che pensavo non facesse nulla, inizierà a funzionare dopo che questa risposta non è stata modificata per qualche tempo! Quindi le tue soluzioni funzioneranno solo per qualche tempo. Ecco perché hai visto +1 risposta in più nelle tue soluzioni .. È una bomba a tempo! La mia risposta è già incline :-) Aaah, ho trovato il modo di lanciarlo ORA ...


Nell'interesse di rompere qualche altro script che utilizza i selettori CSS, forse un <a href="" class="comment> link di commento </a> potrebbe funzionare?
Denis de Bernardy,

Denis sfortunatamente SE non ti permetterà di mostrarlo. Puoi provare con la tua risposta :)
Tomas,

Controllo> quindi non è fragile
Fez Vrasta

@FezVrasta ermm .. non infrangibile? Allora come è possibile che l'ho rotto? ;)
Tomas,

@Tomio bene, ora vedo un output corretto con perl -E. Eliminare il mio commento Inoltre puoi eliminare il tuo riferimento alla mia risposta, dato che non lo stai più
risolvendo

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)

Più leggibile (con spazi):

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 è stato usato come processore XQuery.


Sarebbe ancora più breve (utilizzando la doc()funzione di), se questa pagina sarebbe XML valido ...
Ripristinare Monica - dirkk

E questa sembra essere la prima risposta sempre sul codice-golf utilizzando XQuery ... si rivela essere molto adatto :)
Ripristinare Monica - dirkk

2
su questo sito scopro ogni giorno una nuova lingua, questa è piuttosto interessante, grazie. Conta i commenti nascosti?
Fez Vrasta,

@FezVrasta Sì, e XQuery non è nemmeno esoterica :) Sì è così, questo è quello che $d//*[@class="comments-link"]/bè per (nel tag <b> è indicato il numero di commenti nascosti)
Ripristinare 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='')

Suppongo che questa domanda non avrà più pagine di risposte.


blender: nessuna fortuna anche con il codice blocco: P
Fez Vrasta

@FezVrasta: sto arrivando A13C20. Includi una parentesi angolata nel regex e penso che dovrebbe essere buono, poiché quelli sono sfuggiti.
Blender,

Sì, l'ho già fatto. grazie
Fez Vrasta,

Hmmm ... "Ignora questa roba" eh? Cosa succede se qualcuno lo modifica dalla risposta, allora?
Iszi,

Sintassi non valida. ,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}'

Che è lo stesso di questo, ma senza reindirizzare a un file:

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

Uscita corrente

A16C76

Spiegazione

arricciare

Trasferisci un URL.

  • -sin curlè per il silenzio. E -Lseguire i reindirizzamenti.
awk

Per analizzare il file. Poiché alcune risposte avevano del codice per infrangere altre risposte, l'analisi è stata modificata in modo che analizzi dall'inizio della riga (^) per assicurarsi che non sia interrotta.

  • -F'[<>]'imposta i separatori di campo come <o >. In questo modo il testo può essere analizzato correttamente per "mostra altri XXX commenti".
  • /^[\t]*>show <b>/{c+=$4}sulle righe contenenti "spazi ....> mostra", ottieni il quarto campo (basato su <,> separatori) e aggiungi il valore al contatore dei commenti.
  • /^[ ]*<tr.*s="comm/{++c} su righe contenenti "spazi ...
  • /^<td.*rcell">/{++a} sulle righe contenenti "", incrementa il contatore delle risposte.
  • END{print "A"a"C"c} stampa l'output.

quindi non conta i commenti compressi?
Fez Vrasta,

penso che tu abbia mescolato me fnel tuo codice: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"dovrebbe essere echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", no?
plannapus,

@plannapus sì, errore dalla copia incolla. Risolto, grazie!
fedorqui,

1
Ho appena testato il tuo codice e riporta "A14C159", che credo non sia del tutto corretto.
Abhijit,

1
Bene @Abhijit capita che le persone continuino ad aggiornare i loro post per infrangere le condizioni nel resto delle risposte ... E non posso continuare ad aggiornare la mia risposta ogni volta che qualcuno aggiorna il suo: D
fedorqui

5

PHP che funziona effettivamente (302 caratteri)

A differenza di tutte le altre risposte finora, questo restituisce la risposta corretta anche quando la domanda si estende su più di una pagina.

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

Il tuo numero di commenti è corretto, ma al momento ci sono solo 5 risposte ma lo script dice che ci sono 6. Sta contando la domanda?
Felix Eve,

@FelixEve, penso che probabilmente stia contando la risposta eliminata. (count($i)-1)corregge il conteggio per non includere la domanda.
Peter Taylor,

@PeterTaylor Come può lo script vedere la risposta eliminata? Dovrebbe essere incluso nel markup solo se si è effettuato l'accesso con un utente con privilegi.
Cruncher,

da PHP 5.4 puoi usare []invece di array()inizializzare
Einacio

Questo in realtà non funzionerà se lì l'unione $iha oltre 100 elementi. (La mia versione della stessa in ruby non ha questa limitazione. Anche se, ammettiamolo, potrebbe imbattersi nei limiti 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 rientro e spiegazioni:

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

Testato con questa pagina , fornisce il giusto numero di commenti (incluso nascosto) sulla prima pagina e il giusto numero di risposte, ad es A23C63.

Ed ecco una soluzione a 482 caratteri che acquisisce il numero corretto di commenti se la domanda finisce per diffondersi su più pagine:

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

rientrato:

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

Provato su questa domanda e in uscita: A125C499.


+1 per l'utilizzo di R, chiaro perdente ma bel linguaggio :)
Tomas

5

HTML, 37

Siamo spiacenti, segue l'abuso delle regole palese!

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

Spiegazione

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

dove si trova il callback:

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

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

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

Inizialmente stavo cercando di farlo legittimamente e potevo ancora provare, ma è stato comunque divertente!


1
Bene, perché non HTTP, 8 caratteri q0x.eu/1 allora? PS: le soluzioni legittime non possono comunque battere Perl ;-) (sfacciata sfida)
Tomas

1
@Tomas, sarebbe barare! ;) inoltre reindirizza solo ai dati, deve essere interpretato come script, ho pensato di avere tutte le chiamate API back-end e bastacurl q0x.eu/1 o qualcosa del genere, ma era troppo pigro ...
Dom Hastings

5

Ruby 175 (conta tra le pagine, usando l'API anziché il 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}}"

Questo è 242 senza l'URL abbreviato:

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 precedente risposta:

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

Ringraziamo Peter Tailor per l'idea di utilizzare l'API e Charles per aver puntato verso un'API migliore.


dannazione, questa era la mia idea!
Non che Charles

In realtà, l'utilizzo dell'API filtrata è stato migliore. Fare lo stesso qui elimina quasi 120 caratteri dalla mia risposta originale. :-)
Denis de Bernardy,

4

Python con stackpy 160

Implementazione

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

Produzione

A13C60

Nota

Ieri ho pensato di utilizzare l'API stackexchange, ma mi sono preso del tempo per capire come funziona. Oggi ho visto che c'erano un paio di risposte sullo stesso tema. Per rendere la mia risposta un po 'diversa, ho pensato di usare una libreria esterna.

Comprendi anche che altre risposte che si basano sull'analisi di modelli simili

è probabile che si rompano in qualsiasi momento presto, quindi una risposta più definita è affidarsi a un metodo solido come questo.


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

Dopo aver pubblicato la mia risposta, l'output è:

A13C60

F("div","answer")e F("td","comment-text")non funziona per me ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). L'impostazione predefinita non dovrebbe fessere function(x)length(xmlValue(x))invece di length, o qualcosa di simile?
plannapus,

Funziona per me ... xpathSApply(...,length)dovrebbe restituire un vettore, non un elenco. Non sono sicuro del motivo per cui potresti ottenere un elenco. E no, intendo davvero usare lengthe non function(x)length(xmlValue(x)): l'obiettivo è quello di ottenere un vettore di 1s, uno per ogni commento o risposta.
flodel

ok risulta che il fatto che xpathSApplypuò assumere altre funzioni (come length) di xmlValuee simili è una novità dalla versione 3.94 del pacchetto (se capisco correttamente il loro log delle modifiche). Questo potrebbe essere il motivo per cui non ha funzionato per me. Sì, ho avuto l'idea che volevi un vettore di 1s, ma con la mia versione del pacchetto posso ottenerlo solo con function(...invece di solo length.
plannapus,

3

Non riesco a credere che nessuno se ne sia inventato fino ad ora! La soluzione più diretta da usare :-)

jQuery, 116 101 caratteri (fuori concorso)

Forse questo non va con le regole, lo tengo solo per divertimento - la soluzione jQuery non può mancare :) Almeno come riferimento per testare i tuoi script !!! ;-)

Prova a eseguire dalla console FireBug:

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

Se hai una connessione lenta, aumenta il timeout :-) Grazie @Fez Vrasta per la grande idea di fare clic sui link "mostra altro"!


Alcune altre cose per rompere la soluzione di altri, class = "comment" e la bomba a tempo ah ah


Questo non funzionerà se la pagina è chiusa, come richiede la domanda.
bodo,

Sì, jQuery si comporta male su pagine chiuse :-) Immagino sia fuori concorso, ma non può davvero mancare! :)
Tomas,

L'ho fatto e la mia risposta è stata considerata non valida. L'ho cancellato.
Victor Stafusa,

@Victor, perché non tenerlo solo per divertimento? Quanti caratteri hai avuto?
Tomas,

@Tomas. Ok, l'ho cancellato.
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">'));

Spiegazione:

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

Per la prima volta PHP batte altre lingue negli script di golf: ')


Qualche markup aggiuntivo su questo argomento per evitare "trucchi" regex:

mostra altri 9999 commenti


2
123456 più sottaceti. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell"
Frullatore

1
accidenti a te, ok lo aggiusterà ._.
Fez Vrasta,

1
"per la prima volta PHP batte altre lingue negli script di golf" È vero che è raro, ma ci sono stati alcuni
plannapus,

3
Bene, nt = "99" ... il tuo conteggio dei commenti sembra essere sbagliato ... :-P È particolarmente ironico che qualcuno che punisce i traditori di regex stia barando :-)
Tomas

1
no ma sono un po 'annoiato di passare la vita qui a sistemare questo stupido copione: 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)))})})

Colpisce l'API solo una volta ... probabilmente può essere abbreviato, ma sono nuovo di Node.


2

153 151 147, C # e CsQuery

C # Con CsQuery:

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

Programma 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 in LINQPad o in Roslyn

Se è consentito eseguire LINQPad:

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

produce:

A14C48

Un po 'più divertente.

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 

1

RISPOSTA NON ELIMINATA NON VALIDA - QUI SOLO PER DIVERTIMENTO

Javascript + jQuery - 155

Basta incollarlo nella tua console. Suppone che ci sarebbe una sola pagina:

(function(){var n=$(".comment").length;$(".comments-link b").each(function(g,f){n+=parseInt($(f).html())});return"A"+$("#answers .answer").length+"C"+n})()

1
Io penso che "Lo script deve essere eseguito con questa pagina chiusa quando viene avviato." doveva squalificare questo tipo di risposta.
Peter Taylor,

esattamente, questa risposta non è valida
Fez Vrasta,

Potrebbe essere ottimizzato molto, ma dal momento che non è valido e invalicabile comunque, non ho fatto sforzi per migliorarlo.
Victor Stafusa,

Potresti semplicemente espandere i commenti compressi chiamando l'evento click su ogni "mostra x altro"
Fez Vrasta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.