Entonces ... ¿cuál es su puntaje StackOverflow?


21

Esto es muy simple. Dada la entrada de un número, devuelve el nombre y el puntaje de reputación del usuario de Stack Overflow con esa ID dada . Su programa puede asumir que siempre se le da una identificación de usuario válida y existente.

Por ejemplo: dada la entrada 764357(que es mi ID de usuario en StackOverflow), el programa devolvería LegoStormtroopr 3,088(aproximadamente) podría cambiar.

Se obtiene la URL: " /programming//users/ " o " http://api.stackexchange.com/2.1/users/ " de forma gratuita, por lo que su puntuación es length of your program - 31 or 39, dependiendo de la URL que utiliza - pero declara cual es . Esto evita que las personas abusen de los acortadores de URL.

editar: Y no llamar a una API personalizada que consulta Stack Overflow, y devuelve solo el nombre y la puntuación. Pero si conoce una API oficial, entonces eso es totalmente legítimo.

edit2: si necesita una entrada de ejemplo: he proporcionado mi ID a continuación, siéntase libre de agregar su propia ID, nombre de usuario y puntaje a continuación para ayudar a otros. Tenga en cuenta nuevamente, esto es para el sitio principal de Stack Overflow.

764357   returns   LegoStormtroopr 3,088

hmm ... si hay varios usuarios con ese representante, ¿deberíamos elegir uno o mostrarlos a todos? ¿Qué pasa si no hay tal usuario?
John Dvorak

2
eh ... espera ... del usuario con esa puntuación, o del usuario con esa ID?
John Dvorak

@ JanDvorak He tratado de aclarar. El programa debe aceptar una ID de usuario y devolver al usuario esa ID, y la puntuación de Rep.

1
¿La URL http://api.stackexchange.com/2.1/users/también debería ser "gratuita" para evitar penalizar a los usuarios de la API?
gnibbler

1
¿Podríamos obtener la site=stackoverflowpieza gratis también?
Johannes Kuhn

Respuestas:


15

Script de shell: 64 51 caracteres

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

Ejecución de muestra:

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

(Tenga en cuenta que debe presionar ^Ddespués de escribir la entrada de forma interactiva. O simplemente canalizarla al comando).


8

Rubí: 84 70 caracteres

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

Ejecución de muestra:

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
No necesita palabras completas en la expresión regular: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]parece funcionar
Neil Slater

Correcto. Fueron tomados de la respuesta de mi script de shell . ( grepmostraría más coincidencias por solo "acción").
manatwork

@Doorknob, probablemente omitió la -ropen-uriopción. (Es obligatorio e incluido en el recuento de personajes)
Manatwork

@manatwork Ah, no me di cuenta de eso. Está bien ahora funciona.
Pomo de la puerta

6

Python 2.7 - 119

(150 - 31)

Sin expresiones regulares:

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

Pitón 3, 117

117 = 148 - 31

No creo que la búsqueda en código fuente HTML simple conduzca a una solución sólida. Por ejemplo, algunas cosas extrañas en el perfil de uno pueden romper sus soluciones. Entonces me gustaría buscar usando selectores 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

Para empezar, aquí hay una versión de Javascript sin golf usando la API oficial con JSONP. Usar la url requeriría XHR, que podría ser bastante detallado, si encuentro algún tiempo, intentaré una versión más golfizada.

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 bytes

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

Ejecución de muestra:

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

Legible y limpio: 128 - 31 = 97 bytes

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

Ejecución de muestra:

$ 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
¿Está -Mojoincluido en el recuento? Eso cuesta 4 caracteres.
manatwork

@manatwork: No, no lo incluí en el recuento, porque la respuesta de Ruby no lo incluyó -ropen-uri. Sin embargo, me complace incluirlo si su comentario obtiene algunos votos positivos como indicación de que la comunidad quiere contarlos.
Matthias

Cuenta de nuevo. Incluye. pastebin.com/qZp1QgKa
manatwork

2
Bueno, desearía tener una documentación exacta de la regla de conteo, pero como sé, no hay ninguna. Una cosa es segura: perlla -popción de ' usualmente se cuenta +1. Basado en eso cuento -Mojo+4.
manatwork

1
Aquí hay un conjunto de reglas que hemos estado usando varias veces.
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"))}

Simplemente selecciona las primeras líneas que contienen h1(para el nombre) y =re(para la puntuación) usando grepcon argumento value=TRUE(aquí v=T) y luego divide la cadena (usando los strsplitcaracteres >y <. Inconvenientemente consulta la página dos veces (de ahí los dos "Leer n elementos" advertencias) pero eso fue más corto.

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

4

Tcl, (231-39) 192

no es el camino más corto, sino que usa la 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]

Y en espíritu de la pregunta 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]"}

Encuentra usuarios con esa reputación


Lo siento por esa confusión!

@LegoStormtroopr: escribí esta respuesta cuando estaba claro que te referías al ID de usuario, pero me gustó demostrar que la API oficial también puede resolver la pregunta original.
Johannes Kuhn el

3

CoffeeScript más corto: 143 caracteres (182 - 39)

Esto se basa en que la API siempre devuelve las claves de objeto en el mismo orden, pero elimina 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

(Tenga en cuenta que el programa le solicita "indefinido": le pide la ID de usuario).


3

R - 84

84 = 115 - 31

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

Simulación:

> 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 es un uso muy impresionante de expresiones regulares.
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]

Aquí hay un violín ; solo sé que te avisa cuando abres la página por primera vez, así que ten listo un ID o presiona Ejecutar nuevamente.

¡O podemos ser súper hacky para salvar a un personaje completo!

$.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 versión más nueva y corta que utiliza algunas de las ideas de la respuesta de Steven Rumbalski , mientras sigue utilizando 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

Aquí hay una versión base para que las personas trabajen, pero estoy seguro de que las personas pueden ser aún más cortas.

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]

Esto no parece funcionar. http://stackoverflow.com/users/12340es 404.
John Dvorak

@ JanDvorak, prueba con en 499214lugar de12340
Peter Taylor

@PeterTaylor, entonces la pregunta es incorrecta.
John Dvorak

2
@ JanDvorak Obviamente, el usuario con esa ID no existe.

1

GNU Awk: 217 caracteres

Solo porque GNU es awkcompatible con TCP de forma nativa: sin módulo / biblioteca / herramienta 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]}}

Ejecución de muestra:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.