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