liczba odpowiedzi i komentarzy

27

Napisz oprogramowanie, które drukuje na standardowe wyjście, liczbę odpowiedzi i liczbę komentarzy (widocznych i zwiniętych z pytania i odpowiedzi) do tego pytania / strony.

Twój skrypt musi działać przy zamkniętej stronie podczas uruchamiania.

Oczekiwany przykładowy wynik:

A12C40

Gdzie A oznacza odpowiedzi, a C komentarze.

Fez Vrasta
źródło
9
Mały komentarz, aby coś sprawdzić, jeśli nie masz nic przeciwko;)
Teun Pronk
1
Wszystkie komentarze
Fez Vrasta
1
Czy kod musi obsługiwać przypadek, gdy komentarze są zwinięte, gdy jest ich zbyt wiele? I jest tak również w przypadku, gdy jest zbyt wiele odpowiedzi (choć wątpię, że otrzyma tyle).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
4
Jak długo trzeba czekać, aż ktoś napisze program, który przeczyta tutaj najbardziej pożądaną odpowiedź i uruchomi go? : D
C4stor
12
Czy to sprytny sposób na uzyskanie najczęściej oglądanego pytania przez osoby testujące swoje skrypty?
Boann

Odpowiedzi:

18

Perl, 91 96   92 znaków

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

Niektóre rzeczy po prostu łamią rozwiązania innych ha ha ha :-P

pokaż 93 więcej komentarzy

href

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

a, pokaż 99 pokaż 99 ha ha

href href href ha ha haha ​​:-D

Jezu, właśnie złamałem własną odpowiedź! Odkryłem, że jedna z powyższych sztuczek, która, jak sądzę, nic nie robi, zacznie działać po tym, jak ta odpowiedź nie będzie edytowana przez pewien czas! Twoje rozwiązania będą działać tylko przez pewien czas. Właśnie dlatego widziałeś +1 odpowiedzi w swoich rozwiązaniach. To bomba na czas! Moja odpowiedź jest już na to podatna :-) Aaah, znalazłem sposób, aby uruchomić ją TERAZ ...

Tomas
źródło
W interesie złamania kilku innych skryptów, które używają selektorów css, być może <a href="" class="comment> link do komentarza </a> może zadziałać?
Denis de Bernardy
Denis niestety nie pozwoli Ci tego wyświetlić. Możesz przetestować na własną odpowiedź :)
Tomas
Sprawdzam, czy> nie jest to łamliwe
Fez Vrasta
@ FezVrasta ermm .. niełamliwy? Więc jak to możliwe, że go złamałem? ;)
Tomas
@Tomas dobrze, teraz widzę prawidłowe wyjście z perl -E. Usuwam mój komentarz. Możesz także usunąć swoje odniesienie do mojej odpowiedzi, ponieważ już go nie
łamiesz
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)

Bardziej czytelny (ze spacjami):

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 został użyty jako procesor XQuery.

Przywróć Monikę - sztylet
źródło
Byłby jeszcze krótszy (przy użyciu doc()funkcji), gdyby ta strona była poprawnym
kodem
I wydaje się, że jest to pierwsza odpowiedź na temat gry w golfa przy użyciu XQuery ... okazuje się być całkiem odpowiednia :)
Przywróć Monikę - dirkk
2
na tej stronie każdego dnia odkrywam nowy język, ten jest całkiem interesujący, dzięki. Czy to liczy ukryte komentarze?
Fez Vrasta
@FezVrasta Tak, a XQuery nie jest nawet ezoteryczny :) Tak, właśnie po $d//*[@class="comments-link"]/bto (w tagu <b> pokazana jest liczba ukrytych komentarzy)
Przywróć Monikę - 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='')

Zakładam, że to pytanie nie będzie zawierało wielu stron odpowiedzi.

Mikser
źródło
mikser: brak szczęścia nawet z kodem blokowym: P
Fez Vrasta
@FezVrasta: Dostaję A13C20. Uwzględnij nawias kątowy w wyrażeniu regularnym i myślę, że powinien być dobry, ponieważ są one usuwane.
Blender
Tak, już to zrobiłem. dzięki
Fez Vrasta
Hmmm ... „Zignoruj ​​to”, co? Co stanie się, jeśli ktoś to zmieni z odpowiedzi?
Iszi
Niepoprawna składnia. ,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}'

Który jest taki sam jak ten, ale bez przekierowywania do pliku:

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

Wyjście prądowe

A16C76

Wyjaśnienie

kędzior

Przenieś adres URL.

  • -sw curljest dla milczenia. I -Lpodążać za przekierowaniami.
awk

Aby przeanalizować plik. Ponieważ niektóre odpowiedzi zawierały kod do łamania innych odpowiedzi, parsowanie zostało zmienione tak, że analizuje od początku wiersza (^), aby upewnić się, że nie jest zepsute.

  • -F'[<>]'ustaw separatory pól jako <lub >. W ten sposób tekst może zostać poprawnie przeanalizowany pod kątem „pokaż więcej komentarzy w XXX”.
  • /^[\t]*>show <b>/{c+=$4}na liniach zawierających „obowiązuje ....> show”, dostać 4. pola (na podstawie <, >separatory) i dodać wartość do komentarzy licznika.
  • /^[ ]*<tr.*s="comm/{++c} w wierszach zawierających „spacje ...
  • /^<td.*rcell">/{++a} w wierszach zawierających „” zwiększ licznik odpowiedzi.
  • END{print "A"a"C"c} wydrukować wynik.
fedorqui
źródło
więc nie liczy zwiniętych komentarzy?
Fez Vrasta
myślę, że masz pomieszane mi fkod: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"powinno być echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", nie?
plannapus
@plannapus tak, błąd z wklejania kopii. Rozwiązany, dzięki!
fedorqui
1
Właśnie przetestowałem twój kod i zgłasza on „A14C159”, co moim zdaniem nie jest całkiem poprawne.
Abhijit
1
Cóż, @Abhijit zdarza się, że ludzie aktualizują swoje posty, aby przełamać warunki w pozostałych odpowiedziach ... I nie mogę aktualizować mojej odpowiedzi za każdym razem, gdy ktoś aktualizuje jego: D
fedorqui
5

PHP, które faktycznie działa (302 znaków)

W przeciwieństwie do wszystkich innych dotychczasowych odpowiedzi, zwraca poprawną odpowiedź, nawet jeśli pytanie rozlewa się na więcej niż jedną stronę.

<?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
źródło
Twoja liczba komentarzy jest poprawna, ale w tej chwili jest tylko 5 odpowiedzi, ale twój skrypt mówi, że jest 6. Czy to liczy się pytanie?
Felix Eve
@ FelixEve, myślę, że prawdopodobnie liczy usuniętą odpowiedź. (count($i)-1)koryguje liczbę, aby nie uwzględniać pytania.
Peter Taylor,
@PeterTaylor W jaki sposób skrypt może zobaczyć usuniętą odpowiedź? Powinien znajdować się w znacznikach tylko wtedy, gdy zaloguje się użytkownik z uprawnieniami.
Cruncher
z PHP 5.4 możesz użyć []zamiast array()zainicjować
Einacio
Ten nie będzie działał, jeśli dołączyło $iponad 100 przedmiotów. (Moja własna wersja tego samego w Ruby nie ma tego ograniczenia. Chociaż wprawdzie może wpaść w limity 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="")

Z wcięciem i objaśnieniami:

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

Przetestowany na tej stronie , daje odpowiednią liczbę komentarzy (w tym ukrytych) na pierwszej stronie i odpowiednią liczbę odpowiedzi, tj A23C63.

A oto rozwiązanie 482 znaków, które zbierają odpowiednią liczbę komentarzy, jeśli pytanie ostatecznie rozłoży się na kilku stronach:

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

Zębaty:

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

Próbowaliśmy na to pytanie i wyprowadzane: A125C499.

plannapus
źródło
+1 za użycie R, wyraźny słaby, ale piękny język :)
Tomas
5

HTML, 37

Niestety, nastąpiło nadużycie reguły Blatant!

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

Wyjaśnienie

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

gdzie jest callback:

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

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

i q0x.eu/3?n=...przekierowuje na 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)
})

Początkowo starałem się to zrobić zgodnie z prawem i nadal mogę spróbować, ale i tak było to zabawne!

Dom Hastings
źródło
1
Dlaczego więc nie HTTP, 8 znaków q0x.eu/1 ? PS: legalne rozwiązania i tak nie mogą pokonać Perla ;-) (rażące wyzwanie)
Tomas
1
@Tomas, to byłoby oszustwo! ;) plus to tylko przekierowuje do danych, musi to być interpretowane jako skrypt, myślałem o tym, żeby wszystkie wywołania API były back-end i po prostu wstawiały curl q0x.eu/1czy coś, ale było zbyt leniwe ...
Dom Hastings
5

Ruby 175 (liczy się między stronami, używając API zamiast 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}}"

To 242 bez skróconego adresu 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}}"

Poprzednia 291 odpowiedź:

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

Podziękowania dla Petera Tailora za pomysł użycia interfejsu API i Charlesa za wskazanie lepszego interfejsu API.

Denis de Bernardy
źródło
cholera, to był mój pomysł!
Nie, że Charles
W rzeczywistości korzystanie z filtrowanego interfejsu API było lepsze. Robiąc to samo, golę prawie 120 znaków z mojej oryginalnej odpowiedzi. :-)
Denis de Bernardy
4

Python ze stosowym 160

Realizacja

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

Wydajność

A13C60

Uwaga

Wczoraj zastanawiałem się nad użyciem API stackexchange, ale trochę czasu zajęło mi zrozumienie, jak to działa. Dzisiaj zobaczyłem, że było kilka odpowiedzi na ten sam temat. Aby nieco zmienić moją odpowiedź, pomyślałem o użyciu biblioteki zewnętrznej.

Zrozum również, że inne odpowiedzi, które opierają się na analizie wzorców, takich jak

prawdopodobnie pękną w najbliższym czasie, więc bardziej konkretną odpowiedzią jest poleganie na solidnej metodzie takiej jak ta.

Abhijit
źródło
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="")

Po opublikowaniu mojej odpowiedzi wynik jest następujący:

A13C60
flodel
źródło
F("div","answer")i F("td","comment-text")nie działa dla mnie ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). Nie powinno domyślny dla fbyć function(x)length(xmlValue(x))zamiast length, lub coś podobnego?
plannapus
Działa dla mnie ... xpathSApply(...,length)powinien zwrócić wektor, a nie listę. Nie jestem pewien, dlaczego miałbyś dostać listę. I nie, naprawdę chcę użyć, lengtha nie function(x)length(xmlValue(x)): celem jest uzyskanie wektora 1s, jednego dla każdego komentarza lub odpowiedzi.
flodel
ok okazuje się, że xpathSApplymoże przyjmować inne funkcje (jak length) niż xmlValuei podobne to nowość od wersji 3.94 pakietu (jeśli dobrze rozumiem ich dziennik zmian). Być może dlatego nie działało to dla mnie. Tak, wpadłem na pomysł, że chcesz wektor 1s, ale w mojej wersji pakietu mogę to osiągnąć tylko function(...zamiast length.
plannapus
3

Nie mogę uwierzyć, że nikt do tej pory nie wymyślił! Najbardziej bezpośrednie rozwiązanie :-)

jQuery, 116 101 znaków (poza zawodami)

Być może nie jest to zgodne z zasadami, zachowuję to dla zabawy - nie można pominąć rozwiązania jQuery :) Przynajmniej jako odniesienie do przetestowania twoich skryptów !!! ;-)

Spróbuj uruchomić z konsoli FireBug:

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

Jeśli masz wolne połączenie, zwiększ limit czasu :-) Dzięki @Fez Vrasta za świetny pomysł kliknięcia linków „pokaż więcej”!


Niektóre inne rzeczy do rozwiązania rozwiązania innych, class = "comment" i bombardowana ha ha ha

Tomas
źródło
To nie zadziała, jeśli strona jest zamknięta, tak jak wymaga tego pytanie.
Bodo
Tak, jQuery radzi sobie słabo na zamkniętych stronach :-) Wydaje mi się, że jest to poza konkurencją, ale tak naprawdę nie można tego przegapić! :)
Tomas
Zrobiłem to, a moja odpowiedź została uznana za nieważną. Usunąłem to.
Victor Stafusa,
@Victor, dlaczego nie zachować dla zabawy? Ile masz znaków?
Tomas
@Tomas. Ok, usunąłem to.
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">'));

Wyjaśnienie:

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

Po raz pierwszy PHP pokonuje inne języki w skryptach golfowych: ')


Kilka dodatkowych znaczników do tego tematu, aby uniknąć wyrażeń regularnych „cheats”:

pokaż 9999 więcej komentarzy

Fez Vrasta
źródło
2
123456 więcej pikli. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "
Blender
1
cholera, ok to naprawię ._.
Fez Vrasta
1
„po raz pierwszy PHP pokonuje inne języki w skryptach golfowych” To prawda, że ​​jest to rzadkie, ale było ich kilka
plannapus
3
No cóż, nt = "99" ... liczba twoich komentarzy wydaje się nieprawidłowa ...: -P Szczególnie ironiczne jest to, że ktoś karający oszustów wyrażających regularność również oszukuje :-)
Tomas
1
nie, ale jestem trochę znudzony spędzaniem życia tutaj, aby naprawić ten głupi skrypt: P
Fez Vrasta
2

Węzeł, 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)))})})

Uderza w API tylko raz ... prawdopodobnie można go skrócić, ale jestem nowy w Node.

Nie ten Charles
źródło
2

153 151 147, C # i CsQuery

C # Z CsQuery:

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

Pełny program:

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 # i CsQuery w LINQPad lub w Roslyn

Jeśli uruchamianie przez LINQPad jest dozwolone, wówczas:

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

Produkuje:

A14C48

Więcej zabawy.

F # z 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
źródło
1

NIEPRAWIDŁOWA ODPOWIEDZIALNA ODPOWIEDŹ - TU TYLKO DLA ZABAWY

JavaScript + jQuery - 155

Po prostu wklej go w konsoli. Zakłada, że ​​byłaby tylko jedna strona:

(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
źródło
1
Myślę , że „Twój skrypt musi być uruchamiany przy zamkniętej stronie podczas uruchamiania”. miał zdyskwalifikować tego rodzaju odpowiedź.
Peter Taylor,
dokładnie ta odpowiedź jest nieprawidłowa
Fez Vrasta
Można wiele zoptymalizować, ale ponieważ i tak jest on nieprawidłowy i niemożliwy do odzyskania, nie starałem się go ulepszać.
Victor Stafusa,
Możesz po prostu rozwinąć zwinięte komentarze wywołujące zdarzenie kliknięcia na każdym „pokaż x więcej”
Fez Vrasta