Codegolf — Итак… Какой У Вас Счет На Stackoverflow?

  • Автор темы Александр Иванников
  • Обновлено
  • 19, Oct 2024
  • #1

Это простой вопрос. Учитывая введенное число, верните имя и оценку репутации пользователя Stack Overflow с этим данный идентификатор. Ваша программа может предполагать, что ей всегда предоставляется действительный и существующий идентификатор пользователя.

Например: учитывая ввод

 764357   returns   LegoStormtroopr 3,088
 
(which is my userID on StackOverflow) the program would return length of your program - 31 or 39 (приблизительно) это может измениться.

Вы получаете URL: "https://stackoverflow.com/users/" или "http://api.stackexchange.com/2.1/users/" бесплатно, поэтому ваш счет LegoStormtroopr 3,088 , в зависимости от того, какой URL-адрес вы используете, но укажите, какой именно. Это предотвращает злоупотребление сокращателями URL-адресов.

редактировать: И не вызывать специальный API, который запрашивает переполнение стека и возвращает только имя и оценку. Но если вы знаете официальный API, то это совершенно законно.

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

764357

#код-гольф #stack-exchange-api

Александр Иванников


Рег
22 Oct, 2020

Тем
82

Постов
203

Баллов
703
  • 26, Oct 2024
  • #2

Сценарий оболочки: 64 51 символ.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 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
 

Пример запуска:

{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]}}

(Обратите внимание, что вам нужно нажать awk after typing in the input interactively. Or just pipe it to the command.)

 

Street_styler


Рег
25 May, 2006

Тем
73

Постов
223

Баллов
618
  • 26, Oct 2024
  • #3

Рубин: 84 70 символов

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]

Пример запуска:

import urllib,re r=re.findall('r (.*?) -|re">(.*?)<',urllib.urlopen("http://stackoverflow.com/users/%d"%input()).read()) print r[0][0],r[2][1] ||answer||

Питон 2.7 – 119

(150 - 31)

Без регулярного выражения:

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

Питон 3, 117

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

Я не думаю, что поиск в простом исходном коде HTML приведет к надежному решению. Например, какие-то странные вещи в профиле могут помешать вашим решениям. Поэтому я хотел бы выполнить поиск с помощью селекторов CSS.

> 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" ||answer||

Javascript 217

Вот версия Javascript без поддержки гольфа, использующая официальный API с JSONP, для начала с . Для использования URL-адреса потребуется XHR, который может быть довольно многословным, но если я найду время, я попробую более продвинутую версию.

sub(".*\\/(.*)\\?.*>(.*)<.*","\\1 \\2",grep("b=r",scan(paste0("http://stackoverflow.com/users/",scan(n=1)),""),v=T)[1]) ||answer||

Perl 5 (с Mojolicious), 87 – 31 = 56 байт

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

Пример запуска:

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

Читабельно и чисто: 128–31 = 97 байт.

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

Пример запуска:

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] ||answer||

Р: 150-31=119

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

Достаточно просто выбрать первые строки, содержащие < (for the name) and > (для оценки), используя strsplit with argument v=T (здесь value=TRUE ) and then split the string (using grep у персонажей =re and h1 . Неудобно, что он запрашивает страницу дважды (отсюда и два предупреждения «Прочитать n элементов»), но это было короче.

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

Ткл, (231 – 39) 192

не самый короткий путь, а с использованием официального API

$ 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

И в духе оригинальный вопрос:

say $_->at("#user-displayname")->text, ": ", $_->at(".reputation a")->text for g("http://stackoverflow.com/users/".pop)->dom

Находит пользователей с такой репутацией

 

Neznau


Рег
24 Feb, 2008

Тем
78

Постов
211

Баллов
611
  • 26, Oct 2024
  • #4

Сокращенный CoffeeScript: 143 символа (182–39).

Это основано на том, что API всегда возвращает ключи объекта в одном и том же порядке, но сокращает 7 символов.

$ perl -Mojo -E 'say/h1.*>(.*)</,$/,/core">(.*?)</ for g("http://stackoverflow.com/users/".pop)->dom' 764357 Lego Stormtroopr 3,103

CoffeeScript: 150 символов (189–39)

say/h1.*>(.*)</,$/,/core">(.*?)</ for g("http://stackoverflow.com/users/".pop)->dom

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

 

Ju1cy_PS


Рег
01 Jan, 2011

Тем
78

Постов
172

Баллов
582
  • 26, Oct 2024
  • #5

Р - 84

84 = 115 - 31

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)

Моделирование:

from lxml.html import* C=parse('http://stackoverflow.com/users/'+input()).getroot().cssselect print(C('[id^=u]')[0].text,C('[class$=ore]')[0].text) ||answer||

101 100 — CoffeeScript с jQuery

117 = 148 - 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] ||answer||

Питон 2.7 – 112

112 = 143 - 31

Новая, короткая версия, в которой используются некоторые идеи из Стивен Румбальски отвечает, все еще используя Regex.

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

133 = 164 - 31

Вот базовая версия для людей, но я уверен, что люди могут сделать ее еще короче.

s=open("http://stackoverflow.com/users/"+gets).read puts s[/me">(.+)</,1],s[/n">([\d,]+)/,1] ||answer||

GNU Awk: 217 символов.

Просто потому, что GNU ^D supports TCP natively: no module/library/external tool.

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

Пример запуска:

curl -sL http://stackoverflow.com/users/`cat`|grep -oPm2 'n">\K[0-9,]+|e">\K[^<]+'
 

Fanrus


Рег
30 Sep, 2004

Тем
92

Постов
198

Баллов
708
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно