0xUsernames
Há tantas pessoas usando um serviço de mensagens que estão ficando sem espaço para armazenar todos os nomes de usuário! Para corrigir isso, eles começarão a armazenar nomes de usuário como hexadecimal, sempre que possível.
Se um nome de usuário consistir apenas em caracteres 0123456789ABCDEF
(sem distinção entre maiúsculas e minúsculas), ele poderá ser convertido em um hexadecimal e armazenado como um número inteiro. Por exemplo, o nome de usuário ba5eba11
pode ser interpretado como 0xBA5EBA11
um número inteiro hexadecimal.
Mas que tal 05AB1E
? Isso tem um zero à esquerda, que seria perdido. Portanto, sempre que convertermos um nome de usuário, adicione um 1
antes de a antes de lê-lo como um número inteiro.
O desafio
Sua tarefa é escrever um programa ou função que, dado um nome de usuário não vazio como uma string, 'hexa-comprima' o nome de usuário:
- Se puder ser interpretado como um número inteiro hexadecimal, acrescente 1, interprete como hexadecimal e imprima o resultado como base 10.
- Caso contrário, basta retornar a string não modificada.
Isso é código-golfe , então a solução mais curta (em bytes) vence! Funções de conversão de base incorporadas são permitidas.
Casos de teste
Você pode supor que quaisquer números inteiros resultantes estejam dentro do intervalo inteiro padrão do seu idioma.
Como nos nomes de usuário na maioria dos sistemas de mensagens, as seqüências de entrada conterão apenas alfanuméricos e sublinhados.
Lembre-se de que você sempre precisa adicionar um líder 1
antes da conversão!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Para referência, aqui está uma implementação do Python 3 que eu usei para os casos de teste (não destruídos):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Respostas:
05AB1E , 4 bytes
Explicação
Se a entrada tiver caracteres hexadecimais inválidos,
H
não enviará nada, portanto o último valor na pilha será a entrada duplicada; é por isso que o programa imprime sua entrada em caso de entrada inválida.Experimente online!
fonte
05AB1E
é um nome de usuário válido.JavaScript (ES6), 15 bytes
Como funciona
'0x1'+s
converte a entrada em uma string hexadecimal literal com um prefixo1
, por exemplo0x105ab1e
. Em seguida,-0
lança o resultado em um número. O JavaScript vê isso0x
no começo e tenta implicitamente converter de hexadecimal; ses
contiver caracteres não-hexadecimais, isso retornaráNaN
. Como isso é falso (e a saída0
nunca pode ser fornecida por causa do anexo1
), podemos usar||s
para retornars
se a conversão hexadecimal falhar.Snippet de teste
fonte
Python 2 , 44 bytes
Recebe a entrada como uma string entre aspas. -2 bytes graças a Rod!
Como garantimos que a entrada conterá apenas alfanuméricos e sublinhados, não há como criar Python válido depois
0x1
de ter uma string hexadecimal. Se a entrada for qualquer outra coisa, o erro será ignorado e impresso como era originalmente.Eu não conseguia fazer um regex corresponder mais curto que
try/except
. De fato, o regex mostrou-se terrivelmente detalhado:fonte
a=int('1'+a,16)
comexec'a=0x1'+a
(provavelmente, necessidade de teste)"+input()"
.()
eminput()
Perl 6 , 19 bytes
Teste-o
Expandido:
fonte
Perl, 27 bytes
-1 byte graças a @ardnew .
26 bytes de código
-p
sinalizador.Forneça a entrada sem nova linha final. Com
echo -n
por exemplo:Explicação
Isso é bastante direto:
/[^0-9a-f]/i
é verdadeiro se a entrada contiver um caractere diferente daqueles permitidos dentro de números hexadecimais. Se for falso,$_
(que contém a entrada), é definido como o valor convertido (a conversão é feita pelo builtinhex
).E
$_
é implicitamente impresso graças à-p
bandeira.fonte
$_=hex"1$_"if!/[^0-9a-f]/i
Pitão - 9 bytes
Mesma idéia que a resposta do fliptack . Tente a conversão hexadecimal-decimal, caso contrário, produza a entrada.
Experimente aqui!
fonte
Lote, 33 bytes
Como funciona
Uma sequência é passada como argumento, 1 é anexado a ela e a sequência é implicitamente convertida em decimal e impressa. Se a sequência não for hexadecimal válida, ela é simplesmente exibida.
Deve-se observar que, como a matemática do lote usa números inteiros assinados de 32 bits, o maior nome de usuário permitido é
FFFFFFF
.cmd /c
pega o próximo comando, executa-o em um novo terminal e sai.set /a
executa matemática e exibe implicitamente o resultado em decimal quando não armazenado em uma variável.0x1%1
instrui o conjunto a acrescentar 1 ao primeiro argumento (isso é fácil, pois todas as variáveis de lote são cadeias) e indica que a cadeia deve ser tratada como hexadecimal.2>nul
silencia quaisquer erros resultantes de um número hexadecimal inválido||
é um OR lógico e executa o comando à direita se o comando à esquerda não for bem-sucedido. Os parênteses compõem tudo até esse ponto, um comando.echo %1
simplesmente exibe o primeiro argumento.fonte
Lisp comum, 71
Testes
Definir função
Cite uma lista das entradas esperadas, conforme fornecido pela pergunta:
Analise e colete resultados
Verifique se as saídas esperadas correspondem às reais:
fonte
C, 108 bytes
Essa é uma função que pega a string como argumento e imprime o resultado em STDOUT.
fonte
int
:)JavaScript:
4641 bytesfonte
/[^0-9a-f]/i
0-9
por\d
, 3 bytes adicionando o sinalizador que não diferencia maiúsculas de minúsculas (obrigado @GilZ) e mais 2 bytes removendoF=
, o que não é necessário. Obrigado pela sugestão.PHP, 42 bytes
hex2bin () retorna false se a entrada não for uma sequência hexadecimal válida. Isso é mais curto do que usar regex para procurar dígitos não hexadecimais, mas precisamos do operador @ porque ele não fica silencioso quando falha.
fonte
hex2bin
falha em strings com comprimentos irregulares. Ainda dois bytes mais curtos do que compreg_match
: porém,<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
para 57 bytes.bash,
463531 bytesSalve como um script e passe o nome de usuário como argumento.
fonte
Python 2 -
63.,52,50., 46 bytesIsso usa o Python
int()
que converte qualquer string com sua base apropriada em base 10. Nesse caso, a string é o número 1 anexado à entrada. Se a entrada for inválida (tiver caracteres diferentes de0123456789ABCDEF
(sem distinção entre maiúsculas e minúsculas), ela retornaráValueError
:Experimente aqui!
Agradecemos ao @FlipTack por salvar 15 bytes!
fonte
Ruby,
4744 bytesEu poderia remover 3 bytes mudandoputs
parap
, mas sinto que a saída seria considerada incorreta, pois tem uma nova linha no final.Editar: alterado
puts
parap
como as novas linhas à direita geralmente são aceitas, obrigado @Mego.fonte
Japonês , 11 bytes
Experimente Online!
Muito obrigado à ETHproductions!
fonte
Dyalog APL , 37 bytes
Não usa validação interna ou conversão hex-dec. Requer
⎕IO←0
qual é o padrão em muitos sistemas.Ungolfed:
d ← ⎕D , 6 ↑ ⎕A
d recebe D igits seguidos pelos 6 primeiros elementos do alfabeto Au ← 1 (819⌶) ⍵
u recebe argumento em maiúsculas (819 ≈ "Grande")∧/ u ∊ d:
se todos os elementos de u são membros de d , então:16 ⊥ 1 , d ⍳ u
encontre os índices de u em d , adicione um 1 e avalie como base 16⍵
else: retorna o argumento (não modificado)TryAPL online:
Definir
⎕IO
a zero, definir um substituto para⌶
(proibido em TryAPL por razões de segurança), e um conjunto⎕PP
( P rint P recision) a 10, para os grandes resultadosExperimente todos os casos de teste
fonte
REXX,
49.48 bytesO
signal on syntax
diz o intérprete para saltar para o rótulosyntax
sempre que ocorre um erro de sintaxe. O programa tenta reatribuira
com uma versão convertida hexadecimal em decimal com 1 inicial, mas pula para osyntax
rótulo se isso falhar. Se a conversão for aprovada, ela simplesmente ignora o rótulo e gera a variável reatribuída.fonte
PowerShell , 35 bytes
Experimente online! ou Execute todos os casos de teste!
Explicação
$v
)0
) seja o resultado de uma string contendo0x1$v
canalizado emInvoke-Expression
(iex
), enquanto atribui esse valor simultaneamente$h
. Se a conversão falhar,$h
permanecerá$null
.-not
valor booleano de$h
. O que quer que$h
seja será implicitamente convertido em[bool]
($null
no caso de uma conversão inválida se tornará$false
, um número inteiro positivo no caso de uma conversão bem-sucedida se tornará$true
) antes de ser negado, o qual será convertido implicitamente[int]
pelo indexador de matriz[]
($true
será1
,$false
será0
), resultando no primeiro elemento da matriz (o resultado da conversão) escolhido se a conversão foi bem-sucedida e no segundo elemento escolhido se a conversão não tiver êxito.fonte
Scala, 40 bytes
Uso:
Explicação:
fonte
C #, 58 bytes
Sem jogar com casos de teste:
Experimente on-line
fonte
Dardo, 51 bytes
Experimente aqui
A maior parte da sobrecarga vem de parâmetros nomeados ... Oh, bem!
Pelo menos o Dart permite que você seja digitado dinamicamente, se desejar: D
fonte