Reto
Aquí hay uno simple.
Escriba una función o programa cuando se le dé un número en la base 10 como entrada, devolverá o imprimirá el valor de ese número en hexadecimal .
Ejemplos
15 -> F
1000 -> 3E8
256 -> 100
Reglas
- Sin funciones hexadecimales incorporadas
- Las letras pueden ser minúsculas o mayúsculas
- Solo tendrá que preocuparse por enteros no negativos, negativos o decimales molestos
- Debería funcionar con cualquier número arbitrariamente grande hasta el límite del tipo predeterminado de idioma.
- Nueva línea no obligatoria
- Como de costumbre, este es el código de golf , por lo que gana el código más corto medido en bytes.
code-golf
math
base-conversion
hexadecimal
Chico al azar
fuente
fuente
000003E8
?Respuestas:
APL (Dyalog APL) , 17 bytes
Debe ejecutarse con
⎕IO←0
, lo cual es predeterminado en muchos sistemas APL.Pruébalo en línea!
(⎕D,⎕A)[
...]
D igits concatenados a un lphabet, a continuación, indexados por ...16⊥⍣¯1
el inverso de 16-Base-to-Number, es decir, Number-to-Base-16⊢
aplicado a⎕
entrada numéricafuente
Código de máquina de Turing, 412 bytes
Como de costumbre, estoy usando la sintaxis de la tabla de reglas definida aquí. Puede probarlo en ese sitio o, alternativamente, usar esta implementación de Java.
Cuenta hacia atrás desde la entrada en la base 10 mientras cuenta desde 0 en la base 16. Al disminuir el cero, borra el bloque de entrada y termina.
fuente
10*n + 33
instrucciones para completar cualquier arbitrarion
. Aunque no entiendo el código.Java,
9289 bytesfuente
Javascript,
4943 bytes.6 bytes guardados por el usuario 81655 .
Pruébalo aquí .
Esto tiene dos ceros a la izquierda, lo cual está permitido por las reglas.
Aquí hay una versión sin ceros a la izquierda: (47 bytes).
Pruébalo aquí .
Ambos utilizan exactamente el mismo enfoque que mi respuesta de Python .
fuente
i&15
se convertirá automáticamente a entero, dejando decimales. No hay necesidad de~~
h=i=>i&&h(i>>4)+"0123456789abcdef"[i&15]
CJam,
2221 bytes¡Gracias a @ MartinBüttner por jugar golf en 1 byte!
Pruébalo en línea!
Cómo funciona
fuente
ri{Gmd_9>7*sc+\}h;]W%
Pyth,
33262120 bytesEsto fue divertido.
Pruébalo en línea.
Explicado:
fuente
C (función), 51
La función recursiva toma el entero de entrada como parámetro:
Conductor de prueba:
fuente
Haskell,
5958434139 bytesEjemplo de uso:
sequence(s<$s)!!) $ 1000
->"00000000000003E8"
.Esto crea una lista de todos los números hexadecimales de hasta 16 dígitos hexadecimales. Afortunadamente, esto sucede en orden, por lo que simplemente podemos elegir el
n
th.Editar: @Mauris exprimió 2 bytes. ¡Gracias!
fuente
s="0123456789ABCDEF";(sequence(s<$s)!!)
dc, 37
Divide recursivamente por 16, empujando el resto a la pila hasta que no quede nada para dividir. Luego imprima cada elemento de la pila, usando divmod por 10 para lograr los dígitos AF. Probablemente más detalles mañana ... (y con suerte menos bytes).
fuente
Python,
5958 bytes1 byte guardado por CarpetPython
Correr como:
print h(15)
Probarlo aquí (Ideone.com).
Explicación:
fuente
h=lambda i:(i>15 and h(i/16)or'')+"0123456789abcdef"[i%16]
.h=lambda i:(i>15 and h(i/16)or'')+chr(48+i%16+i%16/10*7)
C (gcc) ,
4544 bytesPruébalo en línea!
fuente
Bash (función), 62
Gracias a @manatwork por sugerir el uso de la recursividad.
fuente
h(){ x=({0..9} {A..F});echo `(($1>15))&&h $[$1/16]`${x[$1%16]}; }
()
lugar de{ ;}
alrededor del cuerpo de la función ahorra aún más :)Perl 6 ,
5348 bytesEsto crea una secuencia de valores que son enteros divididos (
div
), hasta que el resultado0
excluya el0
de la secuenciaLuego cruza (
X
) esa secuencia usando el operador de módulo (%
) con16
Utiliza esos valores como índices en una lista aplanada que consta de dos rangos
0..9
y'A'..'Z'
Finalmente los concatena (
~
) usando elR
meta operador reverse ( )Si eso da como resultado un valor falso (cadena vacía), devuelva
0
Uso:
fuente
MATL , 27 bytes
Esto usa versión 5.1.0 del lenguaje / compilador, que es anterior a este desafío.
Ejemplo
Explicación
fuente
𝔼𝕊𝕄𝕚𝕟, 31 caracteres / 62 bytes
Try it here (Firefox only).
Bien, descubrí algunas cosas más que lo jugaron golf.
Explicación
Es esencialmente la misma solución que la solución ES6 de @ SuperJedi224, pero con algo diferente.
⩥ḊĀⒸª⩥⁽ṁṇ⸩⨝
¿ Ves ? Esa es una forma muy elegante de escribir"0123456789ABCDEF"
.⩥Ḋ
crea un rango de 0 a 10,Ⓒª⩥⁽ṁṇ⸩
crea un rango de 65 a 71 y lo convierte en una cadena de ASCII, yĀ...⨝
concatena los dos rangos y los une en una sola cadena. Esta fue probablemente la parte más genial de mi solución.Versión no competitiva adicional, 24 caracteres / 45 bytes
Decidí agregar una cadena de alfabeto, como en Pyth.
fuente
sed, 341 bytes
No es el lenguaje obvio para este desafío, pero tiene la ventaja de admitir números de entrada hasta (dependiendo de su implementación) entre 4000 dígitos y el límite de memoria disponible (virtual) de su sistema. Convertí RSA-1024 a hexadecimal en aproximadamente 0.6 segundos, por lo que se escala razonablemente bien.
Funciona usando la división sucesiva por dos, acumulando cada 4 bits de acarreo en un dígito hexadecimal. Utilizamos caracteres que no son letras para representar nuestra salida, de modo que siempre acumulamos acarreo entre la entrada decimal y la salida hexadecimal, y la convertimos a hexadecimal convencional al final.
fuente
PHP,
65 66 64 + 1 6259 bytesfunción de impresión recursiva, imprime un cero inicial (inserte
>16
antes&&
para eliminarlo)programas, 64 bytes +1 para
-R
(ejecutar como canalización con-nR
)requiere PHP 5.6 o posterior (5.5 no puede indexar literales de cadena)
o
requiere PHP 5.6 o 7.0 (7.1 entiende los índices de cadena negativos)
Ejecutar como tubería
-nR
o probarlos en línea .fuente
echo+$s
para la entrada 0+
signo corta la salida en la primera letra ... así que ...?:0
Julia, 55 bytes
Esta es la implementación básica de la función recursiva. Acepta un entero y devuelve una cadena.
Si la entrada es menor que 15, el piso se divide por 16 y se repite; de lo contrario, tome la cadena vacía. Agregue esto al frente del carácter hexadecimal seleccionado apropiadamente.
fuente
Pira , 98 bytes
Hacer esto en un lenguaje sin operadores aritméticos fue probablemente un error.
Usar así:
Sin golf:
fuente
Ruby, 48 caracteres.
(Copia de la respuesta de Python de Loovjo ).
Ejecución de muestra:
fuente
En serio, 35 bytes
Hex Dump:
Pruébalo en línea
Explicación:
Tenga en cuenta que
;7ªD+@9<7*+c
es equivalente a4ª▀E
, lo que ahorraría 8 bytes, pero pensé que tal vez una función que empuja los dígitos de la base b como una cadena podría considerarse demasiado como un "incorporado hexadecimal".fuente
Javascript ES6,
6458 bytesGuardado 6 bytes gracias a ן nɟuɐɯɹɐ ן oɯ y user81655.
fuente
v=>eval('for(z="";v;v=v/16|0)z="0123456789ABCDEF"[v%16]+z')
v=>{for(z="";v>0;v=v/16|0)z=btoa``Ó]·ã»óÐ1``[v%16]+z;return z}
(las tildes dobles son tildes simples) ==> 64 caracteres, 71 bytes. No vale la pena.v=v/16|0
es solo una forma compleja de escribirv>>=4
.Befunge-93, 58
La primera vez que realizo un verdadero desafío de golf en Befunge, apuesto a que hay una sola línea para esto que es más corta ya que todos esos espacios en el medio de la segunda línea parecen ser un desperdicio.
Puedes recorrerlo aquí . Explicación parcial:
&
: Tomar entrada.:88+%
: Tome el resto del módulo 16."0"+
: Añádelo al valor ASCII de 0.:"9"`
: Si el resultado es mayor que el valor ASCII de 9 ...7*+
: Agregue 7 para convertirlo en una letra.\
: Guarda el personaje resultante en la pila.8/2/
: Divide entre 16 redondeando hacia abajo.:!#|_
: Salga del bucle si el resultado es 0.#
: De lo contrario, vuelva al paso de módulo.>:#,_@
(ajuste): una vez terminado, envíe la pila en orden LIFO.fuente
> <> , 46 + 3 = 49 bytes
Esto habría sido más corto si> <> tuviera una división entera, que ahora tenemos que emular restando el módulo 1. Aún así, ¡creo que esto usa algunos trucos envolventes!
Pruébalo en línea!
Explicación
Primer bucle
El primer bucle realiza la conversión clásica al algoritmo hexadecimal. Hace el módulo 16 (
:f1+%
) y comprueba si el resultado es <10 (:a(?
). Si no es así, debemos agregar 7 (7+
) para pasar de los decimales al alfabeto mayúscula en la tabla ASCII. De lo contrario, podemos proceder agregando el valor ASCII para 0 ("0"+
) y desplazando el carácter que se generará al final de la pila porque tendremos que generarlos en orden inverso. El valor superior se reemplaza por su resultado de la división de enteros por 16. Esto se emula calculando a / b - (a / b)% 1 (f1+,:1%-
). Cuando finaliza el ciclo, la pila contiene los caracteres hexadecimales en orden de salida invertido y un 0.Segundo bucle
El segundo bucle invierte la lista y comprueba si el elemento superior es 0. Si es así, sabemos que se imprimieron todos los que no son cero y debemos finalizar. De lo contrario, mostramos el carácter y volvemos a invertir la lista para prepararnos para la próxima iteración. Al
:
ingresar al segundo bucle, se duplicará el 0 que no tiene ningún efecto.fuente
SpecBAS - 110 bytes
Esto usa un algoritmo que encontré en WikiHow (segundo método).
Las cadenas en SpecBAS están basadas en 1, por lo tanto,
+1
para seleccionar el elemento correcto.fuente
C (clang) , 83 bytes
Pruébalo en línea!
Solución alternativa en C
fuente
Rubí, 40 bytes.
Robado deInspirado por la respuesta de manatwork, pero usando una escapatoria interesante para hacerlo más corto.fuente
REXX,
8078 bytesfuente
C, 48 bytes
Esto no es completamente original, eliminé 5 bytes de la versión que trajo Digital Trauma.
fuente
APL (NARS), caracteres 34, bytes 68
prueba:
fuente