तो ... आपका StackOverflow स्कोर क्या है?


21

यह एक सरल है। किसी नंबर के इनपुट को देखते हुए, उस दिए गए आईडी के साथ स्टैक ओवरफ्लो उपयोगकर्ता का नाम और प्रतिष्ठा स्कोर लौटाएं । आपका कार्यक्रम यह मान सकता है कि इसे हमेशा एक मान्य और मौजूद उपयोगकर्ता आईडी दिया जाता है।

उदाहरण के लिए: इनपुट 764357(जो StackOverflow पर मेरा userID है) को देखते हुए प्रोग्राम वापस आ जाएगा LegoStormtroopr 3,088(लगभग) यह बदल सकता है।

आपको URL मिलता है: " /programming//users/ " या " http://api.stackexchange.com/2.1/users/ " मुफ्त में, इसलिए आपका स्कोर है length of your program - 31 or 39, इस बात पर निर्भर करता है कि आप किस URL का उपयोग करते हैं - लेकिन घोषित जो यह है । यह लोगों को URL शॉर्टर्स को गाली देने से रोकता है।

संपादित करें: और एक कस्टम मेड एपीआई को कॉल नहीं करता है जो स्टैक ओवरफ्लो को क्वेरी करता है, और बस नाम और स्कोर लौटाता है। लेकिन अगर आप एक ऑफिशियल एपीआई के बारे में जानते हैं, तो यह पूरी तरह से वैध है।

edit2: यदि आपको एक उदाहरण इनपुट की आवश्यकता है: मैंने नीचे अपनी आईडी दी है, तो अपनी खुद की आईडी, उपयोगकर्ता नाम जोड़ने के लिए स्वतंत्र महसूस करें और दूसरों की मदद करने के लिए नीचे स्कोर करें। ध्यान दें, यह मुख्य स्टैक ओवरफ्लो साइट के लिए है।

764357   returns   LegoStormtroopr 3,088

हम्म ... अगर उस प्रतिनिधि के साथ कई उपयोगकर्ता हैं, तो क्या हमें एक को चुनना चाहिए, या उन सभी को प्रदर्शित करना चाहिए? अगर ऐसा कोई उपयोगकर्ता नहीं है तो क्या होगा?
जॉन ड्वोरक

2
उह ... प्रतीक्षा करें ... उस स्कोर वाले उपयोगकर्ता की, या उस आईडी वाले उपयोगकर्ता की?
जॉन ड्वोरक

@JanDvorak मैंने स्पष्ट करने की कोशिश की है। कार्यक्रम को एक उपयोगकर्ता आईडी को स्वीकार करना चाहिए, और उस आईडी के साथ उपयोगकर्ता को वापस करना चाहिए, और उपयोगकर्ता पुन: स्कोर करें।

1
क्या http://api.stackexchange.com/2.1/users/API के उपयोगकर्ताओं को दंडित करने से बचने के लिए url को "मुक्त" होना चाहिए ?
gnibbler

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

रूबी: 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सिर्फ "
प्याज

@Doorknob, शायद आपने -ropen-uriविकल्प छोड़ दिया है। (यह अनिवार्य है और चरित्र गणना में शामिल है।)
मैनटवर्क

@manatwork आह, ध्यान नहीं दिया। ठीक है अब यह काम करता है।
दरवाज़े

6

पायथन 2.7 - 119

(१५० - ३१)

रेगेक्स के बिना:

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 के साथ आधिकारिक एपीआई का उपयोग करते हुए एक ungolfed जावास्क्रिप्ट संस्करण का उपयोग करता है। यूआरएल का उपयोग करने के लिए एक्सएचआर की आवश्यकता होगी, जो बोना काफी क्रियात्मक होगा, अगर मुझे कुछ समय लगता है तो मैं अधिक गोल्फ संस्करण की कोशिश करूंगा।

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

पर्ल 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 वर्ण है।
मैनटवर्क

@ मैनटवर्क: नहीं, मैंने इसे गिनती में शामिल नहीं किया, क्योंकि रूबी के जवाब में शामिल नहीं था -ropen-uri। हालाँकि, मुझे यह शामिल करते हुए खुशी हो रही है कि अगर आपकी टिप्पणी को कुछ वोट मिले जो संकेत के रूप में हैं कि समुदाय इनकी गिनती करना चाहता है।
मथायस

फिर से गिना। उसमे समाविष्ट हैं। pastebin.com/qZp1QgKa
मैनटवर्क

2
खैर, मेरी इच्छा है कि हमारे पास गिनती के नियम का एक सटीक दस्तावेज हो, लेकिन जैसा कि मैं जानता हूं, कोई भी नहीं है। एक बात निश्चित है: perlके -pविकल्प आमतौर पर +1 गिना जाता है। उसके आधार पर मैं -Mojo+4 गिनता हूं ।
मैनटवर्क

1
यहां उन नियमों का एक सेट है, जिनका हम कुछ समय से उपयोग कर रहे हैं।
जेबी

4

आर: 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वर्णों का उपयोग करते हुए >और <। असंगत रूप से यह पृष्ठ पर दो बार प्रश्न करता है (इसलिए दो "एन आइटम पढ़ें") चेतावनियाँ) लेकिन वह छोटी थी।

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

4

Tcl, (231 - 39) 192

सबसे छोटा तरीका नहीं है, लेकिन आधिकारिक एपीआई का उपयोग करना

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: मैंने यह उत्तर तब लिखा था जब यह स्पष्ट था कि आपका मतलब उपयोगकर्ता से है, लेकिन मुझे यह दिखाना पसंद है कि आधिकारिक एपीआई मूल प्रश्न को भी हल करने में सक्षम है।
जोहान्स कुह्न

3

छोटा कॉफीस्क्रिप्ट: 143 अक्षर (182 - 39)

यह एपीआई पर निर्भर करता है हमेशा एक ही क्रम में ऑब्जेक्ट कुंजी को लौटाता है, लेकिन 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

कॉफीस्क्रिप्ट: 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

(ध्यान दें कि कार्यक्रम आपको "अपरिभाषित" के लिए संकेत देता है - यह उपयोगकर्ता आईडी के लिए पूछ रहा है।


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 के

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

यहाँ एक बेला है ; बस यह जान लें कि जब आप पहली बार पृष्ठ खोलते हैं, तो यह आपको संकेत देता है, इसलिए एक आईडी तैयार करें, या फिर से रन दबाएं।

या हम एक पूरे चरित्र को बचाने के लिए सुपर हैक हो सकते हैं!

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

एक नया, छोटा संस्करण जो रेगेक्स का उपयोग करते हुए, स्टीवन रूंबल्स्की के विचारों में से कुछ का उपयोग करता है ।

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/12340404 है।
जॉन ड्वोरक

@JDDvorak, के 499214बजाय की कोशिश12340
पीटर टेलर

@PeterTaylor तो सवाल गलत है।
जॉन ड्वोरक

2
@JDDvorak जाहिर है, उस आईडी वाला उपयोगकर्ता मौजूद नहीं है।

1

GNU Awk: 217 वर्ण

सिर्फ इसलिए कि GNU awkTCP को मूल रूप से समर्थन करता है: कोई मॉड्यूल / लाइब्रेरी / बाहरी उपकरण नहीं।

{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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.