Contribution:
Un entier positif n qui est 1 <= n <= 25000
.
Production:
- Dans cette séquence, nous commençons par le nombre décimal 1 / n .
- Ensuite , nous prenons la somme des chiffres jusqu'à la n ième chiffre après la virgule ( commençant à 1); suivi de la somme des chiffres jusqu'au ( n -1) ème, puis ( n -2) ème, etc. Continuez jusqu'à ce que n soit 1.
- La sortie est la somme de tous ces éléments combinés.
Par exemple:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Règles du défi:
- Si la décimale de 1 / n n'a pas n chiffres après la virgule, ceux manquants seront comptés comme 0 (c'est-à-dire
1/2 = 0.50 => (5+0) + (5) = 10
). - Vous prenez les chiffres sans arrondir (c'est-à-dire que les chiffres de
1/6
sont166666
et non166667
)
Règles générales:
- Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si nécessaire.
1 - 50 premiers de la séquence:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
24990 - 25000 derniers dans la séquence:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Kevin Cruijssen
la source
la source
Réponses:
Gelée , 9 octets
Plutôt lent, mais court. Essayez-le en ligne! ou vérifiez les 50 premiers cas de test .
Comment ça fonctionne
la source
Mathematica, 42 octets
ou
ou
Explication
Prenez l'exemple de la spécification de défi. Nous voulons calculer:
Réarranger, c'est:
où
.
est le produit scalaire de deux vecteurs.C'est à peu près tout ce que fait la solution.
Cela nous donne les premiers
N
chiffres décimaux de1/N
(le#&@@
extrait le premier élément duRealDigits
résultat car cela renvoie également l'offset du premier chiffre qui nous importe peu).Ensuite, nous obtenons la liste de
N
bas en1
utilisant(#-Range@#+1)
ouRange[#,1,-1]
, qui sont tous deux plus courts queReverse@Range@#
, et prenons le produit scalaire.La solution alternative utilise
Accumulate
à la place pour calculer une liste de toutes les sommes de préfixe, puis additionne ces sommes de préfixe avecTr
.Étant donné que cela est vraiment rapide, même pour les grandes entrées, voici un nuage de points de la séquence jusqu'à
N = 100,000
( tout faire et les tracer a pris du temps cependant):Cliquez pour une version plus grande.
La ligne bleue est la limite supérieure naïve de
9 N (N+1) / 2
(si tous les chiffres décimaux étaient9
) et la ligne orange en est exactement la moitié. Sans surprise, c'est juste à l'intérieur de la branche principale de l'intrigue car, statistiquement, nous nous attendrions à ce que le chiffre moyen soit de 4,5.La fine ligne de points de tracé que vous pouvez voir sous la branche principale sont des fractions qui se terminent
...3333...
, car elles se trouvent toutes très près3 N (N+1) / 2
.la source
05AB1E ,
1211 octetsEssayez-le en ligne! ou une suite de tests pour les 50 premiers numéros.
Explication
Une version plus efficace pour essayer de grands nombres sur TIO
La différence par rapport à la version plus courte est que nous additionnons ici le produit des chiffres et l'inversion de leur index basé sur 1 au lieu de sommer les chiffres dans les préfixes.
Essayez-le en ligne!
la source
Java 8,
181169166 166153142 octetsExplication:
Essayez-le ici.
la source
PHP,
6665 octetsAdapté de cette réponse (également par moi): Division des nombres pas si petits et modification suggérée par Jörg Hülsermann. Utilisez comme:
edit: correction d'un bug pour +1 octet et repliement de l'affectation de $ a dans $ argv [1] pour -2 octets pour un net 1 octet de moins.
la source
Scala, 84 octets
Non golfé:
Explication:
Je pourrais économiser quelques octets en exploitant la façon dont le compilateur tokenise: En appelant l'argument
&
, vous pouvez écrire à la1 to&map
place de1 to n map
. La même règle s'applique àdef?
.la source
Gelée , 11 octets
TryItOnline
First 50
Trop lent pour les grands cas de test.
Comment?
la source
R⁵*
équivalent de gauche à droite, mais j'ai ensuite vu la belle ligne droite :)PHP, 76 octets
(Modifier -1 octet - Merci user59178 - votre solution est encore meilleure)
la source
$c=blah
dans la première partie dufor(;;)
MATL, 19 octets
Essayez-le en ligne!
Explication
la source
Groovy, 87 octets
Cela a été moins douloureux que prévu, et est basé sur ma réponse ici :
Explication
1.0g
- Utilisez la notation BigDecimal pour l'un..divide(n, n, 1)+""
- Divisez par n avec n précision (fonction BigDecimal uniquement) et convertissez en str.(...)[2..x+1].getChars()
- Récupère la sous-chaîne de l'itération courante sous forme de tableau de caractères..sum()-48*(x)
- Additionnez les valeurs ASCII des caractères et réduisez de 48 pour chaque élément. Cela transforme la valeur d'un chiffre ASCII en un entier économisant essentiellement des octets*.toInteger()
.(1..n).collect{...}.sum()
- Itérer sur chacun des chiffres de la division, en faisant cette fonction, les obtenir tous dans un seul tableau et additionner.Économie de 2 octets et efficacité sacrifiée ...
Il s'agit d'une version plus efficace qui ne recalcule pas le BigDecimal à chaque itération.
la source
J, 27 octets
Usage
L'entrée est un entier étendu.
Les performances sont bonnes et ne nécessitent qu'environ 3 secondes pour calculer les grands cas de test.
Explication
la source
Gelée , 10 octets
Pas l'approche la plus courte , mais assez efficace. Essayez-le en ligne!ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Python 2, 90 octets
Pas joli, mais fait à travers la division flottante puis la conversion en chaîne et ensuite la sélection itérative d'index de chaîne pour obtenir le triangle de nombres, puis effectuer la compréhension de la liste et convertir chaque caractère en entier et enfin les additionner tous.
la source
JavaScript (ES6), 47 octets
Comment ça fonctionne
Cette réponse illustre une technique pour calculer c chiffres décimaux de a / b :
Cela constituera un excellent point de départ pour ce défi. Tout d'abord, nous pouvons le modifier légèrement pour qu'il calcule b chiffres décimaux de 1 / b , en réorganisant les paramètres et en définissant les valeurs par défaut:
Ensuite, nous pouvons changer cela pour qu'il calcule la somme des b premiers chiffres décimaux, au lieu de les concaténer (cela supprime le
d
paramètre):Nous sommes presque à une solution; il suffit maintenant de multiplier chaque chiffre par c + 1 :
Hmm, cela semble un peu long. Et si on augmentait d'abord c de 1?
Cela économise un octet. Et voici un moyen d'en sauver un de plus:
Et maintenant, nous avons notre réponse.
f(7)
est 103,f(11)
est 270,f(1)
est ... 2? Oh, nous avons oublié de tenir compte du cas où a / b est 1 lors de la première itération (c.-à-d. B est 1). Faisons quelque chose à ce sujet:1 mod b est toujours 1 , sauf si b est 1 , auquel cas il sera égal à 0 . Notre programme est maintenant correct pour toutes les entrées, à 47 octets .
la source
Python 2, 49 octets
Testez-le sur Ideone .
la source
C, 53 octets
Ci-dessous le principal pour faire un test ...
la source
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
ne fait que 53 octets.