cevap ve yorum sayısı


27

Bu soru / sayfanın cevap sayısını ve yorum sayısını (görülebilir ve daraltılmış olarak daraltılarak) üzerine yazdıran bir yazılım yazın.

Komut dosyanız başladığında bu sayfa kapalıyken çalıştırılmalıdır.

Beklenen örnek çıktı:

A12C40

A Cevaplar ve Yorumlar için C anlamına gelir.


9
Sakıncası yoksa bir şeyi kontrol etmek için küçük yorum;)
Teun Pronk

1
Tüm yorumlar
Fez Vrasta

1
Yorumlar çok fazla olduğunda daraltıldığında kodun üstesinden gelmek zorunda mı? Ayrıca, çok fazla cevap olduğu zaman da söz konusu. (Bu kadarını alacağından şüpheliyim).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4
Birisi burada en çok oy alan cevabı okuyan ve çalıştıran bir program yazana kadar ne kadar sürecek? : D
C4stor

12
Bu, senaryolarını test eden insanlar aracılığıyla en çok izlenen soruyu bulmak için akıllıca bir plan mıdır?
Boann

Yanıtlar:


18

Perl, 91 96   92 karakter

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

Bazı şeyler sadece başkalarının çözümlerini kırmak için ha ha ha :-P

93 yorum daha göster

href

nt = "99" (@Fez Vrasta'da çarpışma)

a, göster 99 göster 99 ha ha

href href href ha ha haha ​​:-D

jeeez, sadece kendi cevabımı kırdım! Hiçbir şey yapmadığını düşündüğüm yukarıdaki numaralardan birinin, bu cevabın bir süre için düzeltilmeden sonra çalışmaya başlayacağını keşfettim ! Böylece çözümleriniz sadece bir süre çalışacaktır. Bu yüzden çözümlerinde +1 cevap daha bulmuştun .. Zamanlı bomba! Cevabım zaten eğilimli :-) Aaah, ŞİMDİ başlatmak için bir yol buldu ...


Css seçicilerini kullanan birkaç komut dosyasını kırmak için belki bir <a href="" class="comment> yorum bağlantısı </a> işe yarayabilir mi?
Denis de Bernardy

Ne yazık ki Denis unfortunatelly SE bunu göstermenize izin vermez. Kendi cevabınızla test edebilirsiniz :)
Tomas

Kontrol ediyorum> bu yüzden kırılmaz
Fez Vrasta

@FezVrasta ermm .. kırılmaz mı? O zaman kırdığımdan nasıl mümkün olabilir? ;)
Tomas

@ İyi Tom, şimdi uygun bir çıktı görüyorum perl -E. Yorumumu siliyorum. Ayrıca cevabımı referansınızı silebilirsiniz, çünkü artık onu
kırmazsınız

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)

Daha okunabilir (boşluklu):

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 , XQuery işlemci olarak kullanıldı.


doc()Bu sayfa geçerli XML olsaydı daha da kısa olurdu ( işlevi kullanarak ) ...
Monica'yı yeniden yerleştirin - dirkk

Ve bu XQuery'yi kullanarak şimdiye kadar ilk cevap kod golf gibi görünüyor ... Oldukça :) uygun olarak çıkıyor
dirkk - Eski Monica

2
Bu sitede her gün yeni bir dil keşfediyorum, bu oldukça ilginç, teşekkürler. Gizli yorumları sayar mı?
Fez Vrasta

@FezVrasta Evet, ve XQuery bile ezoterik değil :) Evet, öyle, bunun için ne $d//*[@class="comments-link"]/bvar (<b> etiketinde gizli yorumların sayısı gösterilir)
Monica’yı eski durumuna getirin - 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='')

Bu sorunun birden fazla cevap sayfası olmayacağını varsayıyorum.


blender: blok kodda bile şans yok: P
Fez Vrasta

@FezVrasta: Ben alıyorum A13C20. Regex'e açılı bir braket ekleyin ve kaçtıkları için iyi olması gerektiğini düşünüyorum.
Blender

Evet zaten yaptım. teşekkürler
Fez Vrasta

Hmmm ... "Bu şeyleri görmezden gel" ha? Öyleyse, biri bunu cevap dışında düzenlerse ne olur?
Iszi

Geçersiz sözdizimi ,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}'

Aynı olan, ancak bir dosyaya yönlendirmeden:

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

Akım çıkışı

A16C76

açıklama

bukle

Bir URL'yi aktarın.

  • -siçinde curlsessiz içindir. Ve -Lyönlendirmeleri takip etmek.
awk

Dosyayı ayrıştırmak için. Bazı cevaplar diğer cevapları bozacak bir kod içerdiğinden, ayrılmadığından emin olmak için ayrıştırma işlemi satırın başından ayrışacak şekilde değiştirildi (^).

  • -F'[<>]'alan ayırıcıları <veya olarak ayarlayın >. Bu şekilde, "XXX daha fazla yorum göster" için metin uygun şekilde ayrıştırılabilir.
  • /^[\t]*>show <b>/{c+=$4}"boşluk ....> gösteriyi" içeren hatlarında, (dayanan 4 alanı açıp <, >ayırıcılar) ve karşı yorumların değer katmak.
  • /^[ ]*<tr.*s="comm/{++c} boşluk içeren satırlarda ...
  • /^<td.*rcell">/{++a} "" içeren satırlarda, cevap sayacını arttırın.
  • END{print "A"a"C"c} çıktıyı yazdır.

Yani çökmüş yorumları saymaz?
Fez Vrasta

bence karışık mve fkodunuzda: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"olmalı echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", hayır?
plannapus

@ plannapus evet, kopyala yapıştırma hatası. Çözüldü, teşekkürler!
fedorqui

1
Sadece kodunuzu sınayın ve "A14C159" bildiriyor, ki bunun doğru olmadığını düşünüyorum.
Abhijit

1
Eh @Abhijit, insanların cevapların geri kalanındaki koşulları kırmak için mesajlarını güncellemeye devam ediyor ... Ve biri her gün güncellediğinde cevabımı güncellemeye devam edemiyorum: D
fedorqui

5

Gerçekten çalışan PHP (302 karakter)

Şimdiye kadarki diğer cevapların aksine, soru birden fazla sayfaya döküldüğü zaman bile doğru cevabı verir.

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

Yorum sayınız doğru, ancak şu anda sadece 5 cevap var fakat senaryonun 6 olduğunu söylüyor. Soruyu sayıyor mu?
Felix Eve

@FelixEve, muhtemelen silinen cevabı sayıyordur. (count($i)-1)Soruyu içermemesi için sayısı düzeltir.
Peter Taylor

@PeterTaylor Script silinen cevabı nasıl görebilir? Ayrıcalığa sahip bir kullanıcıyla giriş yaptıysanız, yalnızca biçimlendirmede olmalıdır.
Cruncher

PHP 5.4'ten başlatmak []yerine kullanabilirsinizarray()
Einacio 19

Biri $i100'den fazla öğe içeriyorsa , bu aslında işe yaramaz . ( Aynı benim yakut benim sürümü bu sınırlama yoktur. Her ne kadar kuşkusuz, API sınırlarına çarpmak olabilir. ;-))
Denis de Bernardy,

5

R, 326

library(XML);b=htmlParse("https://codegolf.stackexchange.com/questions/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="")

Girinti ve açıklamalarla:

library(XML)
b=htmlParse("https://codegolf.stackexchange.com/questions/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="")

Bu sayfa ile test edildiğinde , ön sayfada doğru sayıda yorum (gizli dahil) ve doğru sayıda cevap verir A23C63.

Ve burada soru birkaç sayfaya yayılmaya başlarsa, doğru sayıda yorum alan 482 karakterden oluşan bir çözüm :

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

Girintili'ye:

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

Üzerinde çalıştı bu soruya çıktılanmasını: A125C499.


R kullanmak için +1, açık underdog ama güzel dil :)
Tomas

5

HTML, 37

Maalesef, Blatant kural suistimali takip ediyor!

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

açıklama

q0x.eu/1: Yeniden yönlendirmelerin http: //api.stackexchange.com/2.1/questions/20277/comments site = codegolf & geri arama = ...?

geri arama nerede:

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

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

ve q0x.eu/3?n=... http: //api.stackexchange.com/2.1/answers/.../comments? site = codegolf & callback = ... adresine yönlendirir .

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

Başlangıçta yasal olarak yapmaya çalışıyordum ve hala devam edebilirdi, ama yine de eğlenceliydi!


1
Peki, neden HTTP değil , 8 karakterq0x.eu/1 o zaman? Not: Meşru çözümler zaten Perl'i yenemez ;-) (açık zorluklar)
Tomas,

1
@ Toms, bu hile olurdu! ;) artı sadece verilere yönlendirir, senaryo olarak yorumlanması gerekir, tüm API çağrılarının geri gelmesini ve sadece koyarak curl q0x.eu/1ya da bir şey yapmayı düşündüğümü düşündüm , ama çok tembeldi ...
Dom Hastings

5

Ruby 175 (DOM yerine API kullanarak sayfalar arasında sayılır)

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

Kısaltılmış URL'siz 242:

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

Önceki 291 cevap:

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

API'yi kullanma fikri için Peter Tailor'a ve daha iyi bir API'ye işaret etmek için Charles'a teşekkür eder.


kahretsin, bu benim fikrimdi!
Charles,

Aslında, filtre uygulanmış API kullanımınız daha iyiydi. Burada da aynısını yapmak orijinal cevabımın neredeyse 120 karakterini tıraş ediyor. :-)
Denis de Bernardy

4

Yığın 160 ile Python

uygulama

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

Çıktı

A13C60

Not

Dün stackexchange API'sini kullanmayı düşündüm ancak nasıl çalıştığını anlamam biraz zaman aldı. Bugün aynı konuyla ilgili birkaç cevap olduğunu gördüm. Cevabımı biraz farklı yapmak için harici bir kütüphane kullanıyordum.

Ayrıca, kalıplar için ayrıştırmaya dayanan diğer cevapların

Yakında herhangi bir zamanda kırılması muhtemeldir, bu nedenle daha kesin bir cevap bunun gibi güçlü bir yönteme dayanmaktır.


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

Cevabımı gönderdikten sonra çıktı:

A13C60

F("div","answer")ve F("td","comment-text")benim için çalışmıyor ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). Varsayılan olmamalı için folmak function(x)length(xmlValue(x))yerine length, ya da benzer bir şey?
plannapus

Benim için çalışıyor ... xpathSApply(...,length)bir liste değil, bir vektör döndürmeli. Neden bir liste aldın bilmiyorum. Ve hayır, gerçekten kullanmayı lengthve istememeyi kastediyorum function(x)length(xmlValue(x)): amaç, 1her bir yorum veya cevap için bir vektör elde etmektir .
flodel

tamam xpathSApply, başka işlevler (benzeri length) alabilen xmlValueve benzer işlevler alabilen gerçeğinin , paketin 3.94 sürümünden bir yenilik olduğu gerçeği ortaya çıkıyor (değişimlerini doğru anlıyorsam). Bu yüzden benim için işe yaramadı. Evet, 1'li bir vektör istediğin fikrini aldım, ancak paketin sürümüyle function(...bunun yerine sadece başarabilirim length.
plannapus

3

Şu ana kadar kimsenin gelmediğine inanamıyorum! Kullanmak için en doğrudan çözüm :-)

jQuery, 116 101 karakter (yarışma dışı)

Belki de bu kurallara uymuyor, sadece eğlence için saklıyorum - jQuery çözümü eksik olamaz :) En azından senaryolarınızı test etmek için bir referans olarak !!! ;-)

FireBug konsolundan çalıştırmayı deneyin:

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

Eğer yavaş bağlantınız varsa, zaman aşımını arttırın :-) "Daha fazlasını göster" bağlantılarını tıklamanın harika fikri için teşekkürler @Fez Vrasta!


Diğerleri, class = "comment" dağılması çözümüne Diğer bazı şeyler ve zamanlanmış bomba ha ha


Sayfa kapatılırsa, sorunun gerektirdiği gibi bu işe yaramaz.
bodo

Evet, jQuery kapalı sayfalarda kötü performans sergiliyor :-) O zaman rekabetten çıkmış galiba, ama gerçekten eksik olamaz! :)
Tomas

Bunu yaptım ve cevabım geçersiz sayıldı. Ben onu sildim.
Victor Stafusa,

@Victor, neden sadece eğlence olsun diye tutmuyorsun? Kaç tane karakterin var?
Tomas

@Tomas. Tamam, geri aldım.
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">'));

Açıklama:

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

PHP ilk defa golf komut dosyalarındaki diğer dilleri yeniyor: ')


Düzenli "hileler" önlemek için bu konuya bazı ekstra işaretleme:

göstermek 9999 Daha fazla yorum


2
123456 daha fazla turşu. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "
Blender

1
Allah kahretsin, tamam düzeltecek.
Fez Vrasta

1
"PHP ilk defa golf komut dosyalarında diğer dilleri
yeniyor

3
Peki, nt = "99" ... yorum sayınınız yanlış görünüyor ... :-P Özellikle regex hilecilerini cezalandıran birinin hile yapması çok ironik. :-)
Tomas

1
hayır ama bu aptal senaryoyu düzeltmek için buradaki hayatı harcamaktan sıkıldım: P
Fez Vrasta

2

Düğüm, 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)))})})

Yalnızca bir kez API'ye isabet eder ... kısaltılabilir, ancak Düğümde yeniyim.


2

153 151 147, C # ve CsQuery

CsQuery ile C #:

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

Tam 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 LINQPad veya Roslyn'de C # ve CsQuery

LINQPad üzerinden çalıştırmaya izin verilirse:

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

üretir:

A14C48

Biraz daha eğlenceli.

CsQuery ile F # 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

GEÇERSİZ YAYINLANMAYAN CEVAP - CEVAP İÇİN BURADA

Javascript + jQuery - 155

Sadece konsoluna yapıştırın. Yalnızca bir sayfa olacağını varsayar:

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

1
Ben düşünüyorum "başlatıldığında bu sayfayla çalıştırmalısınız Senaryonuz kapattı." Diye bu tür bir cevabı diskalifiye etmek anlamına geliyordu.
Peter Taylor

tam olarak bu cevap geçerli değil
Fez Vrasta

Çok fazla optimize edilebildi, ancak yine de geçersiz ve çözülemez olduğu için, onu geliştirmek için çaba göstermedim.
Victor Stafusa,

Her "click x more" için click olayını çağırarak daraltılmış yorumları genişletebilirsiniz
Fez Vrasta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.