Więc… jaki jest twój wynik StackOverflow?


21

To jest proste. Biorąc pod uwagę liczbę, zwróć nazwę użytkownika i wynik reputacji użytkownika stosu przepełnienia o podanym identyfikatorze . Twój program może założyć, że zawsze ma prawidłowy i istniejący identyfikator użytkownika.

Na przykład: biorąc pod uwagę dane wejściowe 764357(które są moim ID użytkownika na StackOverflow) program zwróci LegoStormtroopr 3,088(w przybliżeniu), że może się zmienić.

Otrzymasz URL: „ /programming//users/ ” lub „ http://api.stackexchange.com/2.1/users/ ” za darmo, więc wynik jest length of your program - 31 or 39, w zależności od URL użyć - ale zadeklaruj, co to jest . Zapobiega to wykorzystywaniu przez osoby skracające adresy URL.

edycja: I bez wywoływania niestandardowego interfejsu API, który odpytuje Przepełnienie stosu i zwraca tylko nazwę i wynik. Ale jeśli znasz oficjalny interfejs API, jest to całkowicie uzasadnione.

edit2: Jeśli potrzebujesz przykładowego wpisu: podałem poniżej swój identyfikator, dodaj poniżej swój identyfikator, nazwę użytkownika i wynik, aby pomóc innym. Uwaga: dotyczy to głównej witryny przepełnienia stosu.

764357   returns   LegoStormtroopr 3,088

hmm ... jeśli jest wielu użytkowników z tym przedstawicielem, czy powinniśmy wybrać jednego, czy wyświetlić wszystkich? Co jeśli nie ma takiego użytkownika?
John Dvorak

2
uh ... czekaj ... użytkownika z tym wynikiem lub użytkownika z tym identyfikatorem?
John Dvorak

@JanDvorak Próbowałem wyjaśnić. Program powinien zaakceptować identyfikator użytkownika i zwrócić użytkownika o tym identyfikatorze i wyniku Rep Rep.

1
Czy adres URL powinien http://api.stackexchange.com/2.1/users/być również „bezpłatny”, aby uniknąć karania użytkowników interfejsu API?
gnibbler

1
Czy możemy również otrzymać tę site=stackoverflowczęść za darmo?
Johannes Kuhn

Odpowiedzi:


15

Skrypt powłoki: 64 51 znaków

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

Przykładowy przebieg:

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

(Pamiętaj, że musisz nacisnąć ^Dpo interaktywnym wpisaniu danych wejściowych. Lub po prostu potokuj je do polecenia.)


8

Rubin: 84 70 znaków

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

Przykładowy przebieg:

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
Nie potrzebujesz pełnych słów w wyrażeniu regularnym: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]wydaje się, że działa
Neil Slater,

Poprawny. Zostały właśnie pobrane z mojej odpowiedzi skryptu powłoki . ( grepwyświetliłoby więcej dopasowań dla samego „ation” ”.)
manatwork

@Doorknob, prawdopodobnie pominąłeś -ropen-uriopcję. (Jest to obowiązkowe i uwzględniane w liczbie znaków.)
manatwork

@manatwork Ah, nie zauważyłem tego. OK, teraz to działa.
Klamka

6

Python 2.7 - 119

(150–31)

Bez wyrażenia regularnego:

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

Nie sądzę, że wyszukiwanie w zwykłym kodzie źródłowym HTML doprowadzi do silnego rozwiązania. Na przykład niektóre dziwne rzeczy w profilu mogą uszkodzić twoje rozwiązania. Chciałbym więc wyszukiwać za pomocą selektorów 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

Oto wersja nie golfowego Javascript, używająca oficjalnego interfejsu API z JSONP, na początek. Korzystanie z adresu URL wymagałoby XHR, co byłoby dość gadatliwe, jeśli znajdę trochę czasu, wypróbuję wersję bardziej golfową.

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 (z Mojolicious), 87–31 = 56 bajtów

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

Przykładowy przebieg:

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

Czytelny i czysty: 128–31 = 97 bajtów

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

Przykładowy przebieg:

$ 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
Jest -Mojowliczony w liczenie? To kosztuje 4 znaki.
manatwork

@manatwork: Nie, nie uwzględniłem tego w liczeniu, ponieważ odpowiedź Ruby nie zawierała -ropen-uri. Jednak z przyjemnością go dołączę, jeśli Twój komentarz zyska kilka głosów jako wskazówkę, że społeczność chce je policzyć.
Matthias

Policz ponownie. Obejmuje. pastebin.com/qZp1QgKa
manatwork

2
Cóż, chciałbym mieć dokładną dokumentację reguły liczenia, ale jak wiem, nie ma żadnej. Jedno jest pewne: perljest -popcja jest zazwyczaj liczony +1. Na tej podstawie liczę -Mojo+4.
manatwork

1
Oto jeden zestaw zasad , z których korzystaliśmy kilka razy.
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"))}

Po prostu wybiera pierwsze wiersze zawierające h1(dla nazwy) i =re(dla partytury) za greppomocą argumentu value=TRUE(tutaj v=T), a następnie rozdziela ciąg (używając strsplitznaków >i <. Niewygodnie odpytuje stronę dwukrotnie (stąd dwa „Czytaj n elementów” ostrzeżenia), ale to było krótsze.

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

4

Tcl, (231–39) 192

nie najkrótsza droga, ale przy użyciu oficjalnego 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]

I w duchu pierwotnego pytania:

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

Znajduje użytkowników o tej reputacji


Przepraszam za ten mixup!

@LegoStormtroopr: Napisałem tę odpowiedź, gdy było jasne, że masz na myśli identyfikator użytkownika, ale lubiłem pokazywać, że oficjalny interfejs API jest w stanie rozwiązać również oryginalne pytanie.
Johannes Kuhn

3

Krótszy CoffeeScript: 143 znaków (182–39)

Zależy to od interfejsu API, który zawsze zwraca klucze obiektów w tej samej kolejności, ale goli 7 znaków.

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 znaków (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

(Pamiętaj, że program wyświetla monit o „niezdefiniowany” - pyta o identyfikator użytkownika).


3

R - 84

84 = 115–31

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

Symulacja:

> 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 To bardzo imponujące użycie wyrażeń regularnych.
Sven Hohenstein,

3

101 100 - CoffeeScript z jQuery

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

Tutaj jest skrzypce ; po prostu wiedz, że wyświetla monit przy pierwszym otwarciu strony, więc przygotuj identyfikator lub naciśnij ponownie Uruchom.

Lub możemy być super hacky, aby uratować całą postać!

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

Nowsza, krótka wersja, w której wykorzystano niektóre pomysły Stevena Rumbalskiego , a jednocześnie wykorzystano 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

Oto podstawowa wersja dla ludzi do pracy, ale jestem pewien, że ludzie mogą stać się jeszcze krótsi.

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]

to nie działa. http://stackoverflow.com/users/12340to 404.
John Dvorak

@JanDvorak, spróbuj 499214zamiast12340
Peter Taylor

@PeterTaylor to pytanie jest nieprawidłowe.
John Dvorak

2
@JanDvorak Oczywiście użytkownik o tym identyfikatorze nie istnieje.

1

GNU Awk: 217 znaków

Tylko dlatego, że GNU awk natywnie obsługuje TCP: brak modułu / biblioteki / narzędzia zewnętrznego.

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

Przykładowy przebieg:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.