Який мій ідентифікатор PPCG?


16

Виклик

Враховуючи ім’я члена PPCG, виведіть їх ідентифікаційний номер PPCG. Якщо користувача не існує, ви можете повідомити про помилку або повернути будь-яке непозитивне число. Якщо є кілька членів з цим іменем, ви можете вибрати лише один ідентифікатор або всі їх.

Випробування

"musicman523" -> 69054
"Денніс" -> 12012
"xnor" -> 20260
"Лина монашка" -> 48934
"fəˈnɛtɪk" -> 64505
"Йорг Гюльсерманн" -> 59107
"Громада" -> -1
"Будь-який користувач, якого не існує" -> 0
"Алекс" -> 69198 (це один можливий результат)
"Витік N" -> 0
"Хорхе" -> 3716

1
Рекомендований тестовий випадок: "Leaky N". Слід повернути 0.
Okx

5
Чи може наша програма спричинити невизначене поведінку для неіснуючих користувачів (мої відбитки 48934, наприклад, для неіснуючого користувача)? Я думаю, що це слід допустити, оскільки є помилки.
Містер Xcoder

4
@Okx Ні, я ні. Я запитую ОП, чи дозволяється така поведінка. Якщо це не так, я видалю або виправлю свою відповідь.
Містер Xcoder

3
@OliverNi токсичний? Як?
Okx

5
@Okx Він задає дійсне питання ОП, і ти його негайно збиваєш. Нехай відповість ОП.
Олівер Ні

Відповіді:


30

Провідник обміну стеками даних , 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


1
NINJA'D YOUR NINJA CHAT XD
HyperNeutrino

1
-1 байт, змінивши порядок операндів навколо оператора рівності
HyperNeutrino

10
+1 за посиланням на програмістів SQL, які хотіли б кричати (і за гарний вибір мови для вашої відповіді :)
NH.

4
чому ви поставили першу першу в цьому запиті? ОП сказав: "Якщо є кілька членів з цим ім'ям, ви можете вибрати лише один ідентифікатор або всі вони" ...
Giacomo Garabello

5

JavaScript, 155 149 142 135 байт

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
Чи підтримує він спеціальних символів, як у Jörg Hülsermann?
Арнольд

4
Це повернулося 0для Oliver:(
Олівер

Збережіть 7 байт, замінивши r=>r.items[0]).then(rна ({items:[r]}). Призначення руйнування ftw!
kamoroso94

Ви можете використовувати: i=>fetch('//api.stackexchange.com/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)як він поверне помилку з обіцянкою, якщо вона не вдалася. Ви також можете просто зробити i=>fetch('/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)і сказати, що його потрібно запустити на домен api
Downgoat

2
@Oliver ЩО інший олівер ???? ТОГО МОЖЕ бути ТОЛЬКО ОДИН
Олівер Ні

5

Python 3 + запити , 196 байт

Дякуємо @Wondercricket за -6 байт!

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

Використовує API стека Exchange. Виправлені Leaky Nта Jorgeпомилки.

Якщо є кілька користувачів з однаковою назвою, вони друкують усіх, що дозволено.


Це дає мені gzipped дані ..
Олівер Ні

Leaky N
Помилка

Виправлено @Okx. ---
Олівер Ні

Оскільки ви можете "повідомити про помилку або повернути 0", якщо користувача не існує, чи не може останній рядок бути просто print a['user_id'], який видасть KeyError?
Даніель

1
невдало для "Хорхе"
Феліпе Нарді Батіста

5

Python 2 + запити , 187 байт

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]

Повертає ідентифікатор користувача, якщо існує один користувач, перший користувач, який відповідає вимогам, якщо таких більше, і повідомляє про помилку в іншому випадку.


Ви можете видалити /2.2URL-адресу API.
Kevin Cruijssen

@KevinCruijssen Дякую велике
містер Xcoder

Підказка : Не намагайтеся запускати його fəˈnɛtɪk, використовуйте \u{...}натомість, тому що Python не терпить не-ASCII
Містер Xcoder

Python 2, все одно.
повністюлюдсько

3
невдало для "Хорхе"
Феліпе Нарді Батіста

3

Python 2 + запити , 173 байти

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*

Вибірка зразка

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

Веселий факт: результат сортується за репутацією, найвищим першим.


Leaky N
Помилка

Гарний трюк с %s.
Містер Xcoder

@Okx Не для мене, це не так. >>> f('Leaky N')\n48934
повністюлюдсько

@totallyhuman Це має повернутися 0. Leaky Nне існує
Okx

Виправлено @Okx. - -
повністюлюдський

3

JavaScript, 128 119 байт

-9 байт завдяки Rogem .

n=>fetch("198.252.206.16/users?site=codegolf&inname="+n).then(r=>r.text()).then(t=>t.match(`\\/([^\\/]*)\\/`+n+`"`)[1])

1
Подумайте, ви зберегли б кілька байт з IPv4 адресою. (198.252.206.16 замість api.stackexchange.com)

-1

JavaScript (ES6) + HTML, 154 152 151 202 179 161 145 байт

Пожертвував декількома байтами для обробки спеціальних символів.

Необхідно запускатись під api.stackexchange.com доменом. Повертає Обіцянку, що містить ідентифікатор або Вкидає помилку в Обіцянні, якщо ім'я користувача не можна знайти.

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

Примітка: Це рішення було розроблено незалежно від Uriel та його коментарів; якщо Уріель вирішить скористатися findметодом, я радий повернутися до своєї більш тривалої, рекурсивної версії.


2
Я створив мета-дискусію щодо необхідності певного доменного виконання, оскільки це дозволяє економити досить багато байтів.
Birjolaxew

1
@Downvoter, будь ласка, майте пристойність, щоб залишити коментар.
Кудлатий

@Shaggy Я б припустив з тієї ж причини, що і мета-дискусія була розпочата.

Якщо ви не згодні з усталеним консенсусом (як @Rogem пропонує), будь ласка, скажіть відповідне мета-повідомлення, а не рішення, що дотримуються цього консенсусу.
Кудлатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.