Então ... qual é a sua pontuação no StackOverflow?


21

Este é simples. Dada a entrada de um número, retorne o nome e a pontuação de reputação do usuário do Stack Overflow com esse ID fornecido . Seu programa pode assumir que sempre é fornecido um ID de usuário válido e existente.

Por exemplo: dada a entrada 764357(que é meu ID do usuário no StackOverflow), o programa retornaria LegoStormtroopr 3,088(aproximadamente) isso pode mudar.

Você obtém o URL: " /programming//users/ " ou " http://api.stackexchange.com/2.1/users/ " gratuitamente, então sua pontuação é length of your program - 31 or 39, dependendo do URL que você usa - mas declarar qual é . Isso evita que as pessoas abusem dos encurtadores de URL.

editar: e não chamar uma API personalizada que consulta Stack Overflow e retorna apenas o nome e a pontuação. Mas se você conhece uma API oficial, isso é totalmente legítimo.

edit2: Se você precisar de um exemplo de entrada: Dei meu ID abaixo, fique à vontade para adicionar seu próprio ID, nome de usuário e pontuação abaixo para ajudar outras pessoas. Observe novamente que este é o site principal do estouro de pilha.

764357   returns   LegoStormtroopr 3,088

hmm ... se houver vários usuários com esse representante, devemos escolher um ou exibir todos eles? E se não houver esse usuário?
quer

2
espera ... do usuário com essa pontuação ou do usuário com esse ID?
precisa

@JanDvorak Eu tentei esclarecer. O programa deve aceitar um ID do usuário e retornar o usuário com esse ID e a pontuação Rep. De usuários.

11
O URL http://api.stackexchange.com/2.1/users/também deve ser "gratuito" para evitar penalizar os usuários da API?
Gnibbler 03/10

11
Poderíamos obter o site=stackoverflowpapel de graça também?
Johannes Kuhn

Respostas:


15

Script de shell: 64 51 caracteres

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

Exemplo de execução:

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

(Observe que você deve pressionar ^Ddepois de digitar a entrada interativamente. Ou simplesmente direcione-a para o comando.)


8

Ruby: 84 70 caracteres

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

Exemplo de execução:

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

11
Você não precisa de palavras cheias no regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]parece funcionar
Neil Slater

Corrigir. Eles foram retirados da minha resposta de script de shell . ( grepexibiria mais correspondências por apenas "ação").)
manatwork

@ Doorknob, provavelmente você omitiu a -ropen-uriopção. (É obrigatório e incluído na contagem de caracteres.)
manatwork

@manatwork Ah, não percebi isso. Ok, agora funciona.
Maçaneta

6

Python 2.7 - 119

(150 - 31)

Sem 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

Eu não acho que pesquisar em código-fonte HTML simples leve a uma solução forte. Por exemplo, algumas coisas estranhas no perfil de alguém podem quebrar suas soluções. Então, eu gostaria de pesquisar usando seletores 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

Heres uma versão Javascript ungolfed usando a API oficial com JSONP, para começar. Usar o URL exigiria XHR, que deve ser bem detalhado, se encontrar algum tempo, tentarei uma versão mais eficiente.

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 (com Mojolicious), 87 - 31 = 56 bytes

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

Exemplo de execução:

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

Legível e limpo: 128 - 31 = 97 bytes

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

Exemplo de execução:

$ 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

11
Está -Mojoincluído na contagem? Isso custa 4 caracteres.
manatwork

@manatwork: Não, eu não o incluí na contagem, porque a resposta do Ruby não incluiu -ropen-uri. No entanto, fico feliz em incluí-lo se o seu comentário receber alguns votos positivos, como indicação de que a comunidade deseja contá-los.
Matthias

Conte novamente. Inclui. pastebin.com/qZp1QgKa
manatwork

2
Bem, eu gostaria que tivéssemos uma documentação exata da regra de contagem, mas como eu sei, não há nenhuma. Uma coisa é certa: perla -popção de normalmente é contada com +1. Com base nisso, conto -Mojo+4.
manatwork

11
Aqui está um conjunto de regras que usamos algumas vezes.
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"))}

Simplesmente escolhe as primeiras linhas que contêm h1(para o nome) e =re(para a partitura) usando grepcom argumento value=TRUE(aqui v=T) e depois divide a string (usando strsplitcaracteres >e <. Inconvenientemente, ele consulta a página duas vezes (daí os dois "Leia n itens" avisos), mas foi mais curto.

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

4

Tcl, (231-39) 192

não da maneira mais curta, mas usando a API oficial

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]

E no espírito da pergunta original :

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

Localiza usuários com essa reputação


Desculpe por essa confusão!

@LegoStormtroopr: escrevi esta resposta quando ficou claro que você quer dizer o ID do usuário, mas eu gostava de mostrar que a API oficial também é capaz de resolver a pergunta original.
Johannes Kuhn

3

Café mais curto: 143 caracteres (182 - 39)

Isso depende da API sempre retornando as chaves do objeto na mesma ordem, mas retira 7 caracteres.

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 caracteres (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

(Observe que o programa solicita "indefinido" - está solicitando o ID do usuário.)


3

R - 84

84 = 115 - 31

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

Simulação:

> 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 Este é um uso muito impressionante de expressões regulares.
Sven Hohenstein

3

101 100 - CoffeeScript com jQuery

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

Aqui está um violino ; apenas saiba que ele será solicitado quando você abrir a página pela primeira vez, então tenha um ID pronto ou pressione Executar novamente.

Ou podemos ser super hacky para salvar um personagem inteiro!

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

Uma versão mais recente e curta que usa algumas das idéias de Steven Rumbalski responde , enquanto ainda usa 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

Aqui está uma versão básica para as pessoas trabalharem, mas tenho certeza que as pessoas podem ficar ainda mais curtas.

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]

isso não parece funcionar. http://stackoverflow.com/users/12340é 404.
John Dvorak

@JanDvorak, tente com em 499214vez de12340
Peter Taylor

@ PeterTaylor, então a pergunta está incorreta.
quer

2
@JanDvorak Obviamente, o usuário com esse ID não existe.

1

GNU Awk: 217 caracteres

Só porque o GNU awksuporta TCP nativamente: nenhum módulo / biblioteca / ferramenta externa.

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

Exemplo de execução:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.