0xNombres de usuario
¡Hay tantas personas que usan un servicio de mensajería que se están quedando sin espacio para almacenar todos los nombres de usuario! Para solucionar esto, comenzarán a almacenar nombres de usuario como hexadecimales, siempre que sea posible.
Si un nombre de usuario consta solo de los caracteres 0123456789ABCDEF
(sin distinción entre mayúsculas y minúsculas), se puede convertir a hexadecimal y almacenar como un entero. Por ejemplo, el nombre de usuario ba5eba11
se puede interpretar como 0xBA5EBA11
un entero hexadecimal.
¿Pero que pasa 05AB1E
? Eso tiene un cero a la izquierda, que se perdería. Entonces, cada vez que convertimos un nombre de usuario, nos aseguramos de anteponer un 1
antes de leerlo como un entero.
El reto
Su tarea es escribir un programa o función que, dado un nombre de usuario no vacío como una cadena, 'comprima hexa' el nombre de usuario:
- Si se puede interpretar como un entero hexadecimal, anteponga un 1, interprete como hexadecimal y luego imprima el resultado como base 10.
- De lo contrario, solo devuelva la cadena sin modificar.
Este es el código de golf , por lo que gana la solución más corta (en bytes). Se permiten funciones de conversión de base incorporadas.
Casos de prueba
Puede suponer que los enteros resultantes estarán dentro del rango de enteros estándar de su idioma.
Al igual que con los nombres de usuario en la mayoría de los sistemas de mensajería, las cadenas de entrada solo contendrán caracteres alfanuméricos y guiones bajos.
Recuerde, ¡siempre necesita agregar un líder 1
antes de la conversión!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Como referencia, aquí hay una implementación de Python 3 que utilicé para los casos de prueba (sin golf):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Respuestas:
05AB1E , 4 bytes
Explicación
Si la entrada tiene caracteres hexadecimales no válidos,
H
no empujará nada, por lo que el último valor en la pila será la entrada duplicada, es por eso que el programa imprime su entrada en caso de entrada no válida.Pruébalo en línea!
fuente
05AB1E
es un nombre de usuario válidoJavaScript (ES6), 15 bytes
Cómo funciona
'0x1'+s
convierte la entrada en una cadena hexadecimal literal con un antecedente1
, por ejemplo0x105ab1e
. Luego-0
arroja el resultado a un número. JavaScript lo ve0x
al principio e intenta implícitamente convertirlo de hexadecimal; sis
contiene caracteres no hexadecimales, esto devuelveNaN
. Como esto es falso (y la salida0
nunca se puede dar debido al antecedente1
), podemos usar||s
para regresars
si la conversión hexadecimal falló.Fragmento de prueba
fuente
Python 2 , 44 bytes
Toma la entrada como una cadena entre comillas. -2 bytes gracias a Rod!
Como se garantiza que la entrada solo contendrá caracteres alfanuméricos y guiones bajos, no hay forma de crear Python válido después
0x1
de tener una cadena hexadecimal. Si la entrada es otra cosa, el error se ignora y se imprime como estaba originalmente.Parece que no puedo hacer una coincidencia de expresiones regulares más corta que
try/except
. De hecho, regex resultó ser terriblemente detallado:fuente
a=int('1'+a,16)
conexec'a=0x1'+a
(probablemente, necesita probar)"+input()"
.()
eninput()
Perl 6 , 19 bytes
Pruébalo
Expandido:
fuente
Perl, 27 bytes
-1 byte gracias a @ardnew .
26 bytes de código +
-p
bandera.Proporcione la entrada sin nueva línea final. Con
echo -n
por ejemplo:Explicación
Esto es bastante sencillo:
/[^0-9a-f]/i
es cierto si la entrada contiene un carácter distinto de los permitidos dentro de los números hexadecimales. Si es falso,$_
(que contiene la entrada) se establece en el valor convertido (la conversión se realiza por el incorporadohex
).Y
$_
se imprime implícitamente gracias a la-p
bandera.fuente
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 bytes
La misma idea que la respuesta del fliptack . Pruebe la conversión hexadecimal-decimal; de lo contrario, envíe la entrada.
Pruébalo aquí!
fuente
Lote, 33 bytes.
Cómo funciona
Se pasa una cadena como argumento, se antepone 1, y la cadena se convierte implícitamente a decimal y se imprime. Si la cadena no es hexadecimal válida, simplemente se muestra.
Cabe señalar que, como las matemáticas por lotes utilizan enteros de 32 bits con signo, el nombre de usuario más grande permitido es
FFFFFFF
.cmd /c
toma el siguiente comando, lo ejecuta en una nueva terminal y sale.set /a
realiza cálculos matemáticos y muestra implícitamente el resultado en decimal cuando no se almacena en una variable.0x1%1
le dice a set que anteponga un 1 al primer argumento (esto es fácil ya que todas las variables por lotes son cadenas) e indica que la cadena debe tratarse como hexadecimal.2>nul
silencia cualquier error resultante de un número hexadecimal no válido||
es un OR lógico y ejecuta el comando de la derecha si el comando de la izquierda no tiene éxito. Los paréntesis hacen que todo hasta este punto sea un comando.echo %1
simplemente muestra el primer argumento.fuente
Lisp común, 71
Pruebas
Definir función
Cite una lista de entradas esperadas, como se indica en la pregunta:
Analízalo y recoge resultados
Compruebe que las salidas esperadas coinciden con las reales:
fuente
C, 108 bytes
Esta es una función que toma la cadena como argumento e imprime el resultado en STDOUT.
fuente
int
:)JavaScript:
4641 bytesfuente
/[^0-9a-f]/i
0-9
por\d
3 bytes agregando la marca que no distingue entre mayúsculas y minúsculas (gracias @GilZ) y 2 bytes más eliminandoF=
, lo que no es necesario. Gracias por la sugerencia.PHP, 42 bytes
hex2bin () devuelve falso si la entrada no es una cadena hexadecimal válida. Esto es más corto que usar expresiones regulares para buscar dígitos no hexadecimales, pero necesitamos el operador @ porque no es silencioso cuando falla.
fuente
hex2bin
falla para cadenas con longitudes desiguales. Aún dos bytes más cortos que conpreg_match
aunque:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
para 57 bytes.bash,
463531 bytesGuardar como secuencia de comandos y pasar el nombre de usuario como argumento.
fuente
Python 2 -
63,52,50, 46 bytesEsto utiliza Python
int()
que convierte cualquier cadena con su base apropiada en la base 10. En este caso, la cadena es el número 1 adjunto a la entrada. Si la entrada no es válida (tiene caracteres distintos a0123456789ABCDEF
(no distingue entre mayúsculas y minúsculas), devuelveValueError
:Pruébalo aquí!
¡Gracias a @FlipTack por guardar 15 bytes!
fuente
Ruby,
4744 bytesYo podría eliminar 3 bytes cambiandoputs
parap
, pero siento que la salida sería considerado equivocada ya que tiene una nueva línea al final.Editar: Modificado
puts
porque lasp
nuevas líneas finales generalmente se aceptan, gracias @Mego.fuente
Japt , 11 bytes
Pruébalo en línea!
¡Muchas gracias a ETHproductions!
fuente
Dyalog APL , 37 bytes
No utiliza validación integrada o conversión hexadecimal. Requiere
⎕IO←0
cuál es el predeterminado en muchos sistemas.Sin golf:
d ← ⎕D , 6 ↑ ⎕A
d obtiene D igits seguidos de los primeros 6 elementos del alfabeto Au ← 1 (819⌶) ⍵
u obtiene argumento en mayúsculas (819 ≈ "Big")∧/ u ∊ d:
si todos los elementos de u son miembros de d , entonces:16 ⊥ 1 , d ⍳ u
encuentre los índices de u en d , anteponga un 1 y evalúe como base 16⍵
else: devuelve el argumento (sin modificar)TryAPL en línea:
Ajuste
⎕IO
a cero, definir un reemplazo para⌶
(prohibido en TryAPL por razones de seguridad), y un conjunto⎕PP
( P rint P recision) a 10 para los grandes resultadosPrueba todos los casos de prueba
fuente
REXX
4948 bytesEl
signal on syntax
le dice al intérprete que salte a la etiquetasyntax
cada vez que se produce un error de sintaxis. El programa intenta reasignara
con una versión convertida de hexadecimal a decimal con un 1 inicial, pero salta a lasyntax
etiqueta si eso falla. Si la conversión pasa, simplemente ignora la etiqueta y genera la variable reasignada.fuente
PowerShell , 35 bytes
Pruébalo en línea! o ejecutar todos los casos de prueba!
Explicación
$v
)0
) sea el resultado de una cadena que contenga0x1$v
entubado enInvoke-Expression
(iex
), mientras asigna simultáneamente este valor a$h
. Si la conversión falla,$h
permanecerá$null
.-not
valor booleano de$h
. Lo que$h
sea se convertirá implícitamente a[bool]
($null
en el caso de una conversión no válida, se convertirá en$false
un entero positivo en el caso de una conversión exitosa$true
) antes de ser negado, que luego se convertirá implícitamente en[int]
el indexador de matriz[]
($true
será1
,$false
será0
), lo que resulta en el primer elemento de la matriz (el resultado de la conversión) elegido si la conversión fue exitosa, y el segundo elemento elegido si la conversión no fue exitosa.fuente
Scala, 40 bytes
Uso:
Explicación:
fuente
C #, 58 bytes
Sin golfos con casos de prueba:
Probar en línea
fuente
Dart, 51 bytes
Pruébalo aquí
La mayor parte de la sobrecarga proviene de parámetros con nombre ... ¡Oh, bueno!
Al menos Dart te permite escribir de forma dinámica, si quieres: D
fuente