Quindi ... qual è il tuo punteggio StackOverflow?


21

Questo è semplice. Dato l'inserimento di un numero, restituire il nome e il punteggio di reputazione dell'utente Stack Overflow con quell'ID specificato . Il tuo programma può presumere che gli venga sempre assegnato un ID utente valido ed esistente.

Ad esempio: dato l'input 764357(che è il mio ID utente su StackOverflow) il programma restituirà LegoStormtroopr 3,088(approssimativamente) che potrebbe cambiare.

Ottieni l'URL: " /programming//users/ " o " http://api.stackexchange.com/2.1/users/ " gratuitamente, quindi il tuo punteggio è length of your program - 31 or 39, a seconda dell'URL che usi - ma dichiarare di che si tratta . Questo impedisce alle persone di abusare di abbreviazioni di URL.

modifica: senza chiamare un'API personalizzata che richiede Stack Overflow e restituisce solo il nome e il punteggio. Ma se conosci un'API ufficiale, allora è del tutto legittimo.

edit2: se hai bisogno di un input di esempio: ho fornito il mio ID di seguito, sentiti libero di aggiungere il tuo ID, nome utente e punteggio di seguito per aiutare gli altri. Nota di nuovo, questo è per il sito principale Stack Overflow.

764357   returns   LegoStormtroopr 3,088

hmm ... se ci sono più utenti con quel rappresentante, dovremmo sceglierne uno o visualizzarli tutti? Cosa succede se non esiste tale utente?
John Dvorak,

2
uh ... aspetta ... dell'utente con quel punteggio o dell'utente con quell'ID?
John Dvorak,

@JanDvorak Ho provato a chiarire. Il programma dovrebbe accettare un ID utente e restituire all'utente tale ID e il punteggio di reputazione dell'utente.

1
L'URL dovrebbe http://api.stackexchange.com/2.1/users/anche essere "gratuito" per evitare di penalizzare gli utenti dell'API?
Gnibbler,

1
Potremmo ottenere anche la site=stackoverflowparte gratuitamente?
Johannes Kuhn,

Risposte:


15

Script shell: 64 51 caratteri

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

Esecuzione di esempio:

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

(Notare che è necessario premere ^Ddopo aver digitato l'input in modo interattivo. O semplicemente inserirlo al comando.)


8

Rubino: 84 70 caratteri

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

Esecuzione di esempio:

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
Non hai bisogno di parole piene nella regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]sembra funzionare
Neil Slater

Corretta. Sono stati appena presi dalla mia risposta alla sceneggiatura della shell . ( grepvisualizzerebbe più partite solo per "ation" ".)
manatwork

@Doorknob, probabilmente hai omesso l' -ropen-uriopzione. (È obbligatorio e incluso nel conteggio dei personaggi.)
manatwork

@manatwork Ah, non me ne sono accorto. Va bene ora funziona.
Maniglia della porta

6

Python 2.7 - 119

(150 - 31)

Senza 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

Non credo che la ricerca in un semplice codice sorgente HTML porterà a una soluzione efficace. Ad esempio, alcune cose strane nel profilo di qualcuno possono rompere le tue soluzioni. Quindi mi piacerebbe cercare usando i selettori 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

Ecco una versione Javascript non golfata che utilizza l'API ufficiale con JSONP, per cominciare. L'uso dell'URL richiederebbe XHR, il che potrebbe essere abbastanza dettagliato, se trovo un po 'di tempo proverò una versione più giocata.

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

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

Esecuzione di esempio:

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

Leggibile e pulito: 128 - 31 = 97 byte

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

Esecuzione di esempio:

$ 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
È -Mojoincluso nel conteggio? Costa 4 caratteri.
Manatwork

@manatwork: No, non l'ho incluso nel conteggio, perché la risposta di Ruby non includeva -ropen-uri. Tuttavia, sono felice di includerlo se il tuo commento ottiene qualche voto in più come indicazione che la community vuole contarli.
Matthias,

Conta ancora. Include. pastebin.com/qZp1QgKa
manatwork

2
Bene, vorrei avere una documentazione esatta della regola di conteggio, ma come so, non ce n'è. Una cosa è certa: l perl' -popzione di solito viene contata +1. Sulla base di questo conto -Mojo+4.
Manatwork

1
Ecco una serie di regole che abbiamo usato alcune volte.
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"))}

Abbastanza semplicemente seleziona le prime righe contenenti h1(per il nome) e =re(per il punteggio) usando grepcon argomento value=TRUE(qui v=T) e quindi dividere la stringa (usando strsplitin caratteri >e <. Inconvenientemente interroga la pagina due volte (quindi i due "Leggi n elementi" avvertimenti) ma era più breve.

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

4

Tcl, (231 - 39) 192

non il modo più breve, ma utilizzando l'API ufficiale

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 nello spirito della domanda originale :

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

Trova utenti con quella reputazione


Mi dispiace per quel disguido!

@LegoStormtroopr: ho scritto questa risposta quando era chiaro che intendevi l'ID utente, ma mi è piaciuto mostrare che anche l'API ufficiale è in grado di risolvere la domanda originale.
Johannes Kuhn,

3

CoffeeScript più breve: 143 caratteri (182-39)

Questo si basa sull'API che restituisce sempre le chiavi dell'oggetto nello stesso ordine, ma rade 7 caratteri.

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

(Si noti che il programma richiede "indefinito": richiede l'ID utente.)


3

R - 84

84 = 115 - 31

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

Simulazione:

> 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 Questo è un uso molto impressionante delle espressioni regolari.
Sven Hohenstein,

3

101 100 - CoffeeScript con jQuery

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

Ecco un violino ; sappi solo che ti viene richiesto quando apri la pagina per la prima volta, quindi tieni pronto un ID o premi di nuovo Esegui.

Oppure possiamo essere super hacky per salvare un intero personaggio!

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

Una versione più recente e breve che utilizza alcune delle idee della risposta di Steven Rumbalski , pur utilizzando 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

Ecco una versione di base su cui le persone possono lavorare, ma sono sicuro che le persone possono anche essere più brevi.

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]

questo non sembra funzionare. http://stackoverflow.com/users/12340è il 404.
John Dvorak il

@JanDvorak, prova con 499214invece di12340
Peter Taylor il

@PeterTaylor allora la domanda non è corretta.
John Dvorak,

2
@JanDvorak Ovviamente, l'utente con quell'ID non esiste.

1

GNU Awk: 217 caratteri

Solo perché GNU awk supporta TCP nativamente: nessun modulo / libreria / strumento esterno.

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

Esecuzione di esempio:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.