Vì vậy, điểm số StackOverflow của bạn là gì?


21

Đây là một trong những đơn giản. Đưa ra đầu vào của một số, trả về tên và điểm danh tiếng của người dùng Stack Overflow với ID đã cho đó . Chương trình của bạn có thể cho rằng nó luôn được cung cấp ID người dùng hợp lệ và tồn tại.

Ví dụ: được cung cấp đầu vào 764357(là userID của tôi trên StackOverflow), chương trình sẽ trả về LegoStormtroopr 3,088(khoảng) nó có thể thay đổi.

Bạn nhận được URL: " /programming//users/ " hoặc " http://api.stackexchange.com/2.1/users/ " miễn phí, vì vậy điểm của bạn là length of your program - 31 or 39, tùy thuộc vào URL bạn sử dụng - nhưng tuyên bố đó là . Điều này ngăn mọi người lạm dụng rút ngắn URL.

chỉnh sửa: Và không gọi API được thực hiện tùy chỉnh truy vấn Stack Overflow và chỉ trả về tên và điểm số. Nhưng nếu bạn biết về một API chính thức, thì điều đó hoàn toàn hợp pháp.

edit2: Nếu bạn cần một ví dụ đầu vào: Tôi đã đưa ID của mình bên dưới, vui lòng thêm ID, tên người dùng và điểm số bên dưới của bạn để giúp đỡ người khác. Lưu ý một lần nữa, đây là trang web Stack Overflow chính.

764357   returns   LegoStormtroopr 3,088

hmm ... nếu có nhiều người dùng với đại diện đó, chúng ta nên chọn một hoặc hiển thị tất cả họ? Nếu không có người dùng như vậy thì sao?
John Dvorak

2
uh ... đợi đã ... của người dùng có số điểm đó hay của người dùng có ID đó?
John Dvorak

@JanDvorak Tôi đã cố gắng làm rõ. Chương trình sẽ chấp nhận ID người dùng và trả về người dùng với ID đó và Điểm người dùng đó.

1
Url http://api.stackexchange.com/2.1/users/cũng nên "miễn phí" để tránh phạt người dùng API?
gnibbler

1
Chúng tôi có thể nhận được site=stackoverflowmột phần miễn phí không?
Julian Kuhn

Câu trả lời:


15

Kịch bản Shell: 64 51 ký tự

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

Chạy mẫu:

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

(Lưu ý rằng bạn phải nhấn ^Dsau khi nhập đầu vào một cách tương tác. Hoặc chỉ cần đưa nó vào lệnh.)


8

Ruby: 84 70 ký tự

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

Chạy mẫu:

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
Bạn không cần từ đầy đủ trong regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]dường như hoạt động
Neil Slater

Chính xác. Họ chỉ được lấy từ câu trả lời kịch bản shell của tôi . ( grepsẽ hiển thị nhiều trận đấu hơn cho chỉ hành động của người
Hồi giáo

@Doorknob, có lẽ bạn đã bỏ qua -ropen-uritùy chọn. (Đó là bắt buộc và được bao gồm trong số lượng nhân vật.)
manatwork

@manatwork À, không để ý điều đó. Được rồi bây giờ nó hoạt động.
Doorknob

6

Con trăn 2.7 - 119

(150 - 31)

Không có 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

Trăn 3, 117

117 = 148 - 31

Tôi không nghĩ rằng việc tìm kiếm trong mã nguồn HTML đơn giản sẽ dẫn đến giải pháp mạnh mẽ. Ví dụ, một số nội dung kỳ lạ trong hồ sơ của một người có thể phá vỡ các giải pháp của bạn. Vì vậy, tôi muốn tìm kiếm bằng cách sử dụng bộ chọn 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

Đây là phiên bản Javascript không được sử dụng bằng api chính thức với JSONP, để bắt đầu. Sử dụng url sẽ yêu cầu XHR, điều này có thể khá dài dòng, nếu tôi thấy một lúc nào đó tôi sẽ thử một phiên bản chơi gôn hơn.

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 (với Mojolicy), 87 - 31 = 56 byte

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

Chạy mẫu:

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

Có thể đọc và làm sạch: 128 - 31 = 97 byte

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

Chạy mẫu:

$ 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
Được -Mojotính vào số lượng? Có giá 4 ký tự.
manatwork

@manatwork: Không, tôi không bao gồm nó trong số đếm, vì câu trả lời của Ruby không bao gồm -ropen-uri. Tuy nhiên, tôi rất vui khi bao gồm nó nếu bình luận của bạn nhận được một vài phiếu bầu như là dấu hiệu cho thấy cộng đồng muốn tính những điều này.
Matthias

Đếm lại. Nó bao gồm. pastebin.com/qZp1QgKa
manatwork

2
Chà, tôi ước chúng ta có một tài liệu chính xác về quy tắc đếm, nhưng như tôi biết, không có gì cả. Một điều chắc chắn: perl's -plựa chọn thường được tính 1. Dựa vào đó tôi đếm -Mojo+4.
thao tác

1
Đây là một bộ quy tắc chúng tôi đã sử dụng một vài lần.
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"))}

Khá đơn giản là chọn các dòng đầu tiên chứa h1(cho tên) và =re(cho điểm) bằng cách sử dụng grepvới đối số value=TRUE(ở đây v=T) và sau đó tách chuỗi (sử dụng strsplittại các ký tự ><. Vô tình nó truy vấn trang hai lần (do đó hai "Đọc n mục" cảnh báo) nhưng đó là ngắn hơn.

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

4

Tcl, (231 - 39) 192

không phải là cách ngắn nhất, nhưng sử dụng API chính thức

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]

Và theo tinh thần của câu hỏi ban đầu :

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

Tìm người dùng có danh tiếng đó


Xin lỗi về sự pha trộn đó!

@LegoStormtroopr: Tôi đã viết câu trả lời này khi rõ ràng bạn có nghĩa là userid, nhưng tôi thích chứng minh rằng API chính thức cũng có thể giải quyết câu hỏi ban đầu.
Julian Kuhn

3

CoffeeScript ngắn hơn: 143 ký tự (182 - 39)

Điều này phụ thuộc vào API luôn trả về các khóa đối tượng theo cùng một thứ tự, nhưng loại bỏ 7 ký tự.

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 ký tự (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

(Lưu ý rằng chương trình sẽ nhắc bạn "không xác định" - đó là yêu cầu ID người dùng.)


3

R - 84

84 = 115 - 31

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

Mô phỏng:

> 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 Đây là cách sử dụng biểu thức thông thường rất ấn tượng.
Sven Hohenstein

3

101 100 - CoffeeScript với jQuery

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

Đây là một đố ; chỉ cần biết rằng nó sẽ nhắc bạn khi bạn mở trang lần đầu tiên, vì vậy hãy chuẩn bị sẵn ID hoặc nhấn Run lần nữa.

Hoặc chúng ta có thể siêu hack để cứu toàn bộ nhân vật!

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

2

Con trăn 2.7 - 112

112 = 143 - 31

Một phiên bản mới hơn, ngắn hơn, sử dụng một số ý tưởng từ câu trả lời của Steven Rumbalski , trong khi vẫn sử dụng 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

Đây là phiên bản cơ sở để mọi người làm việc, nhưng tôi chắc chắn mọi người có thể còn ngắn hơn nữa.

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]

điều này dường như không hoạt động. http://stackoverflow.com/users/12340là 404.
John Dvorak

@JanDvorak, hãy thử 499214thay vì12340
Peter Taylor

@PeterTaylor thì câu hỏi không chính xác.
John Dvorak

2
@JanDvorak Rõ ràng, người dùng có ID đó không tồn tại.

1

GNU Awk: 217 ký tự

Chỉ vì GNU awkhỗ trợ TCP nguyên bản: không có mô-đun / thư viện / công cụ bên ngoài.

{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]}}

Chạy mẫu:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.