0. DÉFINITIONS
Une séquence est une liste de nombres.
Une série est la somme d'une liste de nombres.
L'ensemble des nombres naturels contient tous les «entiers non négatifs supérieurs à zéro».
Un diviseur (dans ce contexte) d'un nombre naturel j est un nombre naturel i , tel que j ÷ i est également un nombre naturel.
1. PRÉAMBULE
Quelques autres questions sur ce site mentionnent le concept de l'aliquote, ou la séquence de diviseurs d'un nombre naturel a qui sont inférieurs à a . La détermination des nombres amiables implique le calcul de la somme de ces diviseurs, appelée somme aliquote ou série aliquote. Chaque nombre naturel a sa propre somme aliquote, bien que la valeur de la somme aliquote d'un nombre ne soit pas nécessairement unique à ce nombre. ( Exempli gratia , chaque nombre premier a une somme aliquote de 1.)
2. DÉFI
Étant donné un nombre naturel n
, renvoyez le n
ième chiffre de la séquence de sommes aliquotes. Les premières séries de la séquence, en commençant par la série pour 1, sont:
{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}
Concaténés, ils ressemblent à:
0113161748116110915121122111413661613
L'entrée peut être indexée zéro ou un indexée, selon votre préférence. Les solutions doivent être des programmes ou des fonctions capables de renvoyer le 10 000e chiffre (entrée jusqu'à 9999
ou 10000
). La solution de travail la plus courte l'emporte.
3. CAS D'ESSAI
Les paires d'entrée-sortie correctes doivent inclure, mais sans s'y limiter, les éléments suivants:
0 or 1 -> 0
4 or 5 -> 1
12 or 13 -> 6
9999 or 10000 -> 7
Le nombre précédant le "ou" est indexé sur 0; le nombre suivant est indexé sur 1.
Des cas de test supplémentaires peuvent être fournis sur demande.
4. RÉFÉRENCES
OEIS a une liste de nombres et leurs sommes aliquotes.
Réponses:
05AB1E ,
141110 octetsCalculez n = 9999 en 15 secondes environ. Code:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
Mathematica, 51 octets
Une fonction sans nom qui prend et renvoie un entier et utilise une indexation basée sur 1. Gère l'entrée
10000
instantanément.Explication
Il s'agit d'une mise en œuvre très simple de la définition, utilisant le fait que les premières
n
sommes de diviseur sont toujours suffisantes pour déterminer len
e chiffre. Comme d'habitude, l'ordre de lecture de Mathematica au golf est un peu drôle cependant:Cela génère une liste avec tous les résultats de l'application de la fonction sans nom à gauche à toutes les valeurs
i
de1
àn
inclus.Nous commençons par calculer les diviseurs de
i
, en les additionnantTr
et en se soustrayanti
pour que ce soit juste la somme des diviseurs inférieure ài
.Cela transforme le résultat en une liste de ses chiffres décimaux.
Et cela supprime la tête "liste", de sorte que toutes les listes de chiffres sont automatiquement concaténées dans le résultat de
Array
. Pour plus de détails sur le##
fonctionnement, consultez la section "Séquences d'arguments" dans ce post .Enfin, nous sélectionnons le
n
e chiffre dans le résultat.la source
Brachylog , 40 octets
Ceci est indexé sur 1, prend environ 0,15 seconde pour
N = 100
, 15 secondes pourN = 1000
. Je cours actuellementN = 10000
, je signalerai le temps d'exécution une fois qu'il sera terminé (si mon estimation est correcte, cela devrait prendre environ 8 heures)Edit : en corrigeant la propagation prématurée des contraintes dans Brachylog, cela prend maintenant (sur un code plus long de 3 octets) environ
2.5
quelques minutes10000
mais renvoie uneout of global stack
erreur.Explication
Prédicat principal:
Input = N
Prédicat 1: calcule la somme des diviseurs
Prédicat 2: unifie la sortie avec un diviseur de l'entrée
la source
-G
option. La valeur par défaut est uniquement128M
. Vous pouvez utiliser par exemple:swipl -G2G
pour utiliser 2 GO.Pyth,
26212015 octetsEssayez-le en ligne. Suite de tests.
Utilise l'indexation basée sur 0. Le programme est O (n²) et se termine pour n = 9999 en environ 14 minutes sur ma machine 2008.
la source
f!%dTr1d
est beaucoup plus court (mais aussi plus lent)f!%TYtUT
c'est ce que j'avais.Gelée,
131110 octets2 octets grâce à @Adnan et 1 de plus grâce à @Dennis.
Essayez-le en ligne!
Utilise l'indexation basée sur 1. Se termine pour n = 10000 en moins de 2 secondes en ligne.
la source
ÆDṖSDµ€Fị@
enregistre un octet.€
à l'ensemble de la première chaîne?€
est appliqué àchain.pop() if chain else chains.pop()
. La chaîne nouvellement démarrée est vide, donc la dernière chaîne terminée est utilisée à la place.PHP, 90 octets
0 indexé
Absolument pas subtile ou avec une façon intelligente de l'aborder.
De plus, comme d'habitude, produit trois avis qui sont ignorés.
la source
J , 34 octets
Il est indexé sur zéro et utilise la formule ci-dessous pour calculer les sommes du diviseur.
Explication
la source
MATL ,
1615 octetsL'indexation est basée sur 1.
Le dernier cas de test expire dans le compilateur en ligne, mais il donne le résultat correct avec le compilateur hors ligne, dans environ 15 secondes.
Essayez-le en ligne!
la source
Haskell, 52 octets
Exemple d'utilisation:
(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12
->6
.C'est une implémentation directe de la définition: pour chaque
n
somme, il s'agit de diviseurs et convertissez-la en chaîne. Concatène toutes ces chaînes et sélectionne l'élément à l'index demandé. La paresse de Haskell ne prend que autant den
s de la liste infinie[1..]
que nécessaire.la source
Python 3.5,
1039392 octets:Implémentation assez simple de la méthode décrite dans l'article.
Essayez-le en ligne! (Ideone)
Ne se termine pas tout à fait dans les 5 secondes allouées dans le compilateur en ligne pour l'entrée
10000
, mais il se termine sur ma machine pour la même entrée dans environ 8,5 secondes.la source
Octave, 71 octets
Celui-ci est uniquement Octave. Cela ne fonctionnera pas dans MATLAB. Une fonction virtuelle est créée qui fonctionne sur des nombres indexés 1. Cela peut probablement être simplifié un peu plus. Va voir ce soir.
Vous pouvez essayer en ligne ici .
Exécutez simplement la commande ci-dessus, préfixée avec
a=
ou autre (juste pour que vous puissiez l'utiliser plusieurs fois), puis faitesa(10000)
ou quoi que ce soit. Il faut environ 7 secondes pour calculer que le 10000ème chiffre est un 7.la source
Java 8, 220 octets
Eh bien, c'est rapide au moins. Il faut en moyenne 0,3 seconde pour obtenir l'élément 9999 / 10000e sur ma machine. Il génère uniquement autant de sommes aliquotes que l'index que vous avez spécifié. Cela signifie que la chaîne sera légèrement plus longue que votre index dans la plupart des cas, car certaines sommes aliquotes ont 2 chiffres ou plus, mais pour la plupart, elles ne génèrent que la longueur d'une chaîne dont nous avons besoin.
Usage:
Non golfé:
la source