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 ba5eba11se puede interpretar como 0xBA5EBA11un 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 1antes 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 1antes 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,
Hno 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
05AB1Ees un nombre de usuario válidoJavaScript (ES6), 15 bytes
Cómo funciona
'0x1'+sconvierte la entrada en una cadena hexadecimal literal con un antecedente1, por ejemplo0x105ab1e. Luego-0arroja el resultado a un número. JavaScript lo ve0xal principio e intenta implícitamente convertirlo de hexadecimal; siscontiene caracteres no hexadecimales, esto devuelveNaN. Como esto es falso (y la salida0nunca se puede dar debido al antecedente1), podemos usar||spara regresarssi 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
0x1de 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 +
-pbandera.Proporcione la entrada sin nueva línea final. Con
echo -npor ejemplo:Explicación
Esto es bastante sencillo:
/[^0-9a-f]/ies 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-pbandera.fuente
$_=hex"1$_"if!/[^0-9a-f]/iPyth - 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 /ctoma el siguiente comando, lo ejecuta en una nueva terminal y sale.set /arealiza cálculos matemáticos y muestra implícitamente el resultado en decimal cuando no se almacena en una variable.0x1%1le 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>nulsilencia 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 %1simplemente 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]/i0-9por\d3 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
hex2binfalla para cadenas con longitudes desiguales. Aún dos bytes más cortos que conpreg_matchaunque:<?=@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 cambiandoputsparap, pero siento que la salida sería considerado equivocada ya que tiene una nueva línea al final.Editar: Modificado
putsporque laspnuevas 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←0cuál es el predeterminado en muchos sistemas.Sin golf:
d ← ⎕D , 6 ↑ ⎕Ad 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 ⍳ uencuentre 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
⎕IOa 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 syntaxle dice al intérprete que salte a la etiquetasyntaxcada vez que se produce un error de sintaxis. El programa intenta reasignaracon una versión convertida de hexadecimal a decimal con un 1 inicial, pero salta a lasyntaxetiqueta 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$ventubado enInvoke-Expression(iex), mientras asigna simultáneamente este valor a$h. Si la conversión falla,$hpermanecerá$null.-notvalor booleano de$h. Lo que$hsea se convertirá implícitamente a[bool]($nullen el caso de una conversión no válida, se convertirá en$falseun 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[]($trueserá1,$falseserá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