ดังนั้น…คะแนน StackOverflow ของคุณคืออะไร


21

นี่คือหนึ่งที่เรียบง่าย ได้รับการป้อนข้อมูลของจำนวนการคืนชื่อและชื่อเสียงของคะแนนของผู้ใช้มากเกิน Stack กับรหัสที่ระบุ โปรแกรมของคุณสามารถสมมติว่าได้รับ ID ผู้ใช้ที่ถูกต้องและมีอยู่เสมอ

ตัวอย่างเช่น: กำหนดอินพุต764357(ซึ่งคือ userID ของฉันบน StackOverflow) โปรแกรมจะส่งคืนLegoStormtroopr 3,088(โดยประมาณ) อาจมีการเปลี่ยนแปลง

คุณจะได้รับ URL นี้: " /programming//users/ " หรือ " http://api.stackexchange.com/2.1/users/ " ฟรีเพื่อให้คะแนนของคุณคือlength of your program - 31 or 39, ซึ่งขึ้นอยู่กับ URL ที่คุณใช้ - แต่ ประกาศว่ามันคืออะไร วิธีนี้ช่วยป้องกันไม่ให้ผู้อื่นใช้ URL แบบย่อ

แก้ไข: และไม่มีการเรียกใช้ API ที่กำหนดเองซึ่งแบบสอบถาม Stack Overflow และส่งกลับเฉพาะชื่อและคะแนน แต่ถ้าคุณรู้เกี่ยวกับ API อย่างเป็นทางการแสดงว่าถูกต้องตามกฎหมายโดยสิ้นเชิง

edit2: หากคุณต้องการตัวอย่างอินพุต: ฉันได้รับ ID ด้านล่างโปรดเพิ่ม ID ชื่อผู้ใช้และคะแนนด้านล่างของคุณเองเพื่อช่วยเหลือผู้อื่น โปรดทราบอีกครั้งนี่เป็นข้อมูลสำหรับไซต์สแต็คโอเวอร์โฟลว์หลัก

764357   returns   LegoStormtroopr 3,088

อืม ... ถ้ามีผู้ใช้หลายคนที่มีตัวแทนนั้นเราควรเลือกอันใดอันหนึ่งหรือแสดงทั้งหมด เกิดอะไรขึ้นถ้าไม่มีผู้ใช้ดังกล่าว?
John Dvorak

2
เอ่อ ... รอ ... จากผู้ใช้ด้วยคะแนนนั้นหรือของผู้ใช้ที่มี ID นั้น?
John Dvorak

@JanDvorak ฉันพยายามอธิบาย โปรแกรมควรยอมรับ ID ผู้ใช้และส่งคืนผู้ใช้ด้วย ID นั้นและคะแนนผู้ใช้นั้น

1
URL ควรhttp://api.stackexchange.com/2.1/users/เป็น "ฟรี" เพื่อหลีกเลี่ยงการลงโทษผู้ใช้ API หรือไม่
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

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
คุณไม่ต้องการคำเต็มใน regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]ดูเหมือนว่าจะใช้งานได้
Neil Slater

แก้ไข. พวกเขาถูกพามาจากฉันคำตอบเชลล์สคริปต์ ( grepจะแสดงการแข่งขันที่มากขึ้นสำหรับเพียงแค่ "ation" ")
manatwork

@Doorknob คุณอาจไม่ได้ใช้-ropen-uriตัวเลือกนี้ (มันเป็นข้อบังคับและรวมอยู่ในจำนวนตัวละคร)
จัดการ

@ manatwork อ่าไม่ได้สังเกตว่า โอเคตอนนี้มันใช้งานได้
Doorknob

6

Python 2.7 - 119

(150 - 31)

โดยไม่ต้อง 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

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

เป็นรุ่น Javascript ที่ไม่ได้รับความนิยมโดยใช้ API อย่างเป็นทางการกับ JSONP เพื่อเริ่มต้น การใช้ 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 (with 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: -ropen-uriไม่มีผมไม่ได้รวมไว้ในการนับเพราะคำตอบที่ทับทิมไม่ได้รวม อย่างไรก็ตามฉันยินดีที่จะรวมไว้หากความคิดเห็นของคุณได้รับการโหวตน้อยลงเป็นข้อบ่งชี้ว่าชุมชนต้องการนับสิ่งเหล่านี้
Matthias

นับอีกครั้ง มันรวมถึง pastebin.com/qZp1QgKa
จัดการ

2
ฉันหวังว่าเราจะมีเอกสารที่ถูกต้องเกี่ยวกับกฎการนับ แต่อย่างที่ฉันรู้ว่าไม่มี สิ่งหนึ่งที่แน่นอน: perl's -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: ฉันเขียนคำตอบนี้เมื่อเห็นได้ชัดว่าคุณหมายถึงหมายเลขผู้ใช้ แต่ฉันชอบที่จะแสดงว่า 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 นี่เป็นการใช้นิพจน์ทั่วไปที่น่าประทับใจมาก
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 พร้อมหรือกดเรียกใช้อีกครั้ง

หรือเราอาจแฮ็คสุด ๆ เพื่อช่วยตัวละครทั้งหมด!

$.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ในขณะที่ยังใช้ 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.
John Dvorak

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