0. DEFINICIONES
Una secuencia es una lista de números.
Una serie es la suma de una lista de números.
El conjunto de números naturales contiene todos los "enteros no negativos mayores que cero".
Un divisor (en este contexto) de un número natural j es un número natural i , de modo que j ÷ i también es un número natural.
1. PREÁMBULO
Un par de otras preguntas en este sitio mencionan el concepto de la parte alícuota, o la secuencia de divisores de un número natural a que son menores que a . Determinar números amistosos implica calcular la suma de estos divisores, llamada suma alícuota o serie alícuota. Cada número natural tiene su propia suma alícuota, aunque el valor de la suma alícuota de un número no es necesariamente exclusivo de ese número. ( Exempli gratia , cada número primo tiene una suma alícuota de 1.)
2. DESAFÍO
Dado un número natural n
, devuelve el n
dígito th de la secuencia de sumas alícuotas. Las primeras series de la secuencia, comenzando con la serie para 1, son:
{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}
Concatenados, estos se ven así:
0113161748116110915121122111413661613
La entrada puede estar indexada a cero o indexada, según su preferencia. Las soluciones deben ser programas o funciones capaces de devolver el dígito 10.000 (entrada hasta 9999
o 10000
). La solución de trabajo más corta gana.
3. CASOS DE PRUEBA
Los pares de entrada-salida correctos deben incluir, entre otros, los siguientes:
0 or 1 -> 0
4 or 5 -> 1
12 or 13 -> 6
9999 or 10000 -> 7
El número que precede a "o" está indexado en 0; el siguiente número es 1 indexado.
Se pueden proporcionar casos de prueba adicionales a pedido.
4. REFERENCIAS
OEIS tiene una lista de números y sus sumas alícuotas.
Respuestas:
05AB1E ,
141110 bytesCalcule n = 9999 en aproximadamente 15 segundos. Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
Mathematica, 51 bytes
Una función sin nombre que toma y devuelve un entero y usa indexación basada en 1. Maneja la entrada al
10000
instante.Explicación
Esta es una implementación muy directa de la definición, haciendo uso del hecho de que las
n
sumas del primer divisor siempre son suficientes para determinar eln
dígito th. Como de costumbre, el orden de lectura de Mathematica golf es un poco divertido:Esto genera una lista con todos los resultados de aplicar la función sin nombre a la izquierda a todos los valores
i
desde1
hastan
inclusive.Comenzamos calculando los divisores de
i
, sumandoTr
y restandoi
para que sea solo la suma de divisores menor quei
.Esto convierte el resultado en una lista de sus dígitos decimales.
Y esto elimina el encabezado de "lista", de modo que todas las listas de dígitos se concatenan automáticamente en el resultado de
Array
. Para obtener más detalles sobre cómo##
funciona, consulte la sección "Secuencias de argumentos" en esta publicación .Finalmente, seleccionamos el
n
dígito th del resultado.fuente
Brachylog , 40 bytes
Esto está indexado en 1, toma alrededor de 0,15 segundos para
N = 100
, 15 segundos paraN = 1000
. Actualmente me estoy postulandoN = 10000
, informaré el tiempo de ejecución una vez que finalice (si mi estimación es correcta, debería tomar alrededor de 8 horas)Editar : arreglando la propagación de restricciones prematuras en Brachylog, ahora (en un código de 3 bytes más largo) tarda unos
2.5
minutos10000
pero devuelve unout of global stack
error.Explicación
Predicado principal:
Input = N
Predicado 1: calcula la suma de los divisores
Predicado 2: unifica la salida con un divisor de la entrada
fuente
-G
opción. El valor predeterminado es solo128M
. Puede usar, por ejemplo:swipl -G2G
para usar 2 GO.Pyth,
26212015 bytesPruébalo en línea. Banco de pruebas.
Utiliza indexación basada en 0. El programa es O (n²) y se completa para n = 9999 en aproximadamente 14 minutos en mi máquina 2008.
fuente
f!%dTr1d
es mucho más corto (pero también más lento)f!%TYtUT
es lo que solía tenerJalea,
131110 bytes2 bytes gracias a @Adnan y 1 más gracias a @Dennis.
Pruébalo en línea!
Utiliza indexación basada en 1. Completa para n = 10000 en menos de 2 segundos en línea.
fuente
ÆDṖSDµ€Fị@
Guarda un byte.€
a toda la primera cadena?€
se aplica achain.pop() if chain else chains.pop()
. La cadena recién iniciada está vacía, por lo que se utiliza la última cadena terminada.PHP, 90 bytes
0 indexado
Absolutamente no sutil o con una forma inteligente de abordarlo.
Además, como de costumbre, produce tres avisos que se ignoran.
fuente
J , 34 bytes
Esto está indexado a cero y utiliza la siguiente fórmula para calcular las sumas de divisores.
Explicación
fuente
MATL ,
1615 bytesLa indexación se basa en 1.
El último caso de prueba expira en el compilador en línea, pero da el resultado correcto con el compilador fuera de línea, en aproximadamente 15 segundos.
Pruébalo en línea!
fuente
Haskell, 52 bytes
Ejemplo de uso:
(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12
->6
.Es una implementación directa de la definición: foreach
n
suma sus divisores y los convierte en una cadena. Concatene todas esas cadenas y elija el elemento en el índice solicitado. La holgazanería de Haskell solo toma tantosn
s de la lista infinita[1..]
como sea necesario.fuente
Python 3.5,
1039392 bytes:Implementación bastante sencilla del método descrito en la publicación.
¡Pruébelo en línea! (Ideone)
No termina dentro de los 5 segundos asignados en el compilador en línea para la entrada
10000
, pero termina en mi máquina para la misma entrada en aproximadamente 8,5 segundos.fuente
Octava, 71 bytes
Este es solo Octave. No funcionará en MATLAB. Se crea una función virtual que funciona en números indexados 1. Probablemente se pueda simplificar un poco más. Echaré un vistazo esta noche.
Puedes probar en línea aquí .
Simplemente ejecute el comando anterior, con el prefijo
a=
o lo que sea (solo para que pueda usarlo varias veces), y luego hagaa(10000)
o lo que sea. Se tarda unos 7 segundos en calcular que el dígito 10000 es un 7.fuente
Java 8, 220 bytes
Bueno, al menos es rápido. El promedio de 0.3 segundos para obtener el elemento 9999/10000 en mi máquina. Solo genera tantas sumas de alícuotas como el índice que especificó. Esto significa que la cadena será un poco más larga que su índice en la mayoría de los casos, ya que algunas sumas de alícuotas tienen 2 o más dígitos, pero en su mayor parte, solo genera una cadena tan larga como la que necesitamos.
Uso:
Sin golf:
fuente