Итак ... каков ваш счет 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, который запрашивает переполнение стека, и возвращает только имя и счет. Но если вы знаете официальный API, то это вполне законно.

edit2: Если вам нужен пример ввода: я дал мой идентификатор ниже, не стесняйтесь добавлять свой собственный идентификатор, имя пользователя и счет ниже, чтобы помочь другим. Отметьте еще раз, это для основного сайта переполнения стека.

764357   returns   LegoStormtroopr 3,088

хм ... если есть несколько пользователей с этим представителем, мы должны выбрать одного или отобразить их всех? Что делать, если такого пользователя нет?
Джон Дворжак

2
э-э ... подождите ... пользователя с таким счетом или пользователя с этим идентификатором?
Джон Дворжак

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

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

Рубин: 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» ».)
manatwork

@ Doorknob, возможно, вы пропустили эту -ropen-uriопцию. (Это обязательно и входит в число персонажей.)
manatwork

@manatwork Ах, я этого не заметил. Хорошо, теперь это работает.
Дверная ручка

6

Python 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: Нет, я не включил его в подсчет, потому что ответ Ruby не включал -ropen-uri. Тем не менее, я рад включить его, если ваш комментарий наберет несколько голосов, что свидетельствует о том, что сообщество хочет их подсчитать.
Матиас

Считай снова. Это включает. pastebin.com/qZp1QgKa
manatwork

2
Ну, я бы хотел, чтобы у нас была точная документация по правилу подсчета, но, как я знаю, ее нет. Одно несомненно: perl«s -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"))}

Довольно просто выбирает первые строки, содержащие 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

(Обратите внимание, что программа запрашивает «неопределенное» - запрашивает идентификатор пользователя.)


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/12340404.
Джон Дворжак

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