Also ... wie hoch ist Ihr StackOverflow-Score?


21

Dies ist eine einfache. Geben Sie nach Eingabe einer Zahl den Namen und die Reputationsbewertung des Stack Overflow-Benutzers mit der angegebenen ID zurück . Ihr Programm kann davon ausgehen, dass es immer eine gültige und vorhandene Benutzerkennung erhält.

Beispiel: 764357Angesichts der Eingabe (die meine Benutzer-ID für StackOverflow ist) würde das Programm LegoStormtroopr 3,088(ungefähr) zurückgeben, dass es möglicherweise geändert wird.

Sie erhalten die URL: „ /programming//users/ “ oder „ http://api.stackexchange.com/2.1/users/ “ kostenlos, so dass Ihre Punktzahl ist length of your program - 31 or 39, je nachdem , welche URL Sie verwenden - aber erkläre was es ist . Dies verhindert, dass Personen URL-Kürzungen missbrauchen.

Bearbeiten: Und kein Aufruf einer benutzerdefinierten API, die den Stapelüberlauf abfragt und nur den Namen und die Punktzahl zurückgibt. Wenn Sie jedoch eine offizielle API kennen, ist dies absolut legitim.

edit2: Wenn Sie eine Beispieleingabe benötigen: Ich habe unten meine ID angegeben, können Sie unten Ihre eigene ID, Ihren Benutzernamen und Ihre Punktzahl hinzufügen, um anderen zu helfen. Beachten Sie erneut, dass dies für die Haupt-Stack Overflow-Site gilt.

764357   returns   LegoStormtroopr 3,088

hmm ... wenn es mehrere Benutzer mit diesem Mitarbeiter gibt, sollten wir einen auswählen oder alle anzeigen? Was ist, wenn es keinen solchen Benutzer gibt?
John Dvorak

2
äh ... warte ... des Benutzers mit dieser Punktzahl oder des Benutzers mit dieser ID?
John Dvorak

@ JanDvorak Ich habe versucht zu klären. Das Programm sollte eine Benutzer-ID akzeptieren und den Benutzer mit dieser ID und dieser Benutzer-Rep.-Bewertung zurückgeben.

1
Sollte die URL http://api.stackexchange.com/2.1/users/auch "frei" sein, um die Benutzer der API nicht zu benachteiligen?
Gnibbler

1
Können wir das site=stackoverflowTeil auch kostenlos bekommen?
Johannes Kuhn

Antworten:


15

Shell-Skript: 64 51 Zeichen

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

Probelauf:

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

(Beachten Sie, dass Sie drücken müssen, ^Dnachdem Sie die Eingabe interaktiv eingegeben haben. Oder leiten Sie sie einfach an den Befehl weiter.)


8

Ruby: 84 70 Zeichen

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

Probelauf:

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
Sie brauchen keine vollständigen Wörter in der Regex: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]scheint zu funktionieren
Neil Slater

Richtig. Sie wurden nur von meiner Shell-Skript-Antwort übernommen . ( grepwürde mehr Übereinstimmungen nur für "ation" anzeigen.)
Manatwork

@Doorknob, wahrscheinlich hast du die -ropen-uriOption weggelassen . (Es ist obligatorisch und in der Anzahl der Zeichen enthalten.)
Manatwork

@manatwork Ah, habe das nicht bemerkt. Okay, jetzt funktioniert es.
Türklinke

6

Python 2.7 - 119

(150 - 31)

Ohne 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

Ich denke nicht, dass die Suche in einfachem HTML-Quellcode zu einer starken Lösung führt. Zum Beispiel können einige seltsame Dinge in Ihrem Profil Ihre Lösungen zum Scheitern bringen. Ich möchte also mit CSS-Selektoren suchen.

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

Hier ist eine ungolfed Javascript Version mit der offiziellen API mit JSONP, um damit zu beginnen. Die Verwendung der URL würde XHR erfordern, was ziemlich ausführlich sein würde, wenn ich etwas Zeit finde, werde ich jedoch eine Golf-Version ausprobieren.

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

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

Probelauf:

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

Lesbar und sauber: 128 - 31 = 97 Bytes

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

Probelauf:

$ 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
Ist -Mojoin der Zählung enthalten? Das kostet 4 Zeichen.
Manatwork

@manatwork: Nein, ich habe es nicht in die Zählung aufgenommen, da die Ruby-Antwort dies nicht enthielt -ropen-uri. Ich freue mich jedoch, wenn Ihr Kommentar ein paar positive Stimmen erhält, um anzuzeigen, dass die Community diese zählen möchte.
Matthias

Zähle noch einmal. Es enthält. pastebin.com/qZp1QgKa
Manatwork

2
Nun, ich wünschte, wir hätten eine genaue Dokumentation der Zählregel, aber wie ich weiß, gibt es keine. Eines ist sicher: perlDie -pOption wird normalerweise mit +1 bewertet. Darauf -Mojoaufbauend zähle ich +4.
Manatwork

1
Hier ist eine Reihe von Regeln, die wir einige Male angewendet haben.
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"))}

Einfach die ersten Zeilen, die h1(für den Namen) und =re(für die Punktzahl) enthalten, grepmit dem Argument value=TRUE(hier v=T) auswählen und dann die Zeichenfolge (mit den strsplitZeichen >und ) aufteilen <. Warnungen), aber das war kürzer.

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

4

Tcl, (231 - 39) 192

Nicht der kürzeste Weg, aber mit der offiziellen API

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]

Und im Geiste der ursprünglichen Frage:

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

Findet Benutzer mit diesem Ruf


Entschuldigung für diese Verwechslung!

@LegoStormtroopr: Ich habe diese Antwort geschrieben, als klar war, dass Sie die Benutzer-ID meinen, aber ich wollte zeigen, dass die offizielle API auch die ursprüngliche Frage lösen kann.
Johannes Kuhn

3

Kürzere CoffeeScript: 143 Zeichen (182 - 39)

Dies setzt voraus, dass die API die Objektschlüssel immer in derselben Reihenfolge zurückgibt, jedoch 7 Zeichen spart.

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

(Beachten Sie, dass Sie das Programm zur Eingabe von "undefined" auffordert - es fragt nach der Benutzer-ID.)


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 Dies ist eine sehr eindrucksvolle Verwendung von regulären Ausdrücken.
Sven Hohenstein

3

101 100 - CoffeeScript mit jQuery

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

Hier ist eine Geige ; Sie müssen lediglich wissen, dass Sie beim ersten Öffnen der Seite dazu aufgefordert werden. Halten Sie also eine ID bereit, oder drücken Sie erneut auf Ausführen.

Oder wir können supergeil sein, um einen ganzen Charakter zu retten!

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

Eine neuere, kurze Version, die einige der Ideen von Steven Rumbalski verwendet , während Regex verwendet wird.

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

Hier ist eine Basisversion, von der aus die Leute arbeiten können, aber ich bin sicher, dass die Leute noch kürzer werden können.

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]

das scheint nicht zu funktionieren. http://stackoverflow.com/users/12340ist 404.
John Dvorak

@JanDvorak, versuchen Sie mit 499214statt12340
Peter Taylor

@PeterTaylor dann ist die Frage falsch.
John Dvorak

2
@ JanDvorak Offensichtlich existiert der Benutzer mit dieser ID nicht.

1

GNU Awk: 217 Zeichen

Nur weil GNU awk TCP nativ unterstützt: kein Modul / Bibliothek / externes Tool.

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

Probelauf:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.