Jaki jest mój identyfikator PPCG?

16

Wyzwanie

Biorąc pod uwagę nazwisko członka PPCG, wyślij jego numer identyfikacyjny PPCG. Jeśli użytkownik nie istnieje, możesz zgłosić błąd lub zwrócić dowolną liczbę dodatnią. Jeśli jest wielu członków o tej nazwie, możesz zdecydować się na wydruk tylko jednego identyfikatora lub wszystkich z nich.

Przypadki testowe

„musicman523” -> 69054
„Dennis” -> 12012
„xnor” -> 20260
„Leaky Nun” -> 48934
„fəˈnɛtɪk” -> 64505
„Jörg Hülsermann” -> 59107
„Społeczność” -> -1
„Każdy użytkownik, który nie istnieje” -> 0
„Alex” -> 69198 (to jeden z możliwych wyników)
„Przeciekający N” -> 0
„Jorge” -> 3716
musicman523
źródło
1
Zalecany przypadek testowy: „Leaky N”. Powinien zwrócić 0.
Okx,
5
Czy nasz program może spowodować nieokreślone zachowanie nieistniejących użytkowników (moje wydruki 48934, na przykład dla nieistniejącego użytkownika)? Myślę, że powinno to być dozwolone, ponieważ są błędy.
Pan Xcoder,
4
@Okx Nie, nie mam. Pytam OP, czy takie zachowanie jest dozwolone. Jeśli nie, usunę lub naprawię moją odpowiedź.
Pan Xcoder,
3
@OliverNi Toxic? W jaki sposób?
Okx,
5
@Okx Zadaje OP ważne pytanie i natychmiast go zastrzelisz. Pozwól PO odpowiedzieć.
Oliver Ni

Odpowiedzi:

30

Stack Exchange Data Explorer , 56 54 53 51 46 bajtów

-1 bajt dzięki Hyper Neutrino. -5 bajtów dzięki Giacomo Garabello.

SELECT ID FROM USERS WHERE##S##=DISPLAYNAME--S

Wypróbuj online!

Nie jestem pewien, czy jest to całkowicie poprawne, ale ... Dane wejściowe muszą być otoczone pojedynczymi cudzysłowami '.

Ponadto nadal nie rozumiem, dlaczego programiści SQL lubią krzyczeć, ale to pozornie dobra praktyka, więc ... SELECTWSZYSTKO FROMWSZYSTKO WHEREWSZYSTKO LIKEWSZYSTKO!

Wyjaśnienie

POZWÓL MI WYJAŚNIĆ.

SELECT ID FROM USERS WHERE##S##=DISPLAYNAME--S

                                           --S  -- DECLARE AN INPUT PARAMETER NAMED S
SELECT                                          -- FIND...
       ID                                       -- ID OF THE USERS...
          FROM USERS                            -- IN THE TABLE USERS...
                     WHERE                      -- THAT SATISFIES THE CONDITION...
                          ##S##=DISPLAYNAME     -- S EQUALS THE USERS' DISPLAY NAME
całkowicie ludzki
źródło
13
-2
BYTESY USUWAJĄCE
1
NINJA'D YOUR NINJA IN CHAT XD
HyperNeutrino
1
-1 bajt poprzez odwrócenie kolejności operandów wokół operatora równości
HyperNeutrino
10
+1 za odniesienie do programistów SQL, którzy lubią krzyczeć (i za miły wybór języka dla twojej odpowiedzi :)
NH.
4
dlaczego umieściłeś pierwszą 1 w tym zapytaniu? OP powiedział „Jeśli jest wielu członków o tej nazwie, możesz zdecydować się na wydrukowanie tylko jednego identyfikatora lub wszystkich z nich” ...
Giacomo Garabello
5

JavaScript, 155 149 142 135 bajtów

i=>fetch("//api.stackexchange.com/users?site=codegolf&inname="+i).then(r=>r.json()).then(r=>r.items.find(u=>u.display_name==i).user_id)

f=i=>fetch("//api.stackexchange.com/users?site=codegolf&inname="+i).then(r=>r.json()).then(r=>r.items.find(u=>u.display_name==i).user_id)
<input onchange="f(this.value).then(console.log)"><br>Fill input and press Enter

Uriel
źródło
1
Czy obsługuje znaki specjalne, takie jak w Jörg Hülsermann?
Arnauld
4
To powróciło 0dla Oliver:(
Oliver,
Zaoszczędź 7 bajtów, zastępując r=>r.items[0]).then(rje ({items:[r]}). Zadanie destrukcyjne ftw!
kamoroso94,
Możesz użyć: i=>fetch('//api.stackexchange.com/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)ponieważ zwróci błąd obietnicy, jeśli się nie powiedzie. Możesz też po prostu i=>fetch('/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)powiedzieć i powiedzieć, że należy go uruchomić w domenie API
Downgoat
2
@Oliver CO INNY Oliver ???? MOŻNA BYĆ TYLKO JEDEN
Oliver Ni
5

Żądania w języku Python 3 + , 196 bajtów

Dzięki @Wondercricket za -6 bajtów!

from requests import*
x=lambda s:all([print(a['user_id'])if s==a['display_name']else''for a in get('http://api.stackexchange.com/users?inname=%s&site=codegolf'%utils.quote(s)).json()['items']])and d

Korzysta z interfejsu API wymiany stosu. Naprawiono błędy Leaky Ni Jorge.

Jeśli jest wielu użytkowników o tej samej nazwie, drukuje wszystkich, co jest dozwolone.

Oliver Ni
źródło
Daje mi spakowane dane.
Oliver Ni
Nie Leaky N
działa
@Okx Naprawiono. ---
Oliver Ni
Ponieważ możesz „zgłosić błąd lub zwrócić 0”, jeśli użytkownik nie istnieje, czy ostatnia linia nie może być sprawiedliwa print a['user_id'], co spowoduje wygenerowanie błędu klucza?
Daniel,
1
nie powiedzie się za „Jorge”
Felipe Nardi Batista
5

Żądania w języku Python 2 + , 187 bajtów

from requests import*
def f(x):t=get("http://api.stackexchange.com/users?inname="+utils.quote(x)+"&site=codegolf").json()["items"];print[k['user_id']for k in t if k['display_name']==x][0]

Zwraca identyfikator użytkownika, jeśli istnieje jeden użytkownik, pierwszy użytkownik spełniający wymagania, jeśli istnieje więcej, i w przeciwnym razie zgłasza błąd.

Pan Xcoder
źródło
Możesz usunąć /2.2z interfejsu API.
Kevin Cruijssen
@KevinCruijssen Wielkie dzięki
Mr. Xcoder
Wskazówka : Nie próbuj go uruchamiać fəˈnɛtɪk, użyj \u{...}zamiast tego, ponieważ Python nie toleruje non-ASCII
Mr. Xcoder
W każdym razie Python 2.
całkowicie ludzki,
3
nie powiedzie się za „Jorge”
Felipe Nardi Batista
3

Żądania w języku Python 2 + , 173 bajty

lambda s:[i['user_id']for i in get('http://api.stackexchange.com/users?inname=%s&site=codegolf'%utils.quote(s)).json()['items']if i['display_name']==s]
from requests import*

Przykładowy przebieg

>>> f=\
... lambda s:[i['user_id']for i in get('http://api.stackexchange.com/users?inname=%s&site=codegolf'%utils.quote(s)).json()['items']if i['display_name']==s]
>>> from requests import*
>>>
>>> tests = ['musicman523', 'Dennis', 'xnor', 'Leaky Nun', 'Community', 'Any user that does not exist', 'Alex', 'Leaky N', 'Jorge']
>>> for i in tests: print '%-30r -> %s'%(i, f(i))
... 
'musicman523'                  -> [69054]
'Dennis'                       -> [12012, 13891, 14912, 24937]
'xnor'                         -> [20260]
'Leaky Nun'                    -> [48934]
'Community'                    -> [-1]
'Any user that does not exist' -> []
'Alex'                         -> [21536, 69198, 11192]
'Leaky N'                      -> []
'Jorge'                        -> [3716]

Ciekawostka: wynik posortowany jest według reputacji, najpierw najwyższy.

całkowicie ludzki
źródło
Leaky N
Błąd
Niezła sztuczka z %s.
Pan Xcoder,
@Okx Nie dla mnie tak nie jest. >>> f('Leaky N')\n48934
całkowicie ludzki,
@totallyhuman Powinien powrócić 0. Leaky Nnie istnieje
Okx,
@Okx Naprawiono. - -
całkowicie ludzki,
3

JavaScript, 128 119 bajtów

-9 bajtów dzięki Rogemowi .

n=>fetch("198.252.206.16/users?site=codegolf&inname="+n).then(r=>r.text()).then(t=>t.match(`\\/([^\\/]*)\\/`+n+`"`)[1])
Oliver
źródło
1
Pomyśl, że możesz zaoszczędzić trochę bajtów z adresem IPv4. (198.252.206.16 zamiast api.stackexchange.com)
-1

JavaScript (ES6) + HTML, 154 152 151 202 179 161 145 bajtów

Poświęciłem kilka bajtów na obsługę znaków specjalnych.

Musi być uruchomiony w api.stackexchange.comdomenie. Zwraca obietnicę zawierającą identyfikator lub Zgłasza błąd w obietnicy, jeśli nie można znaleźć nazwy użytkownika.

s=>fetch(`/users?site=codegolf&inname=`+s).then(r=>r.json()).then(j=>j.items.find(i=>(o.innerHTML=i.display_name,o.innerText==s)).user_id)

<a id=o

Uwaga: To rozwiązanie zostało opracowane niezależnie od Uriela i jego komentarzy; jeśli Uriel zdecyduje się zastosować tę findmetodę, chętnie cofnę się do mojej dłuższej, rekurencyjnej wersji.

Kudłaty
źródło
2
Utworzyłem meta dyskusję na temat wymagania określonej domeny wykonania, ponieważ pozwala to zaoszczędzić sporo bajtów.
Birjolaxew
1
@Downvoter, proszę przyzwoitość dodać komentarz.
Kudłaty
@Shaggy Zakładam, że z tego samego powodu, w którym rozpoczęła się ta meta dyskusja.
Downvoter, jeśli nie zgadzasz się z ustalonym konsensusem (jak sugeruje @Rogem), prosimy o głosowanie na odpowiedni meta post zamiast rozwiązań zgodnych z tym konsensusem.
Kudłaty