La racine numérique (également la somme numérique répétée) d'un entier positif est la valeur (à un chiffre) obtenue par un processus itératif de sommation de chiffres, à chaque itération en utilisant le résultat de l'itération précédente pour calculer une somme de chiffres. Le processus se poursuit jusqu'à ce qu'un nombre à un chiffre soit atteint.
Par exemple, la racine numérique de 65536 est 7 , car 6 + 5 + 5 + 3 + 6 = 25 et 2 + 5 = 7 .
Le tri de toutes les racines numériques n'a pas beaucoup de sens, car il ne ferait que commencer par une infinité de 1 s.
Au lieu de cela, nous allons créer des listes de tous les entiers à un chiffre avec leurs racines numériques, puis tous les nombres à deux chiffres avec leurs racines numériques, puis le triple, le quadruple et ainsi de suite.
Maintenant, pour chacune de ces listes, nous allons le trier de sorte que tous les entiers avec des racines numériques de 1 apparaissent en premier, puis tous les entiers avec des racines numériques de 2 et ainsi de suite. Le tri sera stable, de sorte que la liste des entiers avec certaines racines numériques devrait être dans l'ordre croissant après le tri.
Enfin, nous allons concaténer ces listes en une seule séquence. Cette séquence commencera avec tous les numéros à un chiffre, puis tous les numéros à deux chiffres (triés par leur racine numérique), puis tous les numéros à trois chiffres et ainsi de suite.
Défi:
Prendre un positif entier n en entrée, et la sortie du n -ième nombre dans la séquence décrite ci - dessus. Vous pouvez choisir si la liste est indexée sur 0 ou indexée sur 1 .
La séquence se déroule comme suit:
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, ...
Cas de test:
Les cas de test sont indexés 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
Plus facile à copier:
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
Précisions:
- Vous ne pouvez pas afficher tous les n premiers éléments. Tu ne la sortie n « e.
- Le code doit théoriquement fonctionner pour tous les entiers jusqu'à 10 ^ 9 , mais c'est OK s'il expire sur TIO (ou d'autres interprètes avec des restrictions de temps) pour des entrées supérieures à 999 .
- Des explications sont encouragées.
C'est le code-golf , donc le code le plus court dans chaque langue gagne! Ne soyez pas découragé par d'autres solutions dans la langue dans laquelle vous voulez jouer au golf, même si elles sont plus courtes que ce que vous pouvez gérer!
Réponses:
Python 2 ,
7860524645 octets-6 octets grâce à GB .
-1 octet merci à Jakob .
Essayez-le en ligne!
Enfin atteint une forme fermée, 1-indexée.
Python 2 , 78 octets
0 indexé.
Essayez-le en ligne!
la source
Python 3 , 80 octets
Essayez-le en ligne!
1 indexé. C'est le meilleur que j'ai pu gérer en Python 3 (enfin, à l'exception du 78 octets , qui est un port de ma solution Python 2 ci-dessous; je pense que celui-ci est beaucoup plus cool, cependant). Les programmes complets Python 2 sont avantagés pour ce défi particulier, car
input()
nécessite une conversionint
en Python 3 (+5 octets),exec
est une fonction plutôt qu'une instruction (+2 octets) et/
effectue une division entière par défaut si ses arguments sont des entiers dans Py 2 (+1 octet), donc c'est certainement plus court que le portage de la réponse des ovs .Comment ça marche
Installer
Ceci définit une fonction récursive f qui prend un argument entier i et un autre, k , par défaut à 1 . Alors que k ≤ i , la fonction f renvoie f (i, 10k) , multipliant k par 10 à chaque fois jusqu'à ce qu'elle devienne supérieure à i .
Plage cible et indexation correcte
Après cet ensemble d'opérations, on se retrouve avec i , l'entrée initiale et la variable k qui représente la plus petite puissance de 10 supérieure à i . De cette façon, nous pouvons générer la plage (entière) [floor (k / 10), k) , qui comprend essentiellement tous les entiers qui sont:
Puisque nous ne tenons pas compte des entiers inférieurs à x = plancher (k / 10) , nous devons décaler l'indexation pour tenir compte des nombres manquants. La façon la plus évidente est de soustraire leur nombre, x , de i , de sorte que nous indexions dans la liste (après le tri, qui est décrit ci-dessous), ayant donc ix . Cependant, étant donné que la liste contient 9k / 10 , les éléments et l' indexation dans une liste à l' index -y pour certaines positives y donne le y ième élément de la fin en Python, cela est tout simplement équivalent à l' indexation avec ik , d'où un gain de 4 octets.
Tri de chaque morceau par la racine numérique
La formule de la fonction racine numérique est 1 + ((n-1) mod 9) (voir la section Formule de congruence de cet article Wikipedia ). Comme 1 serait ainsi ajouté à chacun d'eux, il est superflu lors du tri, nous nous retrouvons donc avec (n-1) mod 9 . La façon dont l'
%
opérateur de Python fonctionne avec des nombres négatifs sur le RHS est très pratique, car nous pouvons utiliser n pymod -9 à la place pour enregistrer encore un octet d'anthère.Python 2 , 72 octets
Inspiré par la soumission de Chas Brown .
Essayez-le en ligne!
la source
Python 2 ,
737170 octetsEssayez-le en ligne!
2 octets de thx à M. XCoder ; et 1 octet thx à H.PWiz .
Ceci est indexé 0.
la source
i%9
devrait suffire au lieu dei%9+1
... de cette façon, vous battez mon 72 octets: DD:len(`~i`)
devrait fonctionnerGelée ,
15 14 109 octetsEssayez-le en ligne!
Comment?
Utilise une version golfée de la solution de forme fermée créée par les ovs dans leur réponse Python ...
La formule exposée par ovs est: 9 * (n% b) + (n / b) + b - 1 où b = 10 étage (log (n, 10))
Maintenant, si c est le nombre de chiffres décimaux de n, alors b-1 est c-1 neuf en décimal.
C'est la même chose que neuf fois la valeur de c-1 en décimal (par exemple
111*9=999
).De plus, n / b est le premier chiffre de n et n% b est le reste des chiffres sous forme de nombre décimal.
Une formule comme b * x + y peut être implémentée comme une conversion de la
[x,y]
base b(c'est-à-dire b ^ 1 * x + b ^ 0 * y = b * x + y )
En tant que tel, nous pouvons prendre un nombre, n (par exemple
7045
), le diviser en[[0,4,5],7]
chiffres de début et de fin, en plaçant le chiffre de tête à la fin ( ), ajouter un à tous les chiffres du premier élément pour répondre à l'ajout de b-1 ([[1,5,6],7]
) les convertit des listes décimales en entiers ([156,7]
), et les convertit en base neuf (1411
).Dans l'implémentation ci-dessous, nous ajoutons un à tous les chiffres des deux éléments lors de la restauration de b-1 (
[[0,4,5],8]
), convertissons des listes décimales en nombres entiers ([156,8]
), convertissons de la base neuf (1412
), puis soustrayons celui ajouté par ce processus (1411
).Précédent, 14 octets:
Essayez-le en ligne!
Celui-ci construit la liste jusqu'à la puissance suivante de 10 au-dessus de l'entrée en triant ces nombres naturels
[digitalRoot, digitCount]
puis trouve la valeur à l'index entré.la source
Haskell ,
9488 octetsEssayez-le en ligne! 0 indexé.
Explication:
La compréhension de la liste génère la séquence sous forme de liste infinie dans laquelle nous indexons avec
!!
:x
est un de moins que le nombre actuel de chiffres et est tiré de la liste infinie[0,1,2,3, ...]
i
itère sur la plage de1
à9
et est utilisé pour le tri par les racines numériquesn
itère sur tous les nombres avec desx+1
chiffresuntil(<10)(sum.map(read.pure).show)
calcule la racine numérique ( voir ici pour une explication )n
est ajouté à la liste si sa racine numérique est égale ài
.la source
Rétine , 65 octets
Essayez-le en ligne! 1 indexé. Explication:
Construisez une liste de lignes de
_
s de 0 jusqu'à la prochaine puissance de 10 (exclusif).Triez-les tous par ordre de racine numérique.
Convertissez de unaire en décimal.
Triez-les par ordre de longueur.
Extraire le
n
e élément.la source
Pyth ,
36 31 25 24 2322 octets1 indexé.
Suite de tests!
Comment ça marche (obsolète)
la source
05AB1E ,
1911 octetsPort de ma réponse Python .
-6 octets (!) Grâce à Kevin Cruijssen .
Essayez-le en ligne!
la source
g<°©÷¹®%9*®O<
. Voici l' explication que j'allais poster pour cela .Pyth , 23 octets
Essayez-le ici.
-3 grâce à M. Xcoder
1 indexé.
la source
Perl 6 ,
6858 octetsTestez -le sur la base de 0
Testez-le 1
Étendu:
la source
Rubis ,
4338 octetsEssayez-le en ligne!
Initialement, un port de l'excellente réponse Python par ovs, puis simplifié un peu plus.
la source
Java 8, 68 octets
Port ennuyeux de la réponse Python 2 de @ovs , alors assurez-vous de lui donner un vote positif!
-1 octet grâce à @Jakob
Essayez-le en ligne.
la source
K4 , 38 octets
Solution:
Exemples:
Explication:
Port de la solution de Jonathan Allan alors que je manque de mémoire pour construire les racines numériques de 1 à 1e9.
Prime:
La traduction de la solution ovs est plus simple mais plus longue:
la source
Gelée , 19 octets
Essayez-le en ligne!
-1 grâce à M. Xcoder .
1 indexé.
la source
J, 24 octets
Cette expression tacite est entourée de parens pour signifier qu'elle doit être traitée seule plutôt que comme faisant partie d'une expression suivante (comme les arguments).
L'expression '] /:' ordonne (ascendant '/:') le tableau d'origine ']' par la somme '+ /' des chiffres L'expression
convertit un nombre en un vecteur de caractères avec '":', puis applique son inverse '".' - caractère à numéro - appliqué à chaque élément '&>'. Donc, 65536 -> '65536' -> 6 5 5 3 6.
La conjonction de puissance '^:' vers la fin de l'expression applique le code que nous venons d'expliquer (à gauche) un nombre spécifié de fois. Dans ce cas, le nombre spécifié de fois est l'infini «_», ce qui signifie de continuer à appliquer jusqu'à ce que le résultat cesse de changer.
Le dernier «0» signifie appliquer l'expression entière à gauche à chaque élément scalaire (0 dimensionnel) à droite, qui serait le tableau de nombres auquel nous voulons l'appliquer.
la source
Elixir , 239 octets
Essayez-le en ligne!
Explication entrante (lentement)! Je ne pense pas que cela puisse être beaucoup plus court que cela, mais je suis toujours ouvert aux suggestions
la source
Perl 5
-pF
, 27 octetsEssayez-le en ligne!
Utilise la formule de @ ovs et les explications de @ JonathanAllen pour trouver un joli morceau de code compact.
la source