Le défi consiste à calculer la somme des chiffres de la factorielle d'un nombre.
Exemple
Input: 10
Output: 27
dix! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, et la somme des chiffres du nombre 10! est 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Vous pouvez vous attendre à ce que l'entrée soit un entier supérieur à 0. La sortie peut être de n'importe quel type, mais la réponse doit être dans la base standard du langage de codage.
Cas de test:
10 27
19 45
469 4140
985 10053
NB Certaines langues ne prennent pas en charge les grands nombres supérieurs à des entiers 32 bits; pour ces langues, vous ne devrez pas calculer de grandes factorielles.
Lien OEIS ici grâce à Martin Ender
C'est le code-golf , donc le code le plus court en caractères gagne!
code-golf
math
arithmetic
factorial
George
la source
la source
n>21
Réponses:
05AB1E , 3 octets
Essayez-le en ligne!
la source
Gelée , 3 octets
Essayez-le en ligne!
Fait ce que vous attendez:
la source
Mathematica, 21 octets
la source
[#!]
et non@#!
? (Mathematica noob)@
a une priorité plus élevée que!
.C ++ 11, 58 octets
Comme lambda sans nom modifiant son entrée:
L' un des rares cas où mon code C ++ est plus court que le code C .
Si vous souhaitez prendre en charge des cas plus volumineux, passez en C ++ 14 et utilisez:
et fournissez l'argument appelant avec le
ull
suffixe.Usage:
la source
Rubis,
63615338 octetsNouvelle approche grâce au manatwork:
Vieux:
la source
eval
chemin:->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pyth,
76 octetsMerci à @Kade de m'avoir sauvé un octet
sj.!QT
Essayez-le en ligne!
C'est la première fois que j'utilise Pyth, donc je suis sûr que ma réponse pourrait être assez jouée.
Explication:
la source
10
est assigné à une variableT
, vous pouvez donc le fairesj.!QT
:)ssM`.!
fait le travail aussi, également en 6 octets.Haskell,
4140 octetsExemple d'utilisation:
f 985
->10053
.Faites une liste de
1
àx
, calculez le produit des éléments de la liste, transformez-le en sa représentation sous forme de chaîne, transformez chaque caractère en nombre et additionnez-les.Modifier: @Angs a enregistré un octet. Merci!
la source
f x=sum$read.pure<$>(show$product[1..x])
enregistre un octetPython, 54 octets
repl.it
la source
R,
5853 octetsEdit: Enregistré un octet grâce à @Jonathan Carroll et un couple grâce à @Micky T
Malheureusement, avec des entiers 32 bits, cela ne fonctionne que pour
n < 22
. Prend les entrées de stdin et les sorties vers stdout.Si l'on souhaite une précision de niveau supérieure, il faudrait utiliser une bibliothèque externe telle que
Rmpfr
:la source
c(x,"")
vspaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Force le résultat factoriel au caractère et lestrsplit
renvoie comme une deuxième liste, doncel
fonctionne toujours et extrait les premiers éléments de la liste.prod(1:scan())
?as.double
devrait également suffirestrtoi
fonctionne comme un remplacement plus courtas.double
, je pense.Pip , 8 octets
Essayez-le en ligne!
Explication
la source
CJam , 8 octets
Essayez-le en ligne!
Explication
la source
Brachylog , 5 octets
Essayez-le en ligne!
Explication
Fondamentalement, l'algorithme décrit:
la source
Java 7, 148 octets
la source
Rubis,
63 60 5351 octetsMerci à Martin pour son aide au golf.
la source
Pushy , 4 octets
Donnez entrée sur la ligne de commande:
$ pushy facsum.pshy 5
. Voici la ventilation:la source
Octave, 30 octets
Calcule la factorielle en prenant le produit de la liste
[1 2 ... n]
. Le convertit en chaîne et soustrait48
de tous les éléments (code ASCII pour0
). Enfin ça résume :)la source
bash (seq, bc, fold, jq),
3433 octetsSûrement pas le plus élégant mais pour le défi
la source
fold -1
enregistre un octet.C, 58 octets
Ce n'est pas parfait. Fonctionne uniquement car un doit être -1 au début. L'idée est d'utiliser deux fonctions récursives dans une seule fonction. Ce n'était pas aussi facile que je le pensais.
Utilisation et format compréhensible:
Edit: j'ai trouvé un métode qui permettait d'utiliser cette fonction plusieurs fois mais la longueur était de 62 octets.
la source
Perl 6 , 21 octets
Étendu:
la source
Cubix,
3332 octetsForme nette:
Essayez-le en ligne!
Remarques
Infinity
nombre (techniquement parlant, c'est une propriété non inscriptible, non énumérable et non configurable de l'objet fenêtre).Explication
Ce programme se compose de deux boucles. Le premier calcule la factorielle de l'entrée, l'autre divise le résultat en ses chiffres et les additionne. Ensuite, la somme est imprimée et le programme se termine.
Début
Tout d'abord, nous devons préparer la pile. Pour cette partie, nous utilisons les trois premières instructions. L'IP commence sur la quatrième ligne, pointant vers l'est. La pile est vide.
Nous conserverons la somme tout en bas de la pile, nous devons donc commencer par
0
être la somme en la stockant au bas de la pile. Ensuite, nous devons appuyer sur a1
, car l'entrée sera initialement multipliée par le nombre précédent. Si c'était zéro, la factorielle donnerait toujours aussi zéro. Enfin, nous lisons l'entrée comme un entier.Maintenant, la pile est
[0, 1, input]
et l'IP est à la quatrième ligne, la quatrième colonne, pointant vers l'est.Boucle factorielle
Il s'agit d'une simple boucle qui multiplie les deux premiers éléments de la pile (le résultat de la boucle précédente et de l'entrée - n, puis décrémente l'entrée. Elle se rompt lorsque l'entrée atteint 0. L'
$
instruction fait que l'IP saute leu
- La boucle est la partie suivante du cube. L'IP commence à la quatrième ligne, quatrième colonne.En raison du
^
caractère, l'IP commence immédiatement à se déplacer vers le nord. Ensuite, leu
tourne autour de l'IP et le déplace vers la droite. En bas, il y a une autre flèche:<
pointe l'IP dans le^
. La pile commence comme[previousresult, input-n]
, oùn
est le nombre d'itérations. Les caractères suivants sont exécutés dans la boucle:Ensuite, le haut de la pile (entrée diminuée) est vérifié
0
par l'!
instruction, et si c'est le cas0
, leu
caractère est ignoré.Additionnez les chiffres
L'IP s'enroule autour du cube, se terminant sur le tout dernier caractère de la quatrième ligne, pointant initialement vers l'ouest. La boucle suivante comprend à peu près tous les caractères restants:
La boucle supprime d'abord l'élément supérieur de la pile (qui est soit
10
ou0
), puis vérifie ce qui reste du résultat de la factorielle. Si cela a été réduit à0
, le bas de la pile (la somme) est imprimé et le programme s'arrête. Sinon, les instructions suivantes sont exécutées (la pile commence comme[oldsum, ..., factorial]
):Et la boucle recommence, jusqu'à ce qu'elle
factorial/10
soit égale à 0.la source
C, 47 octets
usage:
la source
Python, 57 octets
Essayez-le en ligne
la source
L
fois que la factorielle est assez grande pour devenir longue.Lot, 112 octets
Fonctionne de manière pratique
set/a
sur la valeur actuelle d'une variable, elle fonctionne donc normalement dans une boucle. Fonctionne uniquement jusqu'à 12 en raison des limitations du type entier de Batch, donc en théorie, je pourrais économiser un octet en supposantf<1e9
:Mais de cette façon réside la folie ... Je pourrais aussi bien coder en dur la liste dans ce cas (97 octets):
la source
JavaScript (ES6), 50 octets
Fonctionne uniquement en
n=22
raison de limitations de précision en virgule flottante.la source
Befunge 93 ,
5654 octets2 octets enregistrés permettent d'utiliser get au lieu de guillemets. Cela m'a permis de décaler les 2 premières lignes sur 1, réduisant ainsi les espaces blancs inutiles.
Essayez-le en ligne!
Explication:
la source
Javascript ES6 -
6154 octetsEDIT: Merci Hedi et ETHproductions pour avoir rasé 7 octets. Je dois me souvenir de cette astuce t - = - j.
la source
n=>{a=_=>!_||_*a(~-_);t=0;for(j of''+a(n))t-=-j;return t}
n=>eval(`for(j of''+(a=_=>!_||_*a(~-_))(n,t=0))t-=-j`)
AHK , 60 octets
AutoHotkey n'a pas de fonction factorielle intégrée et les fonctions de boucle ont des noms longs pour leurs variables intégrées. La première boucle est la factorielle et la seconde additionne les chiffres ensemble.
la source
J,
1211 octets1 octet enregistré grâce à Cole!
Cela applique simplement sum (
1#.
) aux chiffres (en utilisant l'inverseinv
de la conversion de base#.
avec une base de10
) de la factorielle (!
) de l'argument.Cas de test
Remarque: les deux derniers cas de test sont des bigints, comme indiqué par une fin
x
.la source
"."0":
pour obtenir des chiffres1#.,.&.":@!
qui nécessite également une précision étendue pour les cas plus petits (vous ne savez pas pourquoi). En outre 11 octets:1#.10#.inv!
.Brachylog (v2), 3 octets
Essayez-le en ligne!
Même "algorithme" que la réponse v1 de @Fatalize, juste avec un meilleur encodage.
la source
C,
6360 octets-3 octets pour la
do...while
boucle.Non golfé et utilisation:
la source
int
par défaut?int
on suppose.