La raíz digital (también suma digital repetida) de un entero positivo es el valor (de un solo dígito) obtenido por un proceso iterativo de suma de dígitos, en cada iteración utilizando el resultado de la iteración anterior para calcular una suma de dígitos. El proceso continúa hasta que se alcanza un número de un solo dígito.
Por ejemplo, la raíz digital de 65536 es 7 , porque 6 + 5 + 5 + 3 + 6 = 25 y 2 + 5 = 7 .
Ordenar todas las raíces digitales no tiene mucho sentido, ya que solo comenzaría con infinitos 1 s.
En su lugar, crearemos listas de todos los enteros de un solo dígito junto con sus raíces digitales, luego todos los números de dos dígitos junto con sus raíces digitales, luego el triple, cuádruple, etc.
Ahora, para cada una de esas listas, lo ordenaremos de manera que todos los enteros con raíces digitales de 1 aparezcan primero, luego todos los enteros con raíces digitales de 2 y así sucesivamente. La clasificación será estable, de modo que la lista de enteros con ciertas raíces digitales debe estar en orden ascendente después de la clasificación.
Finalmente concatenaremos estas listas en una sola secuencia. Esta secuencia comenzará con todos los números de un solo dígito, luego todos los números de dos dígitos (ordenados por su raíz digital), luego todos los números de tres dígitos y así sucesivamente.
Reto:
Tome un entero positivo n como entrada y envíe el número n 'en la secuencia descrita anteriormente. Puede elegir si la lista tiene un índice 0 o un índice 1 .
La secuencia es así:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91, 11, 20, 29 ...
72, 81, 90, 99, 100, 109, 118, ...
981, 990, 999, 1000, 1009, 1018, 1027, ...
Casos de prueba:
Los casos de prueba están indexados en 1.
n f(n)
9 9
10 10
11 19
40 13
41 22
42 31
43 40
44 49
45 58
600 105
601 114
602 123
603 132
604 141
605 150
4050 1453
4051 1462
4052 1471
4053 1480
4054 1489
4055 1498
Más fácil de copiar:
n = 9, 10, 11, 40, 41, 42, 43, 44, 45, 600, 601, 602, 603, 604, 605, 4050, 4051, 4052, 4053, 4054, 4055,
f(n) = 9, 10, 19, 13, 22, 31, 40, 49, 58, 105, 114, 123, 132, 141, 150, 1453, 1462, 1471, 1480, 1489, 1498
Aclaraciones:
- Es posible que no muestre todos los n primeros elementos. Solo deberás generar el n 'th.
- El código debe funcionar teóricamente para todos los enteros hasta 10 ^ 9 , pero está bien si se agota el tiempo de espera en TIO (u otros intérpretes con restricciones de tiempo) para entradas mayores de 999 .
- Se alientan las explicaciones.
Es código golf , por lo que gana el código más corto en cada idioma. ¡No se desanime por otras soluciones en el idioma en el que desea jugar golf, incluso si son más cortas de lo que puede manejar!
Respuestas:
Python 2 ,
7860524645 bytes-6 bytes gracias a GB .
-1 byte gracias a Jakob .
Pruébalo en línea!
Finalmente llegó a una forma cerrada, 1 indexada.
Python 2 , 78 bytes
0 indexado.
Pruébalo en línea!
fuente
Python 3 , 80 bytes
Pruébalo en línea!
1 indexado. Esto es lo mejor que pude manejar en Python 3 (bueno, excepto por el byte 78 , que es un puerto de mi solución Python 2 a continuación; creo que este es mucho más genial, sin embargo). Los programas completos de Python 2 tienen la ventaja de este desafío en particular, porque
input()
necesita una conversiónint
en Python 3 (+5 bytes),exec
es una función, en lugar de una declaración (+2 bytes) y/
realiza la división de enteros por defecto si sus argumentos son enteros en Py 2 (+1 byte), por lo que esto es definitivamente más corto que portar la respuesta de ovs .Cómo funciona
Preparar
Esto define una función recursiva f que toma un argumento entero iy otro, k , que por defecto es 1 . Mientras k ≤ i , la función f devuelve f (i, 10k) , multiplicando k por 10 cada vez hasta que sea mayor que i .
Rango objetivo e indexación correcta
Después de este conjunto de operaciones, nos quedamos con i , la entrada inicial y la variable k que representa la potencia más pequeña de 10 mayor que i . De esta manera, podemos generar el rango (entero) [floor (k / 10), k) , que básicamente incluye todos los enteros que son:
Como ignoramos los enteros menores que x = piso (k / 10) , debemos cambiar la indexación para tener en cuenta los números que faltan. La forma obvia es restar su recuento, x , de i , de modo que indexemos en la lista (después de la clasificación, que se describe a continuación), por lo tanto, tenemos ix . Sin embargo, ya que la lista contiene 9k / 10 , los artículos, y la indexación en una lista en el índice -y para algunos positivos y produce el y ésimo elemento del extremo en Python, esto es simplemente equivalente a la indexación con ik , por lo tanto, el ahorro de 4 bytes.
Ordenar cada fragmento por la raíz digital
La fórmula para la función raíz digital es 1 + ((n-1) mod 9) (consulte la sección Fórmula de congruencia de este artículo de Wikipedia ). Como 1 se agregaría de esta manera a cada uno de ellos, es superfluo al ordenar, por lo que nos quedamos con (n-1) mod 9 . La forma en
%
que funciona el operador de Python cuando se le dan números negativos en el RHS es muy conveniente, porque podemos usar n pymod -9 en su lugar para guardar aún otro byte anterior.Python 2 , 72 bytes
Inspirado por la presentación de Chas Brown .
Pruébalo en línea!
fuente
Pitón 2 ,
737170 bytesPruébalo en línea!
2 bytes thx a Sr. XCoder ; y 1 byte gracias a H.PWiz .
Esto está indexado a 0.
fuente
i%9
debería ser suficiente en lugar dei%9+1
... de esta manera superaste mi 72 byter: DD:len(`~i`)
debería funcionarJalea ,
15 14 109 bytesPruébalo en línea!
¿Cómo?
Utiliza una versión de golf de la solución de forma cerrada creada por ovs en su respuesta de Python ...
La fórmula expuesta por los ovs es: 9 * (n% b) + (n / b) + b - 1 donde b = 10 floor (log (n, 10))
Ahora, si c es el recuento de dígitos decimales de n, entonces b-1 es c-1 nueves en decimal.
Esto es lo mismo que nueve veces el valor de c-1 en decimal (por ejemplo
111*9=999
).Además n / b es el principal dígitos de n y n% b es el resto de los dígitos como un número decimal.
Una fórmula como b * x + y puede implementarse como una conversión de la
[x,y]
base b(es decir, b ^ 1 * x + b ^ 0 * y = b * x + y )
Como tal, podemos tomar un número, n (por ejemplo
7045
), dividirlo en los dígitos iniciales y finales, colocando el dígito inicial al final ([[0,4,5],7]
), agregar uno a todos los dígitos del primer elemento para atender la adición de b-1 ([[1,5,6],7]
) convierte esto de listas decimales a enteros ([156,7]
), y lo convierte de base nueve (1411
).En la implementación a continuación, agregamos uno a todos los dígitos de ambos elementos cuando abastecemos a b-1 (
[[0,4,5],8]
), convertimos de listas decimales a enteros ([156,8]
), convertimos de base nueve (1412
) y luego restamos el que este proceso agregó (1411
).Anterior, 14 byter:
Pruébalo en línea!
Éste construye la lista hasta la siguiente potencia de 10 por encima de la entrada al ordenar estos números naturales para
[digitalRoot, digitCount]
luego encontrar el valor en el índice ingresado.fuente
Haskell ,
9488 bytesPruébalo en línea! 0 indexado.
Explicación:
La comprensión de la lista genera la secuencia como una lista infinita en la que indexamos con
!!
:x
es uno menos que el número actual de dígitos y se extrae de la lista infinita[0,1,2,3, ...]
i
itera sobre el rango de1
a9
y se usa para ordenar por las raíces digitalesn
itera sobre todos los números conx+1
dígitosuntil(<10)(sum.map(read.pure).show)
calcula la raíz digital ( vea aquí una explicación )n
se agrega a la lista si su raíz digital es iguali
.fuente
Retina , 65 bytes
Pruébalo en línea! 1 indexado. Explicación:
Construya una lista de líneas de
_
s desde 0 hasta la próxima potencia de 10 (exclusivo).Ordénelos todos en orden de raíz digital.
Convierte de unario a decimal.
Ordénelos en orden de longitud.
Extrae el
n
elemento th.fuente
Pyth ,
36 31 25 24 2322 bytes1 indexado.
¡Banco de pruebas!
Cómo funciona (anticuado)
fuente
05AB1E ,
1911 bytesPuerto de mi respuesta de Python .
-6 bytes (!) Gracias a Kevin Cruijssen .
Pruébalo en línea!
fuente
g<°©÷¹®%9*®O<
. Aquí la explicación que estaba a punto de publicar .Pyth , 23 bytes
Pruébalo aquí
-3 gracias a Sr. Xcoder
1 indexado.
fuente
Perl 6 ,
6858 bytesPruébelo basado en 0
Pruébalo basado 1
Expandido:
fuente
Ruby ,
4338 bytesPruébalo en línea!
Originalmente un puerto de la excelente respuesta de Python por ovs, luego simplificó un poco más.
fuente
Java 8, 68 bytes
Aburrido puerto de la respuesta Python 2 de @ovs , ¡así que asegúrate de votarlo!
-1 byte gracias a @Jakob
Pruébalo en línea.
fuente
K4 , 38 bytes
Solución:
Ejemplos:
Explicación:
La solución del puerto de Jonathan Allan cuando me quedo sin memoria construyendo las raíces digitales de 1 a 1e9.
Prima:
La traducción de la solución de ovs es más simple pero más larga:
fuente
Jalea , 19 bytes
Pruébalo en línea!
-1 gracias a Sr. Xcoder .
1 indexado.
fuente
J, 24 bytes
Esta expresión tácita está envuelta en parens para indicar que debe tratarse por sí misma en lugar de como parte de cualquier expresión siguiente (como los argumentos).
La frase '] /:' ordena (ascendente '/:') la matriz original ']' por la suma '+ /' de los dígitos La expresión
convierte un número en un vector de caracteres con '":', luego aplica su inverso '".' - carácter a número: aplicado a cada elemento '&>'. Entonces, 65536 -> '65536' -> 6 5 5 3 6.
La conjunción de potencia '^:' cerca del final de la expresión aplica el código que acabamos de explicar (a la izquierda) un número específico de veces. En este caso, el número especificado de veces es infinito '_', lo que significa seguir aplicando hasta que el resultado deje de cambiar.
El '' 0 'final significa aplicar la expresión completa a la izquierda a cada elemento escalar (0-dimensional) a la derecha, que sería la matriz de números a los que queremos aplicar esto.
fuente
Elixir , 239 bytes
Pruébalo en línea!
Explicación entrante (lentamente)! No creo que pueda ser mucho más corto que esto, pero siempre estoy abierto a sugerencias
fuente
Perl 5
-pF
, 27 bytesPruébalo en línea!
Utiliza la fórmula de @ ovs y las explicaciones de @ JonathanAllen para obtener un código compacto y agradable.
fuente