Ne pas confondre avec Trouver la factorielle!
introduction
La factorielle d'un entier n
peut être calculée par
C'est relativement facile et rien de nouveau. Cependant, les factorielles peuvent être étendues aux factorielles doubles , telles que
En résumé:
Le défi
Ecrivez une fonction qui calculera tout type de factorielle répétée pour tout entier non négatif.
Contribution
Non plus
- Chaîne contenant un entier non négatif en base dix suivi d'un ou plusieurs points d'exclamation. Par exemple
"6!"
ou"9!!"
ou"40!!!!!!!!!!!!!!!!!!!!"
.
ou
- Les mêmes valeurs représentées par deux entiers: une valeur de base non négative et une valeur positive représentant le compte factoriel. Cela peut être fait selon n'importe quel format à partir des règles d'E / S par défaut.
Sortie
Le résultat dudit calcul.
Remarques du challenge
0!
est égal1
par définition. Votre code doit en tenir compte.- Le comptage factoriel est limitée par en dehors de cette plage, vous êtes libre de sortie quelconque. À part
0!
, qui est la seule exception à cette règle.
Exemples
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Essayez-le avec une implémentation Python non-golfée: essayez-le en ligne!
Remarques générales
- C'est du code-golf , donc la réponse utilisant le moins d'octets dans chaque langue gagne.
- Règles standard , les règles d' E / S et les règles échappatoire applicables.
- S'il vous plaît inclure un lien Essayez-le en ligne pour démontrer que votre code fonctionne.
- S'il vous plaît motiver votre réponse avec une explication de votre code.
0!
mais les remarques de défi indiquent que le nombre factoriel sera inférieur ou égal à la valeur de base.3!!!!!!!
ne devrait pas être indéfini - il devrait simplement donner la réponse3
. C'est pareil que1!!=1
(non indéfini). De plus, votre spécification d'entrée indique qu'il y en aura toujours au moins un!
, le premier exemple3
ne correspond donc pas à la spécification.(3!)!
plutôt la suppression de termes d'une factorielle. C'est un nom trompeur; Je suis arrivé en supposant que la fonction Factorielle serait appliquée de manière répétée dans une chaîne et que je devais lire attentivement pour voir ce que c'était réellement. Heureusement, la question l'explique clairement. Un meilleur nom pourrait être stride factorial ou step factorial ou quelque chose.Réponses:
R , 33 octets
Essayez-le en ligne!
Traiten=0 en ajoutant la négation logique de n .
la source
ArnoldC ,
702 698634 octetsEssayez-le en ligne!
Traduit en pseudocode:
Remarque: ArnoldC a un seul type de données: un entier signé 16 bits. Par conséquent, je ne peux pas tester le
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
cas.la source
c
variable stocke en fait la valeur de la comparaison entren
et0
.Gelée , 4 octets
Essayez-le en ligne!
Comment? Compte tenu den et k , il génère d' abord l'intervalle n,⋯,1 (avec kth élément de cette gamme (donc n,n−k,n−2k,⋯,n−⌊n/k⌋k ), et finalement les multiplie en utilisant
RṚ
), puis avecm
elle conserve tous lesP
.la source
RṚ
m
P
r1mP
.APL (Dyalog Extended) , SBCS 7 octets
Fonction de préfixe tacite anonyme. Prend
[n,b]
comme argument.Essayez-le en ligne!
1¨
un pour chaque élément de l'argument;[1,1]
-\
différence cumulative;[n,n-b]
…
plage en utilisant le deuxième élément de l'argument de gauche comme indicateur de pas, par exemple,[9,7]
continue avec5
×/
produitla source
Haskell , 21 octets
Essayez-le en ligne!
La combinaison de la fonction de produit intégrée avec l'énumération échelonnée de la plage bat ce que je pouvais coder de manière récursive (même avec la sauvegarde fulgurante d'un octet).
22 octets
Essayez-le en ligne!
Voici une solution prenant en entrée au format chaîne
9!!
, ce qui, à mon avis, est plus intéressant.42 octets
Essayez-le en ligne!
la source
n%a|n<1=1|m<-n-a=n*m%a
Pyth , 6 octets
Ce sont tous équivalents 6-byters:
Essayez-le en ligne! (
*F:Q1E
)Ou, 11 octets , en prenant l’entrée sous forme de chaîne:
Suite de tests.
la source
JavaScript (ES6), 21 octets
Prend les entrées en tant que
(k)(n)
.Essayez-le en ligne!
Ou 24 octets pour prendre en charge BigInts.
JavaScript (ES6), 55 octets
Prend les entrées sous forme de chaîne, en utilisant le format décrit dans le défi.
Essayez-le en ligne!
la source
Espaces blancs , 91 octets
Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté comme explication seulement.Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).
Explication en pseudo-code:
la source
Python 2 , 29 octets
Essayez-le en ligne!
la source
Perl 6 , 22 octets
Essayez-le en ligne!
Codeblock anonyme qui renvoie le produit de la plage en partant de la première entrée, en diminuant de seconde en seconde
1
, en excluant le dernier chiffre. Cela fonctionne pour0
, puisque le cas de base de la réduction par produit est 1, la sortie est donc 1.la source
05AB1E ,
1087 octetsEntrée sous forme de deux entrées séparées: la première entrée étant
base
; deuxième entrée étantfactorial
.Essayez-le en ligne ou vérifiez tous les cas de test .
-2 octets grâce à @ Mr.Xcoder .
-1 octet grâce à @JonathanAllan .
Explication:
Réponse originale de 10 octets :
Entrée sous forme de deux entrées séparées: la première entrée étant
base
; deuxième entrée étantfactorial
.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
LR²ιнP
( Essayez-le en ligne! ) Fonctionne pour tous les cas de test, sauf pour 0.LR²ιн0KP
pour 8 octets?0K
devrait être inutile, car0!
une spécification invalide (même si elle a été incluse dans les exemples) - j'ai déjà commenté .0!
est dans le domaine d'entréeݦRXιнP
enregistre un octet.code machine x86-64, 12 octets
Le même code machine fait la même chose en mode 32 bits et pour les entiers 16 bits en mode 16 bits.
Cette fonction, appelable avec args
n=RCX
,k=ESI
. Valeur de retour 32 bits enEAX
.Appelable en C avec la convention d'appel System V x86-64 avec des arguments factices pour obtenir les arguments réels dans les registres appropriés.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Je ne pouvais pas simplement utiliser Windows x64 parcemul
que RDX était un opérateur à 1 opérande , et nous ne voulons pas que les préfixes REX accèdent à R8 / R9.n
Pour que JRCXZ fonctionne, il ne doit pas y avoir de déchets dans les 32 bits les plus élevés, mais à part cela, tout est en 32 bits.Liste NASM (adresse relative, code machine, source)
0xc = 12 octets
Ou 10 octets si nous n’avons pas besoin de traiter le
n=0
cas spécial, en laissant de côté lejrcxz
.Pour factorial standard, vous utiliseriez à la
loop
place de sub / ja pour sauvegarder 2 octets, mais sinon, le même code.Appelant de test qui passe
argc
commek
, avecn
codé en dur.la source
APL (Dyalog Unicode) , SBCS de 11 octets
Fonction infixe tacite anonyme. Prend
n
comme argument droit etb
comme argument gauche.Essayez-le en ligne!
×∘⍳
multiplierb
par les ɩ ntegers 1 àn
⊢-
soustrayez cela den
⊢,
ajoutern
1⌈
max d'un et chacun de ceux×/
produitla source
Ruby , 25 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
2221 octetsEssayez-le en ligne!
-1 merci à attinat:
Times --> 1##&
Explication: utilisez
Range
pour faire la liste des valeurs{n, n-k, n-2k, n-3k, ...}
, en vous arrêtant avant de descendre en dessous de 1 (c'est-à-dire en vous arrêtant juste). Puis multipliez tous les nombres de cette liste avecTimes
(ou1##&
).la source
1##&
au lieu deTimes
Java 10, 44 octets
Prend la factorielle en première entrée, base en seconde.
Essayez-le en ligne.
La procédure ci-dessus ne fonctionne pas pour le cas de test le plus volumineux en raison de la plage d’entiers limitée (32 bits). Pour résoudre ce problème , nous pouvons utiliser
BigIntegers
, qui parhasardestexactement le double de la taille - 8879 octets :-9 octets grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Explication:
la source
Japt , 8 octets
L'essayer
-1 grâce à EoI qui a montré à quel point Shaggy peut être stupide et sans café!
la source
kT
peut être remplacé parf
pour 1 octetC (gcc) , 41 octets
Essayez-le en ligne!
la source
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
pour C (gcc)MathGolf ,
7 à6 octetsEssayez-le en ligne!
Trouvé un moyen intelligent de gérer 0! sans changer les autres cas de test. Prend les entrées en tant que
k n
(ordre inverse), ce qui facilite le popping implicite.Explication
la source
Attaché ,
21 à19 octetsEssayez-le en ligne! Jolie implémentation récursive directe. (Remarque:
true
est essentiellement1
, comme il peut être utilisé dans les opérations arithmétiques comme1
.) C’est l’un des rares programmes que j’ai écrit pour ce site où l’utilisation d’un opérateur Unicode enregistre les octets (1, pour être précis).Des alternatives
20 octets:
${x<y or x*$[x-y,y]}
21 octets:
Prod@${{_%y=x%y}\1:x}
27 octets:
${x*[`1,$][x>y][x-y,y]∨1}
27 octets:
${If[x>y,x*$[x-y,y],_or 1]}
27 octets:
${x*[`1,$][x>y][x-y,y]or 1}
29 octets:
${If[x>y,x*$[x-y,y],_+not _]}
la source
Rust ,
927361 octetsJe commence tout juste à apprendre la rouille, alors je suis sûr que cela peut être plus court. Mettra à jour que j'apprends. La valeur de retour doit être
i128
afin de calculer le dernier test.Edit: La récursivité est plus courte.
Essayez-le en ligne!
Vous pouvez ajouter votre propre test ou modifier l'un des tests existants.
la source
q ,
59 57 5553 octetsexplication:
voici aussi une version en k (même logique),
4241 octetsla source
Physica , 22 octets
Essayez-le en ligne!
26 octets
Réapprendre à utiliser mon propre "langage" \ o / ... Si j'avais su écrire un analyseur il y a 2 ans, cela aurait été de 20 octets :(
ou
Essayez-le en ligne!
la source
Retina , 66 octets
Essayez-le en ligne! Link inclut des cas de test plus rapides. Mauls nombres sans points d'exclamation. Explication:
Réparer
0!
.Convertir
n
en unaire et ajouter un séparateur.Soustrayez à plusieurs reprises
k
den
whilen>k
et collectez les résultats.Remplacez
k
par1
(en décimal).Multipliez par chaque valeur intermédiaire à tour de rôle, en convertissant en décimal.
la source
Japt , 8 octets
L'essayer
la source
JavaScript (Node.js) , 35 octets
Essayez-le en ligne!
la source
Forth (gforth) , 50 octets
Essayez-le en ligne!
Explication du code
la source
Perl 5
-Mbigint -p
, 45 octetsEssayez-le en ligne!
la source
Stax , 6 octets
Exécuter et déboguer
Il prend une entrée dans le formulaire
{count} {base}
.la source
Gaia , 6 octets
Essayez-le en ligne!
Prend l'entrée comme
n
,k
donc l'entrée3 4
serait3!!!!
.la source