それで…StackOverflowスコアは何ですか?


21

これは単純なものです。数値を入力すると、その特定のIDを持つStack Overflowユーザーの名前と評価スコアを返します。プログラムは、常に有効で既存のユーザーIDが与えられていると想定できます。

例:入力764357(StackOverflowでの私のユーザーID)が与えられると、プログラムはLegoStormtroopr 3,088(およそ)戻りますが、変更される可能性があります。

次のURLを取得します。「/programming//users/」または「http://api.stackexchange.com/2.1/users/」は無料です。使用するURLlength of your program - 31 or 39応じてスコアはどちらかを宣言してください。これにより、人々がURL短縮サービスを悪用することを防ぎます。

編集:そして、スタックオーバーフローをクエリし、名前とスコアのみを返すカスタムメイドのAPIを呼び出しません。 しかし、公式のAPIを知っている場合、それは完全に合法です。

edit2:入力例が必要な場合:以下に自分のIDを指定しました。他の人を助けるために、自分のID、ユーザー名、スコアを自由に追加してください。繰り返しますが、これはメインのStack Overflowサイト用です。

764357   returns   LegoStormtroopr 3,088

うーん...その担当者を持つ複数のユーザーがいる場合、1人を選ぶか、すべてを表示する必要がありますか?そのようなユーザーがいない場合はどうなりますか?
ジョンドヴォルザーク

2
えっと...待って...そのスコアのユーザーの、またはそのIDのユーザーの?
ジョンドヴォルザーク

@JanDvorak私は明確にしようとしました。プログラムはユーザーIDを受け入れ、そのIDを持つユーザーとそのユーザーのRep。Scoreを返す必要があります。

1
http://api.stackexchange.com/2.1/users/APIのユーザーにペナルティを課すことを避けるため、URL も「無料」にする必要がありますか?
ニブラー

1
site=stackoverflow部品も無料で入手できますか?
ヨハネ

回答:


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

Ruby: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]いるようです
ニールスレーター

正しい。それらは私のシェルスクリプトの回答から取られたものです。(grep
ation

@Doorknob、おそらく-ropen-uriオプションを省略しました。(これは必須であり、文字数に含まれています。)
manatwork

@manatworkああ、それに気づかなかった。さて、それは動作します。
ドアノブ


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を使用した、Java化されていない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:いいえ、Rubyの回答にはが含まれていなかったため、カウントに含めませんでした-ropen-uri。ただし、コミュニティがこれらを数えたいと思っていることを示すものとして、あなたのコメントが数票の賛成票を獲得した場合は、それを含めてうれしいです。
マティアス

もう一度数えて。含まれています。pastebin.com/qZp1QgKa
manatwork

2
さて、カウントルールの正確なドキュメントがあればいいのですが、私が知っているように、何もありません。確かなことが1つあります。通常、perl-pオプションは+1としてカウントされます。それに基づいて、-Mojo+ 4 を数えます。
マナトワーク

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

非常に単純に含む最初の行ピックh1(名前のために)と=re(スコアのために)使用してgrep引数を指定してvalue=TRUE(ここではv=T)、その後、文字列を分割(使用してstrsplit文字に>して<。不便なことは二度(したがって、二つの「読むには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でも元の質問を解決できることを示したいと思いました。
ヨハネ

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

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これは、正規表現の非常に印象的な使用法です。
スベンホーエンシュタイン

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.