Jadi ... berapa skor StackOverflow Anda?


21

Ini sederhana. Dengan diberi input nomor, kembalikan skor nama dan reputasi pengguna Stack Overflow dengan ID yang diberikan . Program Anda dapat mengasumsikan bahwa selalu diberikan ID pengguna yang valid dan ada.

Sebagai contoh: diberi input 764357(yang merupakan ID pengguna saya di StackOverflow) program akan kembali LegoStormtroopr 3,088(kurang-lebih) itu mungkin berubah.

Anda mendapatkan URL: " /programming//users/ " atau " http://api.stackexchange.com/2.1/users/ " gratis, sehingga skor Anda length of your program - 31 or 39, tergantung pada URL yang Anda gunakan - tapi menyatakan mana itu . Ini mencegah orang menyalahgunakan penyingkat URL.

sunting: Dan tidak ada panggilan API khusus yang meminta Stack Overflow, dan hanya mengembalikan nama dan skor. Tetapi jika Anda tahu tentang API resmi, maka itu benar-benar sah.

edit2: Jika Anda membutuhkan input contoh: Saya telah memberikan ID saya di bawah ini, jangan ragu untuk menambahkan ID Anda sendiri, nama pengguna dan skor di bawah ini untuk membantu orang lain. Perhatikan lagi, ini untuk situs Stack Overflow utama.

764357   returns   LegoStormtroopr 3,088

hmm ... jika ada banyak pengguna dengan perwakilan itu, haruskah kita memilih satu, atau menampilkan semuanya? Bagaimana jika tidak ada pengguna seperti itu?
John Dvorak

2
uh ... tunggu ... dari pengguna dengan skor itu, atau dari pengguna dengan ID itu?
John Dvorak

@ JanDvorak Saya sudah mencoba mengklarifikasi. Program harus menerima ID pengguna, dan mengembalikan pengguna dengan ID itu, dan Skor Rep. Pengguna itu.

1
Haruskah url http://api.stackexchange.com/2.1/users/juga "bebas" untuk menghindari menghukum pengguna API?
gnibbler

1
Bisakah kita mendapatkan site=stackoverflowbagian secara gratis juga?
Johannes Kuhn

Jawaban:


15

Script shell: 64 51 karakter

curl -sL http://stackoverflow.com/users/`cat`|grep -oPm2 'n">\K[0-9,]+|e">\K[^<]+'

Contoh dijalankan:

bash-4.1$ curl -sL http://stackoverflow.com/users/`cat`|grep -oPm2 'n">\K[0-9,]+|e">\K[^<]+'
662504
manatwork
834

bash-4.1$ curl -sL http://stackoverflow.com/users/`cat`|grep -oPm2 'n">\K[0-9,]+|e">\K[^<]+'
764357
Lego Stormtroopr
3,087

(Perhatikan bahwa Anda harus menekan ^Dsetelah mengetikkan input secara interaktif. Atau hanya mengirimnya ke perintah.)


8

Ruby: 84 70 karakter

s=open("http://stackoverflow.com/users/"+gets).read
puts s[/me">(.+)</,1],s[/n">([\d,]+)/,1]

Contoh dijalankan:

bash-4.1$ ruby -ropen-uri -e 's=open("http://stackoverflow.com/users/"+gets).read;puts s[/me">(.+)</,1],s[/n">([\d,]+)/,1]' <<< '662504'
manatwork
834

bash-4.1$ ruby -ropen-uri -e 's=open("http://stackoverflow.com/users/"+gets).read;puts s[/me">(.+)</,1],s[/n">([\d,]+)/,1]' <<< '764357'
Lego Stormtroopr
3,087

1
Anda tidak perlu kata-kata lengkap di regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]tampaknya berfungsi
Neil Slater

Benar. Mereka baru saja diambil dari jawaban skrip shell saya . ( grepakan menampilkan lebih banyak pertandingan hanya "ation" ".)
manatwork

@ Doorknob, mungkin Anda menghilangkan -ropen-uriopsi. (Ini wajib dan termasuk dalam jumlah karakter.)
manatwork

@manatwork Ah, tidak memperhatikan itu. Oke, sekarang berhasil.
Gagang Pintu

6

Python 2.7 - 119

(150 - 31)

Tanpa regex:

from urllib import*
s=urlopen("http://stackoverflow.com/users/%d"%input()).read()
p=str.split 
print p(p(s,'r ')[1],' -')[0],p(p(s,'ore">')[1],'<')[0]

6

Python 3, 117

117 = 148 - 31

Saya pikir pencarian kode sumber HTML biasa tidak akan menghasilkan solusi yang kuat. Misalnya, beberapa hal aneh di profil seseorang dapat merusak solusi Anda. Jadi saya ingin mencari menggunakan penyeleksi CSS.

from lxml.html import*
C=parse('http://stackoverflow.com/users/'+input()).getroot().cssselect
print(C('[id^=u]')[0].text,C('[class$=ore]')[0].text)

5

Javascript 217

Berikut adalah Versi Javascript yang tidak disatukan menggunakan api resmi dengan JSONP, untuk memulai. Menggunakan url akan membutuhkan XHR, yang bisa sangat bertele-tele, jika saya menemukan waktu saya akan mencoba versi yang lebih golf.

d=document;function f(a){y=a.items[0];alert(y.display_name+" "+y.reputation)}x=d.createElement("script");x.src="https://api.stackexchange.com/2.1/users/"+prompt()+"?site=stackoverflow&callback=f";d.body.appendChild(x)

5

Perl 5 (dengan Mojolicious), 87 - 31 = 56 byte

say/h1.*>(.*)</,$/,/core">(.*?)</ for g("http://stackoverflow.com/users/".pop)->dom

Contoh dijalankan:

$ perl -Mojo -E 'say/h1.*>(.*)</,$/,/core">(.*?)</ for g("http://stackoverflow.com/users/".pop)->dom' 764357
Lego Stormtroopr
3,103

Dapat dibaca & bersih: 128 - 31 = 97 byte

say $_->at("#user-displayname")->text, ": ", $_->at(".reputation a")->text for g("http://stackoverflow.com/users/".pop)->dom

Contoh dijalankan:

$ perl -Mojo -E 'say $_->at("#user-displayname")->text, ": ", $_->at(".reputation a")->text for g("http://stackoverflow.com/users/$ARGV[0]")->dom' 764357
Lego Stormtroopr: 3,103

1
Apakah -Mojotermasuk dalam hitungan? Harganya 4 karakter.
manatwork

@manatwork: Tidak, saya tidak memasukkannya ke dalam hitungan, karena jawaban Ruby tidak termasuk -ropen-uri. Namun, saya senang memasukkannya jika komentar Anda mendapat beberapa suara sebagai indikasi bahwa komunitas ingin menghitungnya.
Matthias

Hitung lagi. Itu termasuk. pastebin.com/qZp1QgKa
manatwork

2
Yah, saya berharap kita memiliki dokumentasi yang tepat dari aturan penghitungan, tetapi seperti yang saya tahu, tidak ada. Satu hal yang pasti: perl's -popsi biasanya dihitung 1. Berdasarkan itu saya hitung -Mojo+4.
manatwork

1
Inilah satu set aturan yang telah kami gunakan beberapa kali.
JB

4

R: 150-31 = 119

f=function(i){S=function(x)strsplit(grep(x,scan(paste0("http://stackoverflow.com/users/",i),"",sep="\n"),v=T)[1],">|<")[[1]][3];cat(S("h1"),S("=re"))}

Cukup dengan mudah mengambil baris pertama yang berisi h1(untuk nama) dan =re(untuk skor) menggunakan grepdengan argumen value=TRUE(di sini v=T) dan kemudian membagi string (menggunakan strsplitpada karakter >dan <. Tidak nyaman itu menanyakan halaman dua kali (maka dua "Baca n item" peringatan) tapi itu lebih pendek.

>f(1451109)
Read 917 items
Read 917 items
plannapus 6,566

4

Tcl, (231 - 39) 192

bukan cara terpendek, tetapi menggunakan API resmi

package r http
package r json
set d [lindex [dict get [json::json2dict [http::data [http::geturl http://api.stackexchange.com/2.1/users/$argv?site=stackoverflow]]] items] 0]
puts [dict get $d display_name]\ [dict get $d reputation]

Dan dalam semangat pertanyaan aslinya :

package r http
package r json
set c [dict get [json::json2dict [http::data [http::geturl http://api.stackexchange.com/2.1/users/?order=desc&sort=reputation&site=stackoverflow&min=$argv&max=$argv]]] items]
foreach d $c {puts "[dict get $d display_name] [dict get $d reputation]"}

Temukan pengguna dengan reputasi itu


Maaf tentang mixup itu!

@LegoStormtroopr: Saya menulis jawaban ini ketika jelas bahwa yang Anda maksud adalah userid, tetapi saya suka menunjukkan bahwa API resmi juga dapat menyelesaikan pertanyaan aslinya.
Johannes Kuhn

3

ShortScript CoffeeScript: 143 karakter (182 - 39)

Ini bergantung pada API yang selalu mengembalikan kunci objek dalam urutan yang sama, tetapi mengurangi 7 karakter.

f=(r)->u=Object.keys(items[0]);alert u[3]+' '+u[5]
d=document
j=d.createElement('script')
j.src="//api.stackexchange.com/2.1/users/"+prompt()+'?site=diy&jsonp=f'
d.body.appendChild j

CoffeeScript: 150 karakter (189 - 39)

f=(r)->u=r.items[0];alert u.display_name+' '+u.reputation
d=document
j=d.createElement('script')
j.src="//api.stackexchange.com/2.1/users/"+prompt()+'?site=diy&jsonp=f'
d.body.appendChild j

(Perhatikan bahwa program meminta Anda untuk "tidak ditentukan" - ia meminta ID Pengguna.)


3

R - 84

84 = 115 - 31

sub(".*\\/(.*)\\?.*>(.*)<.*","\\1 \\2",grep("b=r",scan(paste0("http://stackoverflow.com/users/",scan(n=1)),""),v=T)[1])

Simulasi:

> sub(".*\\/(.*)\\?.*>(.*)<.*","\\1 \\2",grep("b=r",scan(paste0("http://stackoverflow.com/users/",scan(n=1)),""),v=T)[1])
1: 1201032
Read 1 item
Read 2976 items
[1] "flodel 31,093"

+1 Ini adalah penggunaan ekspresi reguler yang sangat mengesankan.
Sven Hohenstein

3

101 100 - CoffeeScript dengan jQuery

$.getJSON "http://api.stackexchange.com/2.1/users/#{prompt()}?site=stackoverflow",(d)->alert [d.items[0].reputation,d.items[0].display_name]

Ini biola ; ketahuilah bahwa itu meminta Anda ketika Anda pertama kali membuka halaman, jadi siapkan ID, atau tekan Jalankan lagi.

Atau kita bisa menjadi super hacky untuk menyelamatkan seluruh karakter!

$.getJSON "http://api.stackexchange.com/2.1/users/#{prompt()}?site=stackoverflow",(d)->`with(d.items[0])alert([reputation,display_name])`;1

2

Python 2.7 - 112

112 = 143 - 31

Versi pendek dan baru yang menggunakan beberapa ide dari Steven Rumbalski menjawab , sementara masih menggunakan Regex.

import urllib,re
r=re.findall('r (.*?) -|re">(.*?)<',urllib.urlopen("http://stackoverflow.com/users/%d"%input()).read())
print r[0][0],r[2][1]

133 = 164 - 31

Ini adalah versi dasar untuk orang-orang untuk bekerja, tapi saya yakin orang bisa menjadi lebih pendek.

import urllib,re
u=input()
s=urllib.urlopen("http://stackoverflow.com/users/%d"%u).read()
r=re.findall('name.*?>(.*?)</h1|tion.?>(.*?)</a',s)
print r[0][0],r[1][1]

ini sepertinya tidak berhasil. http://stackoverflow.com/users/12340adalah 404.
John Dvorak

@ JanDvorak, coba dengan 499214bukannya12340
Peter Taylor

@PeterTaylor maka pertanyaannya salah.
John Dvorak

2
@ JanDvorak Jelas, pengguna dengan ID itu tidak ada.

1

GNU Awk: 217 karakter

Hanya karena GNU awkmendukung TCP secara native: tidak ada modul / pustaka / alat eksternal.

{RS="\r"
print h("/users/"$0,$0,"/",4),h($2,$2"\\?","<|>",3)}function h(p,m,r,f){d="stackoverflow.com"
g="/inet/tcp/0/"d"/80"
print"GET "p" HTTP/1.1\nHost:"d"\n"|&g
close(g,"to")
while(g|&getline)if($0~m){close(g,"from")
split($0,a,r)
return a[f]}}

Contoh dijalankan:

bash-4.1$ awk '{RS="\r";print h("/users/"$0,$0,"/",4),h($2,$2"\\?","<|>",3)}function h(p,m,r,f){d="stackoverflow.com";g="/inet/tcp/0/"d"/80";print"GET "p" HTTP/1.1\nHost:"d"\n"|&g;close(g,"to");while(g|&getline)if($0~m){close(g,"from");split($0,a,r);return a[f]}}' <<< 662504
manatwork 854

bash-4.1$ awk '{RS="\r";print h("/users/"$0,$0,"/",4),h($2,$2"\\?","<|>",3)}function h(p,m,r,f){d="stackoverflow.com";g="/inet/tcp/0/"d"/80";print"GET "p" HTTP/1.1\nHost:"d"\n"|&g;close(g,"to");while(g|&getline)if($0~m){close(g,"from");split($0,a,r);return a[f]}}' <<< 764357
lego-stormtroopr 3,947
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.