Peki… StackOverflow puanınız nedir?


21

Bu basit bir şey. Bir sayı girişi yapıldığında, verilen Kimlik ile Yığın Taşması kullanıcısının adını ve itibar puanını döndürün . Programınıza her zaman geçerli ve varolan bir kullanıcı kimliği verildiğini varsayabilir.

Örneğin: giriş 764357(StackOverflow üzerindeki kullanıcı kimliğim olan) verildiğinde program geri dönecek LegoStormtroopr 3,088(yaklaşık olarak) değişebilir.

": Sen URL almak /programming//users/ " veya " http://api.stackexchange.com/2.1/users/ puanınız yani, ücretsiz" length of your program - 31 or 39, kullandığınız hangi URL'yi bağlı - ama hangisi olduğunu beyan et . Bu, kişilerin URL kısaltıcıları kötüye kullanmalarını önler.

düzenleme: Ve hiçbir yığın Overflow sorgulayan özel yapılmış bir API arama ve sadece isim ve puan döndürür. Ancak resmi bir API biliyorsanız, o zaman bu tamamen meşru.

edit2: Örnek bir girdiye ihtiyacınız varsa: Kimliğimi aşağıya verdim, başkalarına yardımcı olmak için kendi kimliğinizi, kullanıcı adınızı ve puanınızı eklemek için çekinmeyin. Yine, bu ana Yığın Taşması sitesi içindir.

764357   returns   LegoStormtroopr 3,088

hmm ... eğer bu temsilci ile birden fazla kullanıcı varsa, bir tane seçmeli mi yoksa hepsini mi göstermeliyiz? Ya böyle bir kullanıcı yoksa?
John Dvorak

2
uh ... bekle ... o skoru olan kullanıcı mı, yoksa o kimliği olan kullanıcı mı?
John Dvorak

@JanDvorak Aydınlatmaya çalıştım. Program bir kullanıcı kimliği kabul etmeli ve bu kimliğe sahip kullanıcıyı ve bu kullanıcıların Puan Puanını geri göndermelidir.

1
URL http://api.stackexchange.com/2.1/users/, API kullanıcılarının cezalandırılmaması için "serbest" olmalı mı?
gnibbler

1
Rolü site=stackoverflowbedavaya alabilir miyiz ?
Johannes Kuhn

Yanıtlar:


15

Kabuk betiği: 64 51 karakter

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

Örnek çalışma:

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

( ^DGirdiyi etkileşimli olarak yazdıktan sonra tuşuna basmanız gerektiğini unutmayın . Veya sadece komutu komut olarak verin.)


8

Yakut: 84 70 karakter

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

Örnek çalışma:

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
Regex'te tam kelimelere ihtiyacınız yok: s[/me">(.+)</,1],s[/ation".*?([\d,]+)/,1]iş gibi görünüyor
Neil Slater

Doğru. Kabuk betiği cevabımdan yeni alınmışlar . ( grepsadece "ation" için daha fazla eşleşme gösterir.)
manatwork

@Doorknob, muhtemelen -ropen-uriseçeneği atladınız . (Zorunlu ve karakter sayımına dahil edilmiştir.)
manatwork

@ yönetim işleri Ah, bunu farketmedim. Tamam şimdi çalışıyor.
Doorknob

6

Python 2,7 - 119

(150 - 31)

Regex olmadan:

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

Düz HTML kaynak kodunda arama yapmanın güçlü bir çözüme yol açacağını sanmıyorum. Örneğin, birinin profilindeki bazı garip şeyler çözümlerinizi bozabilir. Bu yüzden CSS seçicileri kullanarak aramak istiyorum.

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

Heres, başlamak için JSONP ile resmi api'yi kullanan, ungolfed Javascript Version. URL'yi kullanmak XHR'ye ihtiyaç duyar, bu da oldukça ayrıntılı olacaktır, eğer zaman bulursam daha golflü bir sürüm deneyeceğim.

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

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

Örnek çalışma:

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

Okunabilir ve temiz: 128 - 31 = 97 bayt

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

Örnek çalışma:

$ 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
Sayıma -Mojodahil mi? Bu 4 karakter maliyeti.
Manatwork

@ manatwork: Hayır, sayıya dahil etmedim, çünkü Ruby cevabı dahil değildi -ropen-uri. Ancak, yorumunuz topluluğun bunları saymak istediğinin bir göstergesi olarak birkaç oy alırsa eklemekten memnuniyet duyarım.
Matthias

Tekrar say. O içerir. pastebin.com/qZp1QgKa
manatwork

2
Eh, sayma kuralının tam bir belgelendirmesini diliyorum, ama bildiğim gibi, hiçbiri yok. Kesin olan tek şey ise: perl'in -pseçenek genellikle +1 sayılır. Buna göre -Mojo+4 sayıyorum .
Manatwork

1
İşte bir kural kümesi birkaç kez kullandığımız bir .
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"))}

Oldukça basitçe h1(isim için) ve =re(skor için) kullanarak ilk satırları seçer.grep argüman argümanla value=TRUE(burada v=T) seçtiler ve sonra dizeyi ayırın ( strsplitkarakterleri >ve <. uyarıları)) fakat bu daha kısa sürdü.

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

4

Tcl, (231 - 39) 192

en kısa yol değil, ancak resmi API’yi kullanmak

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]

Ve ruhu içinde asıl sorunun özünde :

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

Bu üne sahip kullanıcıları bulur


Karışım için üzgünüm!

@LegoStormtroopr: Kullanıcı cevabını kastettiğinizi açıkça belirttiğinizde bu cevabı yazdım, ancak resmi API'nin asıl soruyu da çözebildiğini göstermek hoşuma gitti.
Johannes Kuhn

3

Daha kısa CoffeeScript: 143 karakter (182 - 39)

Bu, API'ye her zaman nesne anahtarlarını aynı sıraya göre döndürürken, 7 karakteri tıraşlar.

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

(Programın "tanımsız" istediğini unutmayın - kullanıcı kimliğini soruyor.)


3

R - 84

84 = 115 - 31

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

Simülasyon:

> 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 Bu, düzenli ifadelerin çok etkileyici bir kullanımıdır.
Sven Hohenstein

3

101 100 - jQuery ile CoffeeScript

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

İşte bir keman ; sadece sayfayı ilk açtığınızda sizi yönlendirdiğini biliyorum, bu yüzden bir kimliği hazırlayın veya tekrar Çalıştır'a basın.

Ya da bütün bir karakteri kurtarmak için süper hacky olabiliriz!

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

Hala Regex kullanırken Steven Rumbalski'nin bazı fikirlerini kullanan daha yeni, kısa versiyon .

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

İşte insanların çalışabileceği temel bir sürüm, ancak insanların daha da kısalabileceğinden eminim.

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]

bu işe yaramadı. http://stackoverflow.com/users/12340404.
John Dvorak

@JanDvorak 499214yerine dene12340
Peter Taylor

@ PeterTaylor sonra soru yanlıştır.
John Dvorak

2
@JanDvorak Açıkçası, bu kimliğe sahip kullanıcı mevcut değil.

1

GNU Awk: 217 karakter

Bunun nedeni GNU'nun awkyerel olarak TCP'yi desteklemesi: modül / kütüphane / harici araç yok.

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

Örnek çalışma:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.