Vamos a crear un sistema de números donde el dígito más grande en el enésimo valor posicional (contando de derecha a izquierda) de una longitud de número m siempre es igual a m - n + 1. Para dar un ejemplo, el número más grande de 5 dígitos expresable en este sistema está escrito 12345. Además del número de dígitos disponibles para ser usados en un lugar particular que está restringido, todos los demás incrementos son estándar. Es decir, cuando un dígito debe superar su límite de dígitos, agregamos uno al siguiente dígito.
Así es como se representaría el conteo en este sistema:
1; 10; 11; 12; 100; 101; 102; 103; 110; 111; 112; 113; 120; 121; 122; 123; 1000; 1001 ...
Su tarea es escribir una función que tome un número base 10 estándar y lo convierta a mi sistema de numeración.
El código más corto es preferible. Bonne Chance!
** Si necesita dígitos después del 9 (debería), puede optar por usar letras, o puede devolver un número de 2 dígitos como elemento de una lista.
Casos de prueba
10 -> 111
20 -> 1003
30 -> 1023
50 -> 1123
100 -> 10035
23116 -> 1234567
21977356 -> 123456789A
El último caso puede ser increíblemente lento para ejecutarse dependiendo de cómo lo implementó. No necesita ejecutarlo si tarda demasiado o usa demasiada memoria. Sin embargo, tenga en cuenta que existen formas de ejecutarlo rápidamente y con poca memoria.
fuente
100 -> 10035
lugar de100 -> 10033
, ¿puedes verificar?Respuestas:
Mathematica, 64 bytes
Función sin nombre que toma un argumento entero positivo y devuelve una lista de enteros.
Join[{{1}},Array[Range,#-1,3]-1]
devuelve la lista anidada{ {1}, {0,1,2}, {0,1,2,3}, ..., {0,1,...,#} }
. LuegoTuples
devuelve el conjunto (ordenado) de todas las tuplas en cuyo primer elemento se encuentra{1}
, en cuyo segundo elemento se encuentra{0,1,2}
, y así sucesivamente; Estos son los#
números de dígitos en este sistema de numeración.Join@@Array[...,#]
devuelve una matriz de todos los números en este sistema de numeración con, como máximo#
, dígitos, yPart[...,#]
extrae el#
número.¡Esto es irremediablemente lento! Funciona bien para la entrada de hasta 9. Para una entrada más grande, pruébela reemplazando el final
,#],#]&
con,Ceiling[0.9Log[#]]],#]&
; Esto pone un límite más realista en la cantidad de dígitos necesarios para llegar lo suficientemente lejos en el sistema de numeración como para encontrar el que queremos.fuente
Mathematica, 93 bytes
Función pura con primer argumento
#
. Si se proporciona un entero no negativo, generará la lista correcta de dígitos (¡incluso se maneja0
correctamente!).Explicación
Nest[f,expr,n]
da el resultado de aplicarf
aexpr
n
tiempos. En este caso,expr
es la lista{0}
yn
es el entero de entrada#
. La funciónf
es complicada:fuente
y___,z_:0
para aumentar la longitud de la lista!Perl 6 , 38 bytes
Toma un entero positivo y genera una lista de enteros que representan los dígitos.
Explicación:
fuente
Pyth - 14 bytes
Simplemente devuelve el
nth
valor que se ajusta al "patrón de valor de posición menor".Test Suite .
fuente
2018967
, donde el último dígito es igual a 10?Haskell, 65 bytes
i
aumenta los números en el sistema numérico con los dígitos en orden inverso.iterate
crea la lista infinita de todos estos números comenzando con cero, que se representa con[]
. Entonces todo lo que queda por hacer es tomar (!!
) el número solicitado yreverse
eso.La última línea es una función, no una definición de función, por lo que no puede aparecer como está en un archivo de código fuente. En su lugar, solo coloque las otras líneas en el código fuente y use la última línea en el intérprete (o vincule la función a un nombre precediendo
f=
a la última línea).Ejemplo de uso:
(Se podrían guardar 8 bytes si
[5,3,0,0,1]
fuera una representación permitida del resultado).fuente
Haskell, 49 bytes
La primera línea es una definición auxiliar, y la segunda se evalúa como una función. Toma un entero y devuelve una lista de enteros. Pruébalo en línea!
Explicación
Lo defino
x
como la lista infinita de representaciones mencionadas en el texto del desafío; la función principal simplemente disminuye su argumento e indexa enx
. La primera línea funciona así:Verá que
x
se define en términos de sí mismo, pero Haskell es vago, por lo que esto no es un problema.fuente