Alors… quel est votre score StackOverflow?


21

C'est simple. Étant donné l'entrée d'un nombre, renvoyez le nom et le score de réputation de l'utilisateur Stack Overflow avec cet ID donné . Votre programme peut supposer qu'il reçoit toujours un ID utilisateur valide et existant.

Par exemple: étant donné l'entrée 764357(qui est mon ID utilisateur sur StackOverflow) le programme retournerait LegoStormtroopr 3,088(approximativement) il pourrait changer.

Vous obtenez l'URL: " /programming//users/ " ou " http://api.stackexchange.com/2.1/users/ " gratuitement, donc votre score est length of your program - 31 or 39, selon l'URL que vous utilisez - mais déclarez lequel c'est . Cela empêche les utilisateurs d'abuser des raccourcisseurs d'URL.

edit: Et pas d'appeler une API sur mesure qui interroge Stack Overflow, et renvoie uniquement le nom et le score. Mais si vous connaissez une API officielle, c'est tout à fait légitime.

edit2: Si vous avez besoin d'un exemple d'entrée: j'ai donné mon ID ci-dessous, n'hésitez pas à ajouter votre propre ID, nom d'utilisateur et score ci-dessous pour aider les autres. Notez à nouveau, c'est pour le site principal Stack Overflow.

764357   returns   LegoStormtroopr 3,088

hmm ... s'il y a plusieurs utilisateurs avec ce représentant, devrions-nous en choisir un ou les afficher tous? Et s'il n'y a pas un tel utilisateur?
John Dvorak du

2
euh ... attendez ... de l'utilisateur avec ce score, ou de l'utilisateur avec cet ID?
John Dvorak du

@JanDvorak J'ai essayé de clarifier. Le programme doit accepter un ID utilisateur et renvoyer l'utilisateur avec cet ID et le score de répétition des utilisateurs.

1
L'URL doit-elle http://api.stackexchange.com/2.1/users/également être "gratuite" pour éviter de pénaliser les utilisateurs de l'API?
gnibbler

1
Pourrions-nous également obtenir la site=stackoverflowpièce gratuitement?
Johannes Kuhn

Réponses:


15

Script shell: 64 51 caractères

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

Exemple d'exécution:

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

(Notez que vous devez appuyer sur ^Daprès avoir tapé l'entrée de manière interactive. Ou simplement la diriger vers la commande.)


8

Ruby: 84 70 caractères

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

Exemple d'exécution:

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
Vous n'avez pas besoin de mots complets dans l'expression régulière: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]semble fonctionner
Neil Slater

Correct. Ils viennent juste de ma réponse au script shell . ( grepafficherait plus de correspondances pour juste "ation" ".)
manatwork

@ Doorknob, vous avez probablement omis l' -ropen-urioption. (C'est obligatoire et inclus dans le nombre de caractères.)
manatwork

@manatwork Ah, je n'ai pas remarqué ça. Bon maintenant ça marche.
Poignée de porte

6

Python 2.7 - 119

(150 - 31)

Sans 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

Je ne pense pas que la recherche dans du code source HTML simple conduira à une solution solide. Par exemple, certaines choses étranges dans son profil peuvent briser vos solutions. J'aimerais donc effectuer une recherche à l'aide de sélecteurs 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

Voici une version Javascript non golfée utilisant l'API officielle avec JSONP, pour commencer. Utiliser l'URL nécessiterait XHR, qui pourrait être assez verbeux, si je trouve un peu de temps, j'essaierai une version plus golfée.

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

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

Exemple d'exécution:

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

Lisible et propre: 128 - 31 = 97 octets

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

Exemple d'exécution:

$ 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 -Mojoinclus dans le décompte? Cela coûte 4 caractères.
manatwork

@manatwork: Non, je ne l'ai pas inclus dans le décompte, car la réponse Ruby ne l'a pas inclus -ropen-uri. Cependant, je suis heureux de l'inclure si votre commentaire obtient quelques votes pour indiquer que la communauté veut les compter.
Matthias

Recompter. Il comprend. pastebin.com/qZp1QgKa
manatwork

2
Eh bien, je souhaite que nous ayons une documentation exacte de la règle de comptage, mais comme je le sais, il n'y en a pas. Une chose est sûre: perll' -poption de est généralement comptée +1. Sur cette base, je compte -Mojo+4.
manatwork

1
Voici un ensemble de règles que nous avons utilisées plusieurs fois.
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"))}

Choisit simplement les premières lignes contenant h1(pour le nom) et =re(pour la partition) en utilisant grepavec l'argument value=TRUE(ici v=T), puis divise la chaîne (en utilisant les strsplitcaractères at >et <. Inconvénient, il interroge la page deux fois (d'où les deux "Lire n éléments") avertissements) mais c'était plus court.

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

4

Tcl, (231 - 39) 192

pas le chemin le plus court, mais en utilisant l'API officielle

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]

Et dans l'esprit de la question d' origine :

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

Trouve des utilisateurs avec cette réputation


Désolé pour ce mélange!

@LegoStormtroopr: J'ai écrit cette réponse quand il était clair que vous parliez de l'ID utilisateur, mais j'ai aimé montrer que l'API officielle est également en mesure de résoudre la question d'origine.
Johannes Kuhn

3

CoffeeScript plus court: 143 caractères (182 - 39)

Cela repose sur l'API qui renvoie toujours les clés d'objet dans le même ordre, mais supprime 7 caractères.

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 caractères (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

(Notez que le programme vous invite à "non défini" - il demande l'ID utilisateur.)


3

R - 84

84 = 115 - 31

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

Simulation:

> 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 Il s'agit d'une utilisation très impressionnante d'expressions régulières.
Sven Hohenstein

3

101 100 - CoffeeScript avec jQuery

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

Voici un violon ; sachez simplement qu'il vous invite lorsque vous ouvrez la page pour la première fois, alors préparez un ID ou appuyez à nouveau sur Exécuter.

Ou nous pouvons être super hacky pour sauver un personnage entier!

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

Une nouvelle version courte qui utilise certaines des idées de la réponse de Steven Rumbalski , tout en utilisant 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

Voici une version de base sur laquelle les gens peuvent travailler, mais je suis sûr que les gens peuvent devenir encore plus courts.

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]

cela ne semble pas fonctionner. http://stackoverflow.com/users/12340est 404.
John Dvorak

@JanDvorak, essayez avec 499214au lieu de12340
Peter Taylor

@PeterTaylor alors la question est incorrecte.
John Dvorak du

2
@JanDvorak De toute évidence, l'utilisateur avec cet ID n'existe pas.

1

GNU Awk: 217 caractères

Tout simplement parce que GNU awkprend en charge TCP nativement: pas de module / bibliothèque / outil externe.

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

Exemple d'exécution:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.