jumlah jawaban dan komentar

27

Tulis perangkat lunak yang mencetak pada stdout jumlah jawaban dan jumlah komentar (terlihat dan runtuh dari pertanyaan dan jawaban) dari pertanyaan / halaman ini.

Script Anda harus berjalan dengan halaman ini ditutup ketika dimulai.

Output contoh yang diharapkan:

A12C40

Di mana A adalah Jawaban dan C untuk Komentar.

Fez Vrasta
sumber
9
Sedikit komentar untuk memeriksa sesuatu, jika Anda tidak keberatan;)
Teun Pronk
1
Semua komentar
Fez Vrasta
1
Apakah kode harus menangani kasus ketika komentar diciutkan ketika ada terlalu banyak? Dan ada juga kasus ketika ada terlalu banyak jawaban (meskipun saya ragu itu akan mendapatkan banyak).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
4
Berapa lama sampai seseorang menulis sebuah program yang membaca jawaban yang paling banyak dipilih di sini, dan menjalankannya? : D
C4stor
12
Apakah ini skema cerdas untuk mendapatkan pertanyaan yang paling banyak dilihat melalui orang yang menguji skrip mereka?
Boann

Jawaban:

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

Beberapa hal hanya untuk memecahkan solusi dari yang lain ha ha ha :-P

tampilkan 93 komentar lagi

href

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

a, tunjukkan 99 tunjukkan 99 ha ha

href href href ha ha haha ​​:-D

Ya ampun, baru saja memecahkan jawaban saya sendiri! Saya menemukan bahwa salah satu trik di atas, yang saya pikir tidak melakukan apa-apa, akan mulai berfungsi setelah jawaban ini tidak diedit untuk beberapa waktu! Jadi solusi Anda hanya akan bekerja untuk beberapa waktu. Itu sebabnya Anda telah melihat +1 lebih banyak jawaban dalam solusi Anda .. Ini bom waktu! Jawaban saya sudah cenderung :-) Aaah, temukan cara bagaimana meluncurkannya SEKARANG ...

Tomas
sumber
Untuk memecahkan beberapa skrip yang menggunakan penyeleksi css, mungkin <a href="" class="comment> tautan komentar </a> mungkin berfungsi?
Denis de Bernardy
Denis unfortunatelly SE tidak akan memungkinkan Anda untuk menampilkan ini. Anda dapat menguji pada jawaban Anda sendiri :)
Tomas
Saya mengecek> agar tidak pecah
Fez Vrasta
@FezVrasta ermm .. tidak mudah pecah? Lalu bagaimana mungkin daripada saya memecahkannya? ;)
Tomas
@ Thomas bagus, sekarang saya melihat output yang tepat perl -E. Menghapus komentar saya. Anda juga dapat menghapus referensi Anda untuk jawaban saya, karena Anda tidak
mempermasalahkannya
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)

Lebih mudah dibaca (dengan spasi):

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 digunakan sebagai prosesor XQuery.

Pasang kembali Monica - dirkk
sumber
Akan lebih pendek (dengan menggunakan doc()fungsi) jika halaman ini akan menjadi XML yang valid ...
mengembalikan Monica - dirkk
Dan ini tampaknya menjadi jawaban pertama yang pernah pada kode-golf menggunakan XQuery ... ternyata cukup cocok :)
mengembalikan Monica - dirkk
2
di situs ini saya menemukan bahasa baru setiap hari, yang ini cukup menarik, terima kasih. Apakah itu menghitung komentar tersembunyi?
Fez Vrasta
@FezVrasta Ya, dan XQuery bahkan tidak esoteris :) Ya itu, thats apa $d//*[@class="comments-link"]/bbagi (dalam <b> tag jumlah komentar yang tersembunyi ditunjukkan)
mengembalikan 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='')

Saya berasumsi bahwa pertanyaan ini tidak akan memiliki banyak halaman jawaban.

Blender
sumber
blender: tidak beruntung bahkan dengan kode blok: P
Fez Vrasta
@FezVrasta: Saya mengerti A13C20. Sertakan braket miring dalam regex dan saya pikir itu harus baik, karena mereka lolos.
Blender
Ya, saya sudah melakukannya. terima kasih
Fez Vrasta
Hmmm ... "Abaikan barang ini" ya? Apa yang terjadi jika seseorang mengeditnya dari jawabannya?
Iszi
Sintaks tidak valid. ,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}'

Yang sama dengan ini, tetapi tanpa mengarahkan ke 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

Keluaran saat ini

A16C76

Penjelasan

ikal

Transfer URL.

  • -sin curladalah untuk diam. Dan -Luntuk mengikuti arahan ulang.
awk

Untuk mengurai file. Karena beberapa jawaban memiliki beberapa kode untuk memecahkan jawaban lain, penguraian telah diubah sehingga mem-parsing dari awal baris (^) untuk memastikan tidak rusak.

  • -F'[<>]'atur pemisah bidang sebagai <atau >. Dengan cara ini teks dapat diuraikan dengan benar untuk "tampilkan XXX komentar lagi".
  • /^[\t]*>show <b>/{c+=$4}pada baris yang berisi "spasi ....> tampilkan", dapatkan bidang ke-4 (berdasarkan <, >pemisah) dan tambahkan nilainya ke penghitung komentar.
  • /^[ ]*<tr.*s="comm/{++c} pada baris yang berisi "spasi ...
  • /^<td.*rcell">/{++a} pada baris yang berisi "", tambahkan penghitung jawaban.
  • END{print "A"a"C"c} cetak hasilnya.
fedorqui
sumber
jadi tidak termasuk komentar yang diciutkan?
Fez Vrasta
saya pikir Anda dicampur mdan fdalam kode Anda: echo "A$(grep -c 'rcell">' m)C$(grep -c 'mment">' f)"seharusnya echo "A$(grep -c 'rcell">' f)C$(grep -c 'mment">' f)", bukan?
plannapus
@plannapus ya, kesalahan dari copy paste. Terpecahkan, terima kasih!
fedorqui
1
Baru saja menguji kode Anda, dan ini melaporkan "A14C159", yang saya yakin tidak sepenuhnya benar.
Abhijit
1
Yah @Abhijit itu terjadi bahwa orang terus memperbarui posting mereka untuk memecahkan kondisi di sisa jawaban ... Dan saya tidak bisa terus memperbarui jawaban saya setiap kali seseorang memperbarui: D
fedorqui
5

PHP yang benar-benar berfungsi (302 karakter)

Tidak seperti semua jawaban lain sejauh ini, ini mengembalikan jawaban yang benar bahkan ketika pertanyaan tersebut tumpah ke lebih dari satu halaman.

<?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
sumber
Jumlah komentar Anda itu benar tetapi saat ini hanya ada 5 jawaban tetapi skrip Anda mengatakan ada 6. Apakah itu menghitung pertanyaan?
Felix Eve
@ Feliks, saya pikir itu mungkin menghitung jawaban yang dihapus. (count($i)-1)mengoreksi hitungan untuk tidak memasukkan pertanyaan.
Peter Taylor
@PeterTaylor Bagaimana skrip dapat melihat jawaban yang dihapus? Seharusnya hanya di markup jika login dengan pengguna yang memiliki hak istimewa.
Cruncher
dari PHP 5.4 Anda dapat menggunakan []alih-alih array()menginisialisasi
Einacio
Yang ini tidak akan berfungsi jika ada yang bergabung $imemiliki lebih dari 100 item. (Versi saya sendiri yang sama di ruby tidak memiliki batasan ini. Meskipun diakui dapat menabrak batas 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="")

Dengan lekukan dan penjelasan:

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

Diuji dengan halaman ini , ia memberikan jumlah komentar yang tepat (termasuk disembunyikan) di halaman depan dan jumlah jawaban yang tepat, yaitu A23C63.

Dan di sini ada solusi pada 482 karakter yang mendapatkan jumlah komentar yang benar jika pertanyaan tersebut akhirnya menyebar pada beberapa halaman:

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

Bertakuk:

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

Mencoba pada pertanyaan ini dan dikeluarkan: A125C499.

plannapus
sumber
+1 untuk menggunakan R, underdog yang jelas tapi bahasa yang indah :)
Tomas
5

HTML, 37

Maaf, penyalahgunaan aturan Blatant mengikuti!

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

Penjelasan

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

dimana callback berada:

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

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

dan q0x.eu/3?n=...mengalihkan ke 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)
})

Awalnya saya mencoba untuk melakukannya secara sah dan mungkin masih mencoba, tetapi ini tetap menyenangkan!

Dom Hastings
sumber
1
Nah, mengapa tidak HTTP, 8 karakter q0x.eu/1 itu? PS: solusi yang sah tidak bisa mengalahkan Perl anyways ;-) (tantangan terang-terangan)
Tomas
1
@ Thomas, itu akan curang! ;) ditambah itu hanya pengalihan ke data, itu harus ditafsirkan sebagai skrip, saya memang berpikir tentang memiliki semua panggilan API kembali dan hanya meletakkan curl q0x.eu/1atau sesuatu, tetapi terlalu malas ...
Dom Hastings
5

Ruby 175 (dihitung di seluruh halaman, menggunakan API, bukan 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}}"

Itu 242 tanpa url singkat:

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 jawaban sebelumnya:

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

Penghargaan kepada Peter Tailor untuk gagasan menggunakan API, dan Charles untuk menunjuk ke arah API yang lebih baik.

Denis de Bernardy
sumber
sial, itu ideku!
Bukannya Charles
Sebenarnya, penggunaan API yang difilter Anda lebih baik. Melakukan hal yang sama di sini memangkas hampir 120 karakter dari jawaban asli saya. :-)
Denis de Bernardy
4

Python dengan stackpy 160

Pelaksanaan

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

Keluaran

A13C60

Catatan

Kemarin saya berpikir untuk menggunakan stackexchange API tetapi butuh beberapa waktu bagi saya untuk memahami cara kerjanya. Hari ini, saya melihat ada beberapa jawaban pada tema yang sama. Untuk membuat jawaban saya sedikit berbeda, saya menggunakan perpustakaan eksternal.

Sadari juga bahwa jawaban lain yang bergantung pada penguraian pola seperti

cenderung pecah dalam waktu dekat, jadi jawaban yang lebih pasti adalah mengandalkan metode yang kuat seperti ini.

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

Setelah saya memposting jawaban saya, hasilnya adalah:

A13C60
flodel
sumber
F("div","answer")dan F("td","comment-text")tidak bekerja untuk saya ( Error in F("div", "answer") : (list) object cannot be coerced to type 'double'). Bukankah seharusnya standar untuk fmenjadi function(x)length(xmlValue(x))bukan length, atau sesuatu yang serupa?
plannapus
Ini berfungsi untuk saya ... xpathSApply(...,length)harus mengembalikan vektor, bukan daftar. Saya tidak yakin mengapa Anda akan mendapatkan daftar. Dan tidak, saya benar-benar bermaksud menggunakan lengthdan tidak function(x)length(xmlValue(x)): tujuannya adalah untuk mendapatkan vektor 1s, satu untuk setiap komentar atau jawaban.
flodel
ok ternyata fakta yang xpathSApplydapat mengambil fungsi lain (seperti length) daripada xmlValuedan yang serupa adalah hal baru dari versi 3.94 paket (jika saya mengerti benar changelog mereka). Mungkin itulah sebabnya itu tidak berhasil untuk saya. Ya saya mendapat ide bahwa Anda menginginkan vektor 1s, tetapi dengan versi paket saya, saya hanya dapat mencapainya dengan function(...alih - alih adil length.
plannapus
3

Tidak dapat percaya bahwa tidak ada yang muncul sampai sekarang! Solusi paling langsung untuk digunakan :-)

jQuery, 116 101 karakter (di luar kompetisi)

Mungkin ini tidak sesuai dengan aturan, saya menyimpannya hanya untuk bersenang-senang - solusi jQuery tidak boleh hilang :) Setidaknya sebagai referensi untuk menguji skrip Anda !!! ;-)

Coba jalankan dari konsol FireBug:

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

Jika Anda memiliki koneksi yang lambat, tingkatkan batas waktu :-) Terima kasih @Fez Vrasta untuk ide bagus mengklik tautan "tampilkan lebih banyak"!


Beberapa hal lain untuk memecahkan solusi dari yang lain, class = "comment" dan bom waktunya ha ha

Tomas
sumber
Ini tidak akan berfungsi jika halaman ditutup, seperti pertanyaan yang diperlukan.
Bodo
Ya, jQuery berkinerja buruk di halaman tertutup :-) Saya kira itu di luar kompetisi, tetapi tidak bisa benar-benar hilang! :)
Tomas
Saya melakukan itu dan jawaban saya dianggap tidak valid. Saya menghapusnya.
Victor Stafusa
@ Viktor, mengapa tidak menyimpannya hanya untuk bersenang-senang? Berapa banyak karakter yang kamu punya?
Tomas
@ Thomas. Oke, saya membatalkan penghapusan.
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">'));

Penjelasan:

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

Untuk pertama kalinya PHP mengalahkan bahasa lain dalam skrip golf: ')


Beberapa markup tambahan untuk topik ini untuk menghindari regex "cheat":

tampilkan 9999 komentar lagi

Fez Vrasta
sumber
2
123456 acar lagi. rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell" rcell "rcell"
Blender
1
sial, ok akan memperbaikinya ._
Fez Vrasta
1
"untuk pertama kalinya PHP mengalahkan bahasa lain dalam skrip golf" Memang benar itu langka, tetapi sudah ada beberapa
plannapus
3
Nah, nt = "99" ... jumlah komentar Anda tampaknya salah ... :-P Sangat ironis bahwa seseorang yang menghukum orang yang curang juga curang :-)
Tomas
1
tidak, tetapi saya agak bosan menghabiskan hidup di sini untuk memperbaiki skrip bodoh ini: P
Fez Vrasta
2

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

Hanya mengenai API sekali ... kemungkinan bisa dipersingkat, tapi saya baru mengenal Node.

Bukan itu Charles
sumber
2

153 151 147, C # & CsQuery

C # Dengan CsQuery:

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

Program lengkap:

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 di LINQPad atau di Roslyn

Jika menjalankan melalui LINQPad diizinkan maka:

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

Menghasilkan:

A14C48

Lebih menyenangkan.

F # dengan 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
sumber
1

JAWABAN YANG TIDAK DILAKUKAN INVALID - DI SINI HANYA UNTUK MENYENANGKAN

Javascript + jQuery - 155

Cukup rekatkan di konsol Anda. Diasumsikan bahwa hanya akan ada satu halaman:

(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
sumber
1
Saya berpikir bahwa "Script Anda harus berjalan dengan halaman ini ditutup ketika dimulai." dimaksudkan untuk mendiskualifikasi jawaban semacam ini.
Peter Taylor
tepatnya, jawaban ini tidak valid
Fez Vrasta
Bisa dioptimalkan banyak, tetapi karena itu tidak valid dan tidak dapat diselamatkan lagi, saya tidak melakukan upaya untuk memperbaikinya.
Victor Stafusa
Anda bisa memperluas komentar yang diciutkan yang menyebut acara klik pada setiap "show x more"
Fez Vrasta