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


16

Вызов

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

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

"musicman523" -> 69054
"Деннис" -> 12012
"xnor" -> 20260
"Дрянная Монахиня" -> 48934
"fəˈnɛtɪk" -> 64505
"Йорг Хюльсерманн" -> 59107
"Сообщество" -> -1
«Любой пользователь, который не существует» -> 0
"Алекс" -> 69198 (это один из возможных результатов)
"Leaky N" -> 0
"Хорхе" -> 3716

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

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


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.


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.


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.


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

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.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.