那么……您的StackOverflow得分是多少?


21

这很简单。给定一个数字输入,返回具有给定ID的Stack Overflow用户的名称和声誉得分。您的程序可以假定始终为其提供有效且存在的用户ID。

例如:给定输入764357(这是我在StackOverflow上的用户ID),程序将返回LegoStormtroopr 3,088(大约)它可能会更改。

您可以免费获得以下网址:“ /programming//users/ ”或“ http://api.stackexchange.com/2.1/users/ ”,因此您的得分是length of your program - 31 or 39具体取决于您使用的哪个URL-宣布是。这样可以防止人们滥用URL缩短器。

编辑:无需调用查询Stack Overflow的定制API,仅返回名称和分数。 但是,如果您知道一个正式的API,那是完全合法的。

edit2:如果您需要输入示例:我在下面提供了我的ID,请随时在下面添加您自己的ID,用户名和分数,以帮助他人。再次注意,这是针对主要Stack Overflow网站的。

764357   returns   LegoStormtroopr 3,088

嗯...如果该代表有多个用户,我们应该选择一个还是全部显示?如果没有这样的用户怎么办?
约翰·德沃夏克

2
嗯...等等...具有该分数的用户还是具有该ID的用户?
约翰·德沃夏克

@JanDvorak我试图澄清。该程序应接受用户ID,并返回具有该ID的用户以及该用户的代表得分。

1
网址是否http://api.stackexchange.com/2.1/users/也应该“免费”以避免惩罚API用户?
gnibbler 2013年

1
我们也可以site=stackoverflow免费获得零件吗?
约翰内斯·库恩

Answers:


15

Shell脚本:64个 51个字符

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

样品运行:

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

(请注意,^D在交互式输入之后必须按一下。或者只需将其通过管道传递给命令。)


8

红宝石:84 70个字符

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

样品运行:

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
您不需要正则表达式中的完整单词:s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]似乎
Neil Slater 2013年

正确。它们只是从我的shell脚本答案中获取的。(grep只会显示“
ation

@Doorknob,可能您省略了该-ropen-uri选项。(这是强制性的,并包含在字符计数中。)
manatwork

@manatwork啊,没注意到。好的,现在可以了。
门把手

6

Python 2.7-119

(150-31)

没有正则表达式:

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

我认为搜索纯HTML源代码不会带来强大的解决方案。例如,个人档案中的一些奇怪内容可能会破坏您的解决方案。因此,我想使用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

以下是使用带有JSONP的正式api的非高尔夫Javascript版本(以开头)。使用URL将需要XHR,如果我发现一段时间,我会尝试使用更高级的版本。

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(带有Mojolicious),87-31 = 56字节

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

样品运行:

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

可读且干净:128-31 = 97字节

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

样品运行:

$ 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
-Mojo计算在内?花费4个字符。
manatwork

@manatwork:不,我没有将其包含在计数中,因为Ruby的答案未包含-ropen-uri。但是,如果您的评论获得了好评,我很乐意将其包括在内,以表明该社区希望对此进行计数。
马提亚斯

再数一次。这包括。pastebin.com/qZp1QgKa
manatwork

2
好吧,我希望我们有关于计数规则的确切文档,但是据我所知,没有任何文档。可以确定的一件事:perl-p选项通常为+1。基于此,我算为-Mojo+4。
manatwork

1
这是我们使用过几次的一组规则
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"))}

相当简单地使用带参数(here )的第一行包含h1(用于名称)和=re(用于乐谱),然后拆分字符串(在字符和grepvalue=TRUEv=Tstrsplit><。)它不方便地查询页面两次(因此有两个“读取n个项目”警告),但时间较短。

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

4

Tcl,(231-39)192

不是最短的方法,而是使用官方API

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]

并且本着原始问题的精神:

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

查找具有该声誉的用户


对不起,这个混搭!

@LegoStormtroopr:我很清楚您的意思是用户ID时写了这个答案,但我想表明官方API也能够解决原始问题。
Johannes Kuhn

3

较短的CoffeeScript:143个字符(182-39)

这依赖于API始终以相同的顺序返回对象密钥,但是却减少了7个字符。

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个字符(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

(请注意,该程序会提示您输入“ undefined”,这是在询问用户ID。)


3

R-84

84 = 115-31

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

模拟:

> 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这对正则表达式非常有用。
Sven Hohenstein

3

101 100 - CoffeeScript的与jQuery

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

这是一个小提琴;只是知道它在您第一次打开页面时提示您,因此请准备好ID,或再次按Run。

或者我们可以超级hacky来保存整个角色!

$.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

一个更新的简短版本,使用了Steven Rumbalski Answer的一些想法,同时仍在使用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

这是人们可以使用的基本版本,但是我敢肯定人们会变得更矮。

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]

这似乎不起作用。http://stackoverflow.com/users/12340是404
约翰·德沃夏克

@JanDvorak,请尝试使用499214替代12340
彼得·泰勒

@PeterTaylor,那么问题不正确。
约翰·德沃夏克

2
@JanDvorak显然,具有该ID的用户不存在。

1

GNU Awk:217个字符

只是因为GNU awk本身支持TCP:没有模块/库/外部工具。

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

样品运行:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.