Какой у меня идентификатор PPCG?

16

Вызов

Учитывая имя члена PPCG, выведите его идентификационный номер PPCG. Если пользователь не существует, вы можете сообщить об ошибке или вернуть любое не положительное число. Если существует несколько участников с таким именем, вы можете выбрать вывод только одного идентификатора или всех из них.

Тестовые случаи

"musicman523" -> 69054
"Деннис" -> 12012
"xnor" -> 20260
"Дрянная Монахиня" -> 48934
"fəˈnɛtɪk" -> 64505
"Йорг Хюльсерманн" -> 59107
"Сообщество" -> -1
«Любой пользователь, который не существует» -> 0
"Алекс" -> 69198 (это один из возможных результатов)
"Leaky N" -> 0
"Хорхе" -> 3716
musicman523
источник
1
Рекомендуемый тестовый пример: «Leaky N». Должен вернуть 0.
Okx
5
Может ли наша программа привести к неопределенному поведению для несуществующих пользователей (мой отпечаток 48934, например, для несуществующего пользователя)? Я думаю, что это должно быть разрешено, так как ошибки есть.
г-н Xcoder
4
@ Хорошо, нет. Я спрашиваю ОП, разрешено ли такое поведение. Если это не так, я удалю или исправлю свой ответ.
Мистер Кскодер
3
@OliverNi Токсично? Как?
Okx
5
@Okx Он задает действительный вопрос к ОП, и вы сразу же его застрелите. Пусть ОП ответит.
Оливер Ни

Ответы:

30

Stack Exchange Data Explorer , 56 54 53 51 46 байт

-1 байт благодаря Hyper Neutrino. -5 байт благодаря Джакомо Гарабелло.

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

Попробуйте онлайн!

Не уверен, что это полностью верно, но ... Входные данные должны быть заключены в одинарные кавычки '.

Кроме того, я до сих пор не понимаю, почему программисты SQL любят кричать, но это, видимо, хорошая практика, так что ... SELECTВСЕ FROMВСЕWHERE ВСЕ LIKEВСЕ ВСЕ!

объяснение

ПОЗВОЛЬ МНЕ ОБЪЯСНИТЬ.

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
totallyhuman
источник
13
-2 байта, удалив пробелы вокруг знака равенства
HyperNeutrino
1
NINJA'D YOUR NINJA В ЧАТ XD
HyperNeutrino
1
-1 байт путем изменения порядка операндов вокруг оператора равенства
HyperNeutrino
10
+1 за ссылку на программистов SQL, любящих кричать (и за хороший выбор языка для вашего ответа :)
NH.
4
why have you put the top 1 in this query? OP said "If there are multiple members with this name, you may choose to output only one ID or all of them"...
Giacomo Garabello
5

JavaScript, 155 149 142 135 bytes

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
источник
1
Does it support special characters like in Jörg Hülsermann?
Arnauld
4
This returned 0 for Oliver :(
Oliver
Save 7 bytes by replacing r=>r.items[0]).then(r with ({items:[r]}). Destructuring assignment ftw!
kamoroso94
You can use: i=>fetch('//api.stackexchange.com/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id) as it'll return a promise error if it failed. You can also just do i=>fetch('/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id) and say it needs to be run on the api domain
Downgoat
2
@Oliver WHAT another oliver???? THERE CAN BE ONLY ONE
Oliver Ni
5

Python 3 + requests, 196 bytes

Thanks @Wondercricket for -6 bytes!

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

Uses Stack Exchange API. Fixed the Leaky N and Jorge errors.

If there are multiple users with the same name, it prints all of them, which is allowed.

Oliver Ni
источник
It gives me gzipped data..
Oliver Ni
Fails on input Leaky N
Okx
@Okx Fixed. ---
Oliver Ni
Since you can "report an error or return 0" if the user does not exist, can't the last line be just print a['user_id'], which will throw a KeyError?
Daniel
1
fails for "Jorge"
Felipe Nardi Batista
5

Python 2 + requests, 187 bytes

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]

Returns the user ID if a single user exists, the first user which matches the requirements if more exist, and reports an error otherwise.

Mr. Xcoder
источник
You can remove /2.2 from the API-url.
Kevin Cruijssen
@KevinCruijssen Thanks a lot
Mr. Xcoder
Hint: Do not try to run it with fəˈnɛtɪk, use \u{...} instead, because Python does not tolerate non-ASCII
Mr. Xcoder
Python 2, anyways.
totallyhuman
3
fails for "Jorge"
Felipe Nardi Batista
3

Python 2 + requests, 173 bytes

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*

Sample run

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

Fun fact: the result is sorted by reputation, highest first.

totallyhuman
источник
Fails on input Leaky N
Okx
Nice trick with %s.
Mr. Xcoder
@Okx Not for me, it doesn't. >>> f('Leaky N')\n48934
totallyhuman
@totallyhuman It should return 0. Leaky N does not exist
Okx
@Okx Fixed. - -
totallyhuman
3

JavaScript, 128 119 bytes

-9 bytes thanks to Rogem.

n=>fetch("198.252.206.16/users?site=codegolf&inname="+n).then(r=>r.text()).then(t=>t.match(`\\/([^\\/]*)\\/`+n+`"`)[1])
Oliver
источник
1
Think you'd save some bytes with the IPv4 address. (198.252.206.16 instead of api.stackexchange.com)
-1

JavaScript (ES6) + HTML, 154 152 151 202 179 161 145 bytes

Sacrificed a few bytes to handle special characters.

Needs to be run under the api.stackexchange.com domain. Returns a Promise containing the ID or Throws an error in the Promise if the username can't be found.

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

Note: This solution was developed independently of Uriel's and its comments; if Uriel decides to use the find method, I'm happy to roll back to my longer, recursive version.

Shaggy
источник
2
I've created a meta discussion on requiring a certain execution domain, since that does save quite a few bytes.
Birjolaxew
1
@Downvoter, please have the decency to leave a comment.
Shaggy
@Shaggy I would assume for the same reason as that meta discussion was started.
Downvoter, if you disagree with an established consensus (as @Rogem suggests), please downvote the relevant meta post rather than solutions that adhere to that consensus.
Shaggy