En este desafío, recibirá una entrada, la convertirá a hexadecimal, hará un par de cambios y generará el resultado.
Debido a que solo tienen 16 caracteres en hexadecimal, su código deberá ser lo más corto posible.
Ejemplos
Los ejemplos están separados por una línea en blanco. La primera línea es de entrada, la segunda línea muestra los pasos, la tercera muestra la salida
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Pasos
La entrada siempre será un número entero positivo.
Para generar la salida, deberá seguir los siguientes pasos:
- Convierta la entrada a hexadecimal
- Reemplace cualquier letra con su índice en el alfabeto (por ejemplo
a -> 1, b -> 2
) - Convertir el resultado nuevamente a hexadecimal
- Si el resultado contiene letras, vaya al paso 2. Si no, envíe el resultado
Este es el código de golf, ¡el código más corto en bytes gana!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
fuente
fuente
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Respuestas:
Jalea , 18 bytes
Pruébalo en línea!
La versión binaria de 18 bytes del código fuente tiene el volcado xxd
y funciona con esta versión del intérprete Jelly .
Cómo funciona
Ḍ
(decimal a entero) debería haber funcionado como una abreviaturaḅ⁵
, pero la última versión de Jelly en el momento de esta publicación tenía un error que me impedía usarlo.fuente
JavaScript ES6,
98926764 bytesGuardado 3 bytes gracias a @Downgoat, 3 más gracias a @ user81655
Encontré una versión mucho, mucho más corta, abandonando el ciclo de recursión:
Probablemente la parte más interesante de este programa es la
replace
función:Fragmento de prueba
(tomado de aquí )
fuente
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. También podría ahorrar algunos bytes usando recursividad.replace
en la cadena antes de evaluarlo, pero resultó más largo.h=
CJam,
2119 bytesPruébalo aquí.
Explicación
Un caso muy raro de módulo negativo resulta útil. :)
fuente
Rubí, 35 + 1 = 36
Con el indicador de línea de comando
p
, ejecuteExplicación:
El indicador -p crea un bucle, almacenando la entrada y la salida eventual en la variable
$_
.'%x'
realiza la conversión hexadecimal,tr!
realiza la sustitución de dígitos y devuelve un valor falsey si no hubiera nada que cambiar. rehacer comienza de nuevo con lo nuevo$_
.fuente
Julia,
7874 bytesEsta es una función recursiva que acepta un número entero y devuelve una cadena.
Sin golf:
fuente
MATL , 23
25bytesDescargo de responsabilidad
Mientras escribía esta respuesta, noté un error en la
dec2base
función de MATL , lo corregí y lancé una nueva versión con la corrección (así como un par de otros cambios acumulados y no relacionados) .Como estoy usando una versión posterior a este desafío, según el consenso sobre Meta, esta respuesta no es elegible para ganar .
Código
Ejemplo
Explicación
fuente
Dyalog APL,
373633 bytesGracias a Adám y ngn por sus sugerencias. Me quedo en
16⊥⍣¯1⊢⍵
lugar de⍵⊤⍨⍴⍨16
: es un byte adicional, pero nos permite operar con números de tamaño arbitrario en lugar de 64 bits.fuente
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(técnicamente no es equivalente, pero funciona para dígitos hexadecimales)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105bytesfuente
PHP,
14012612211411287 o 84 bytes (incluyendo-r
)No estoy completamente seguro de cómo funcionan las reglas en torno a esto, ya que este es mi primer intento de codegolf, pero el código se puede ejecutar
php -r
sin necesidad<?
y?>
Código
Formateado
Código alternativo (usando argv en lugar de stdin)
Formateado
Notas
Edición 1: corté una llamada para
intval()
guardar 14 caracteres ya que PHP felizmente tratará las cadenas numéricas como números.Edición 2: eliminé
\n
de la salida que olvidé eliminar después de la prueba, y eliminé las comillas del eco final para guardar un total de 4 caracteres.Datos 3: Se ha eliminado la última llamada a
intval()
editar 4: Guardado 2 bytes mediante la eliminación de las comillas de la línea de expresiones regulares
Editar 5: Se ha cambiado
[a-f]
a\D
ahorrar 3 caracteres, se quitóstrval
llamada desdepreg_replace
hace 8 más; Se agregó una versión que usa enargv[]
lugar de STDIN, movió el terminador de bucle a la instrucción while (¡Uy!) guardando 11 caracteres más, y movió la llamada de Dechex a lasubject
partepreg_replace
para otros 3, haciendo un total de 25; También se agregó una versión sin stdin como una versión alternativa que usa 3 caracteres menos. Gracias por la ayuda, @Blackholefuente
-r
opción). Pero un líder;
siempre es más corto que un líder?>
, así que no lo olvide. Por cierto, aquí hay un código más corto:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 bytes).153
debe dar63
, no99
. Pero-r
es gratis. (ver codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 bytes-3 bytes usando en
if
lugar dewhile
-1 byte gracias a Giuseppe usando en
as.double
lugar deas.integer
Pruébalo en línea!
Simplemente agregue
a(your_integer_here)
al TIO para ver el resultado.Utilicé la recursión para volver a aplicar la función a cada iteración sucesiva, con la condición de que no encuentre ninguna de las letras 'abcdef' dentro de la cadena, cuando esta condición es False, genera el resultado como una cadena. La mejor parte fue mi descubrimiento de la
chartr
función, que me permite intercambiar elementos con los elementos correspondientes en una cadena. Esta cadena proviene de la función que obliga al hexadecimal a un formato de cadena.Editar: intenté usar en
sprint("%x",y)
lugar deas.hexmode(as.double(y))
, pero todavía tengo que usaras.double
en algún lugar del código, que era21 byte más.fuente
as.double
es más corto queas.integer
05AB1E , 12 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
ÐþQ
alternativamente podría serD.ï
(D
: Duplicate.ï
;: is_int?) para el mismo conteo de bytes.fuente
[hÐþQ#Au₂L‡
no siempre funciona desafortunadamente. El desafío establece convertir a hexadecimal una vez primero, y luego en cada iteración. Si pego su código en mi conjunto de pruebas, los primeros tres casos de prueba son correctos, pero los dos últimos fallan.C # (compilador interactivo de Visual C #) , 92 bytes
Pruébalo en línea!
Menos código de golf:
fuente
Mathematica, 107 bytes
No puedo pensar en más formas de jugar al golf ...
fuente
Mathematica, 80 bytes
Esto usa un buen truco para los bucles while que aprendí de alephalpha. El
//.
es "aplicar esta regla de sustitución tan a menudo como sea posible". Luego usamos un patrón,l_/;Max@l>9
que solo coincide si la lista de dígitos hexadecimales todavía contiene dígitos mayores que 9.fuente
Japt,
4540 bytesBasado en mi respuesta JS:
Bastante patético para un lenguaje de golf, ¿eh? Parece que hay muchas personas que se dan cuenta durante este desafío de que sus intérpretes tienen errores, y ahora estoy incluido entre ellos. Esto debería poder hacerse en 30 bytes o menos, pero un error lo hace imposible.
Esto crea una función
H
que se puede llamar así:Alternativamente, aquí hay un programa completo, tomando información de STDIN:
Pruébalo en línea!
fuente
GNU Sed (con extensión eval), 44
Desearía
sed
permitirloy/A-F/1-6/
. Pero no lo hace.fuente
Python 3,
10189 bytesEn general, esto es bastante similar a la solución de Boomerang , pero requiere algunos enfoques diferentes para varios aspectos.
Esta es la versión ampliada de mi código original:
Se arrojaron 11 bytes gracias a @pacholik (reemplazando las entrañas del
join
con una sola operación que funcionó tanto para dígitos como para letras). Se ajustó otro byte reemplazando eljoin
con un truco de corte de cuerda que me golpeó en un momento de bombilla (pero que ya existe en las puntas de golf de Python , aunque bajo un encabezado que especifica Python 2).fuente
join
puede ser acortado astr(ord(c)%12)for c in n
.Java, 201 bytes
fuente
Japt , 21 bytes
Pruébalo en línea!
Una mejora significativa sobre la respuesta existente de Japt. No maneja el
153 -> 63
caso propuesto en un comentario, pero ninguna de las otras respuestas parece hacerlo, así que lo dejaré a menos que el OP lo aclare.La salida como una lista de dígitos decimales, podría cambiarse a la salida de un número decimal para 1 byte
Explicación:
fuente
APL (NARS) 104 caracteres, 208 bytes
prueba:
No sé si está bien ... Posiblemente no sea suficiente para la respuesta de calidad estándar ...
fuente
En serio, 42 bytes
Hex Dump:
Pruébalo en línea
Tiene que haber un camino más corto que este, pero esto es lo que obtuve ... (Aquí es donde me encuentro
W
realmente deseando aparecer, ya que es más corto poner un;
derecho antes del último cuando NO lo quieres que poner unX
después de CADAW
. Aquí, tenerW
pop en lugar de peek ahorraría tres bytes).fuente
Japt, 18 bytes
Intentalo
fuente
PHP, 71 bytes
Ejecutar como tubería
-nR
o probarlo en línea .Produce una advertencia para algunas entradas en PHP 7.1 y posterior; reemplazar
-
con!=
para arreglar.Produce otra advertencia en PHP 7.2; poner
abcdef
comillas para arreglar.fuente