Qual é o meu ID PPCG?

16

Desafio

Dado o nome de um membro do PPCG, imprima seu número de ID do PPCG. Se o usuário não existir, você poderá relatar um erro ou retornar qualquer número não positivo. Se houver vários membros com esse nome, você poderá optar por gerar apenas um ID ou todos eles.

Casos de teste

"musicman523" -> 69054
"Dennis" -> 12012
"xnor" -> 20260
"Freira Furada" -> 48934
"fəˈnɛtɪk" -> 64505
"Jörg Hülsermann" -> 59107
"Comunidade" -> -1
"Qualquer usuário que não existe" -> 0
"Alex" -> 69198 (este é um resultado possível)
"Vazamento N" -> 0
"Jorge" -> 3716
musicman523
fonte
1
Caso de teste recomendado: "Leaky N". Deve retornar 0.
Okx 07/08/19
5
Nosso programa pode resultar em um comportamento indefinido para usuários inexistentes (o meu imprime 48934, por exemplo, para um usuário inexistente)? Eu acho que isso deve ser permitido, pois os erros são.
Mr. Xcoder
4
@ Ok Não, eu não. Estou perguntando ao OP se esse comportamento é permitido. Caso contrário, excluirei ou corrigirei minha resposta.
Mr. Xcoder
3
@OliverNi Toxic? Quão?
Okx 07/08/19
5
@Okx Ele está fazendo uma pergunta válida ao OP e você o está derrubando imediatamente. Deixe o OP responder.
Oliver Ni

Respostas:

30

Explorador de dados do Exchange de pilha , 56 54 53 51 46 bytes

-1 byte graças ao Hyper Neutrino. -5 bytes graças a Giacomo Garabello.

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

Experimente online!

Não tenho certeza se isso é completamente válido, mas ... A entrada deve estar entre aspas simples '.

Além disso, ainda não entendo por que os programadores SQL gostam de gritar, mas aparentemente é uma boa prática ... SELECTTUDO FROMTUDO WHERETUDO LIKETUDO TUDO!

Explicação

DEIXE-ME EXPLICAR.

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
totalmente humano
fonte
13
-2 BYTES, removendo os espaços em torno do sinal de igual
HyperNeutrino
1
NINJA'D SEU NINJA NO CHAT XD
HyperNeutrino
1
-1 byte, invertendo a ordem de operandos em torno do operador de igualdade
HyperNeutrino
10
+1 para a referência aos programadores SQL que gostam de gritar (e para uma boa escolha de idioma para sua resposta :)
NH.
4
por que você colocou o top 1 nesta consulta? OP disse: "Se houver vários membros com este nome, você pode optar por saída de apenas um ID ou todos eles" ...
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
fonte
1
Ele suporta caracteres especiais como em Jörg Hülsermann?
Arnauld
4
Isso retornou 0para Oliver:(
Oliver
Salve 7 bytes substituindo r=>r.items[0]).then(rpor ({items:[r]}). Ftw atribuição de reestruturação!
kamoroso94
Você pode usar: i=>fetch('//api.stackexchange.com/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)pois retornará um erro de promessa se falhar. Você também pode simplesmente fazer i=>fetch('/users?site=codegolf&inname='+i).then(r=>r.json()).then(r=>r.items[0].user_id)e dizer que ele precisa ser executado no domínio da API
#
2
@ Oliver O QUE outro oliver ???? Só pode haver um #
Oliver Ni
5

Solicitações Python 3 + , 196 bytes

Obrigado @Wondercricket por -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

Usa a API do Stack Exchange. Corrigido o Leaky Ne Jorgeerros.

Se houver vários usuários com o mesmo nome, ele imprimirá todos, o que é permitido.

Oliver Ni
fonte
Dá-me gzipped dados ..
Oliver Ni
Falha na entradaLeaky N
Okx
@Okx Fixed. ---
Oliver Ni
Como você pode "relatar um erro ou retornar 0" se o usuário não existir, a última linha não pode ser justa print a['user_id'], o que gerará um KeyError?
Daniel
1
falha em "Jorge"
Felipe Nardi Batista
5

Solicitações Python 2 + , 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]

Retorna o ID do usuário se existir um único usuário, o primeiro usuário que corresponder aos requisitos, se houver mais, e relatar um erro caso contrário.

Mr. Xcoder
fonte
Você pode remover /2.2do URL da API.
Kevin Cruijssen 7/08
@KevinCruijssen Muito obrigado
Sr. Xcoder
Dica : não tente executá-lo com fəˈnɛtɪk, use \u{...}em vez disso, porque Python não tolera não-ASCII
Mr. Xcoder
Python 2, enfim.
totallyhuman
3
falha em "Jorge"
Felipe Nardi Batista
3

Solicitações Python 2 + , 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*

Amostra de execução

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

Curiosidade: o resultado é classificado por reputação, mais alto primeiro.

totalmente humano
fonte
Falha na entradaLeaky N
Okx
Bom truque com %s.
Mr. Xcoder
@ Ok Não é para mim, não. >>> f('Leaky N')\n48934
totallyhuman
@totallyhuman Deve retornar 0. Leaky Nnão existe
Okx
@Okx Fixed. - -
totallyhuman
3

JavaScript, 128 119 bytes

-9 bytes graças ao Rogem .

n=>fetch("198.252.206.16/users?site=codegolf&inname="+n).then(r=>r.text()).then(t=>t.match(`\\/([^\\/]*)\\/`+n+`"`)[1])
Oliver
fonte
1
Pense em salvar alguns bytes com o endereço IPv4. (198.252.206.16 em vez de api.stackexchange.com)
-1

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

Sacrificou alguns bytes para manipular caracteres especiais.

Precisa ser executado sob o api.stackexchange.comdomínio. Retorna uma promessa que contém o ID ou gera um erro na promessa se o nome de usuário não puder ser encontrado.

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

Nota: Esta solução foi desenvolvida independentemente dos de Uriel e seus comentários; se Uriel decide usar o findmétodo, fico feliz em reverter para minha versão mais longa e recursiva.

Shaggy
fonte
2
Eu criei uma discussão meta de exigir um certo domínio de execução, uma vez que faz , salvo algumas bytes.
precisa saber é o seguinte
1
@ Downown, tenha a decência de deixar um comentário.
Shaggy
@ Shaygy, eu assumiria pelo mesmo motivo que a meta discussão foi iniciada.
Downvoter, se você não concordar com um consenso estabelecido (como sugere a @Rogem), diminua o voto da meta post relevante em vez das soluções que aderem a esse consenso.
Shaggy