Отже ... який ваш показник StackOverflow?


21

Це простий. З огляду на введення числа, поверніть ім'я та репутацію користувача переповнення стека разом з цим ідентифікатором . Ваша програма може вважати, що їй завжди надається дійсний і існуючий ідентифікатор користувача.

Наприклад: з огляду на вхід 764357(який є моїм ідентифікатором користувача у 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: Якщо вам потрібен приклад введення: я вказав свій ідентифікатор нижче, сміливо додайте свій ідентифікатор, ім’я користувача та бал нижче, щоб допомогти іншим. Зверніть увагу ще раз, це для головного сайту Stack Overflow.

764357   returns   LegoStormtroopr 3,088

хм ... якщо є кілька користувачів із цим представником, ми повинні вибрати одного чи відобразити їх усіх? Що робити, якщо такого користувача немає?
Джон Дворак

2
е-е ... зачекайте ... користувача з цією оцінкою, або користувача з цим ідентифікатором?
Джон Дворак

@JanDvorak Я намагався уточнити. Програма повинна прийняти ідентифікатор користувача та повернути йому користувача з цим ідентифікатором, і цей репортаж користувачів.

1
Чи має URL-адреса http://api.stackexchange.com/2.1/users/також бути "вільною", щоб уникнути штрафу користувачів API?
гніблер

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відобразило б більше збігів лише за "
атію

@Doorknob, ймовірно, ви пропустили -ropen-uriваріант. (Це обов'язкове і входить до числа персонажів.)
маніпуляція

@manatwork Ага, цього не помічав. Гаразд, зараз це працює.
Дверна ручка

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

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 (з 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. Однак я радий включити його, якщо ваш коментар отримає кілька голосів, що свідчать про те, що громада хоче їх перерахувати.
Маттіас

Порахуйте ще раз. Це включає. pastebin.com/qZp1QgKa
manatwork

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: Цю відповідь я написав, коли було зрозуміло, що ви маєте на увазі userid, але мені подобалося показати, що офіційний 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

(Зверніть увагу, що програма запрошує вас на "невизначений" - він запитує ідентифікатор користувача.)


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 - CoffeeScript з 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

Python 2.7 - 112

112 = 143 - 31

Більш нова, коротка версія, яка використовує деякі ідеї відповіді Стівена Румбальського , використовуючи 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 Очевидно, що користувача з цим ідентифікатором не існує.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.