그렇다면… StackOverflow 점수는 얼마입니까?


21

이것은 간단한 것입니다. 숫자를 입력하면 해당 ID를 가진 스택 오버플로 사용자의 이름과 평판 점수를 반환합니다 . 프로그램은 항상 유효하고 존재하는 사용자 ID가 있다고 가정 할 수 있습니다.

예를 들어 : 입력 764357(StackOverflow의 내 사용자 ID)에서 프로그램은LegoStormtroopr 3,088 (대략) 변경 될 수 있습니다.

"당신은 URL을 얻을 /programming//users/ "또는 " http://api.stackexchange.com/2.1/users/ 점수가 그래서, 무료로" length of your program - 31 or 39, 당신이 사용하는 URL에 따라 -하지만 그것이 무엇인지 선언하십시오 . 이렇게하면 사람들이 URL 단축기를 남용하지 못합니다.

편집 : 스택 오버플로를 쿼리하고 이름과 점수 만 반환하는 사용자 정의 API를 호출하지 않습니다. 그러나 공식 API를 알고 있다면 이는 완전히 합법적입니다.

edit2 : 예시 입력이 필요한 경우 : 아래에 ID를 입력했습니다. 다른 사용자를 돕기 위해 아래에 자신의 ID, 사용자 이름 및 점수를 추가하십시오. 다시 한 번, 이것은 주요 스택 오버플로 사이트에 해당됩니다.

764357   returns   LegoStormtroopr 3,088

흠 ... 그 담당자와 여러 사용자가있는 경우 하나를 선택하거나 모두 표시해야합니까? 그러한 사용자가 없으면 어떻게합니까?
John Dvorak

2
어 .. 그 점수를 가진 사용자 또는 그 ID를 가진 사용자의 잠깐만?
John Dvorak

@JanDvorak 나는 명확히하려고 노력했다. 프로그램은 사용자 ID를 수락하고 해당 ID를 가진 사용자와 해당 사용자의 담당자 점수를 반환해야합니다.

1
http://api.stackexchange.com/2.1/users/API 사용자에게 불이익을주지 않기 위해 URL 도 "무료" 여야합니까 ?
gnibbler

1
site=stackoverflow부품도 무료로 받을 수 있습니까?
Johannes Kuhn

답변:


15

쉘 스크립트 : 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

옳은. 그들은 단지 내 쉘 스크립트 답변 에서 가져온 입니다. ( grep단지 "ation" "에 대해 더 많은 일치 항목을 표시합니다.)
manatwork

@Doorknob, 아마도 -ropen-uri옵션 을 생략했을 것입니다 . (필수적이고 문자 수에 포함되어 있습니다.)
manatwork

@manatwork 아, 그것을 알아 차리지 못했습니다. 이제 작동합니다.
Doorknob

6

파이썬 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

파이썬 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

자바 스크립트 217

JSONP와 함께 공식 api를 사용하여 ungolfed Javascript 버전을 시작합니다. URL을 사용하려면 XHR이 필요합니다 .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. 그러나, 귀하의 의견이 커뮤니티가 이러한 의견을 세기를 원한다는 표시로 몇 개의 투표권을 얻은 경우이 내용을 포함하게되어 기쁩니다.
Matthias

다시 세어보세요. 포함합니다. pastebin.com/qZp1QgKa
manatwork 9

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(점수)가 포함 된 첫 번째 줄을 선택한 다음 문자열을 분리합니다 ( 문자 및을 사용하여) . 페이지를 두 번 쿼리합니다 (따라서 두 개의 "읽기 n 항목") 경고)하지만 짧았습니다.grepvalue=TRUEv=Tstrsplit><

>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

(프로그램은 "정의되지 않음"을 묻습니다. 사용자 ID를 요구합니다.)


3

제 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 정규 표현식을 매우 인상적으로 사용합니다.
스벤 호헨 슈타인

3

101 100-jQuery를 사용한 CoffeeScript

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

여기 바이올린이 있습니다 . 페이지를 처음 열면 메시지가 표시되므로 ID를 준비하거나 실행을 다시 누르십시오.

또는 전체 캐릭터를 구하기 위해 매우 해키가 될 수 있습니다!

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

2

파이썬 2.7-112

112 = 143-31

Steven Rumbalski 의 아이디어 중 일부를 사용 하면서도 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
Peter Taylor

@PeterTaylor 그렇다면 질문이 잘못되었습니다.
John Dvorak

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.