En mathématiques, le "fait" factoriel raccourci d'un entier non négatif n , noté n! , est le produit de tous les entiers positifs inférieurs ou égaux à n . Par exemple, 5! est 1 * 2 * 3 * 4 * 5 = 120
La factorielle de 0 est 1 , selon la convention pour un produit vide.
Ce sont les faits habituels auxquels nous sommes habitués. Ajoutons quelques alternatives:
- Le factoriel (défini ci-dessus)
- La double factorielle: n !! = 1 + 2 + ... + n
- La triple factorielle: n !!! = 1 - (2 - (3 - (... - n))) ...)
- Le quadruple factoriel: n !!!! = 1 / (2 / (3 ... / n))) ...) . Remarque: Il s'agit d'une division en virgule flottante, pas d'une division entière.
Défi
Prendre une entrée de nombre entier non négatif n , suivie directement par entre 1 et 4 exclamation marques. L'entrée ressemblera (exactement) à ceci: 0! , 5 !! , 132 !!! ou 4 !!!! . Dans ce défi, vous ne pouvez pas assumer un format d'entrée flexible, désolé.
Production
La sortie doit être le résultat, sur n'importe quel format pratique. Le résultat de la quadruple factorielle doit avoir au moins 2 chiffres après la virgule, sauf 0 !!!! = 0 .
Cas de test:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
---
0!! = 0
1!! = 1
2!! = 3
3!! = 6
4!! = 10
5!! = 15
6!! = 21
7!! = 28
8!! = 36
9!! = 45
10!! = 55
---
0!!! = 0
1!!! = 1
2!!! = -1
3!!! = 2
4!!! = -2
5!!! = 3
6!!! = -3
7!!! = 4
8!!! = -4
9!!! = 5
10!!! = -5
---
0!!!! = 0
1!!!! = 1
2!!!! = 0.5
3!!!! = 1.5
4!!!! = 0.375
5!!!! = 1.875
6!!!! = 0.3125
7!!!! = 2.1875
8!!!! = 0.27344
9!!!! = 2.4609
10!!!! = 0.24609
La solution la plus courte dans chaque langue l'emporte.
0!
->1
.Réponses:
JavaScript (ES6), 88 octets
Cas de test
Afficher l'extrait de code
Formaté et commenté
la source
Husk , 15 octets
Essayez-le en ligne!
Explication
Indexation dans une liste de fonctions: les joies de l'utilisation d'un langage fonctionnel.
J'utilise une gamme décroissante et des plis gauches, depuis
-
et je/
prends leurs arguments dans l'ordre inverse dans Husk.la source
Indexing into a list of functions
est woah ...C # (.NET Core) ,
134 130128 octetsEssayez-le en ligne!
La meilleure partie du golf de code sont les choses que vous apprenez en essayant de résoudre les défis. Dans celui-ci, j'ai appris qu'en C #, vous pouvez couper d'autres caractères en plus des espaces blancs des chaînes.
s.Split('!').Length
, il suffit de fixer les limites danse>4?i/r:e>3?i-r:e>2?i+r:i*r
etn<1&e<3?1:r
.la source
e
n
eti
aussidouble
éviter de le déclarer pour r pour économiser 4 octets.float
pour enregistrer un autre octet.Perl 5 , 62 octets
Code de 61 octets + 1 pour
-p
.Merci à @GB d' avoir signalé une faute de ma part!
Essayez-le en ligne! (ceci utilise
-l
pour la lisibilité)la source
R ,
113111 octetsEssayez quelques cas de test!
non golfé:
la source
el(strsplit(s,"!"))
enregistre 1 octetPython3,
124130121119 octetsÀ ce stade, je crois que la récursivité est la clé pour économiser davantage d'octets.
Essayez les tests sur Try it online!
-9 octets grâce à @ Mr.Xcoder !
-2 octets grâce à @Felipe Nardi Batista !
la source
Pyth ,
3430 octetsEssayez-le en ligne!
Explication
la source
.U
enregistre un octet.05AB1E , 27 octets
Essayez-le en ligne!
la source
„.»
cela ne fonctionne pas?»
fait partie d'une chaîne compressée inachevée, il génère donc des erreurs et, comme d'habitude dans 05AB1E, l'erreur est ignorée."*+-/"èU
après avoir utilisé leL
suivi avec.»X
mais il traiteX
comme une chaîne, pas une commande et.»X.V
est encore plus dérangeant.X
n'évalue pas.X.V
sont deux commandes.Rubis ,
83 8079 octetsEssayez-le en ligne!
Explication:
la source
Java 8,
141136134 octets-5 octets (141 → 136) grâce à la réponse C # de @CarlosAlejo .
Explication:
Essayez-le ici.
la source
float
c'est plus court quedouble
.float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)
à la réponse actuelle m'a fait économiser 5 octets. :) J'ai oublié d'ajouter une partie " octets enregistrés grâce à " que j'ai remarquée maintenant .. Désolé.Gelée ,
24 23 2625 octets+
32 octets corrigeant pour corriger après une mauvaise interprétation :(Un programme complet (un lien monadique avec des liens d'assistance référencés par l'emplacement du programme)
Essayez-le en ligne! ou voir une suite de tests .
Comment?
la source
0!
./
. Sur une liste vide D: EDIT: Apparemment valable pour0!
,0!!
,0!!!
et0!!!!
+1.Code machine x86_64 à modification automatique, 123 octets
Pourquoi les langages interprétés pourraient-ils exécuter dynamiquement du code avec des
eval
s fantaisistes , mais pas du code machine ordinaire?Essayez-le avec:
Assemblée:
Des explications seront ajoutées ultérieurement. L'idée de base est de modifier l'
divss xmm0, xmm1
instruction à0x100000db0
et de la remplacer par unmulss
,addss
,subss
oudivss
selon l'opérande fourni. Une petite astuce est également utilisée pour analyser la chaîne d'entrée.Assemblage généré avec:
la source
Haskell,
105 102 9896 octets9 octets enregistrés grâce à Zgarb et nimi.
Essayez-le en ligne.
la source
read n
, et cef=
n'est pas nécessaire selon nos règles .lex
enregistre deux octets:f s|[(n,b)]<-lex s=read n!(length b-1)
.lex
. C'est génial! :) Je ne vois pas comment cela permet d'économiser des octets - j'obtiens 99 octets après cela.Gaia ,
2625 octetsEssayez-le en ligne!
Explication
la source
Gelée , 28 octets
Essayez-le en ligne!
J'ai eu l'idée de séparer les liens en lignes de la réponse de Jonathan Allan pour -2 octets.
la source
APL (Dyalog) , 30 octets
Inspiré par la solution de lstefano .
Essayez-le en ligne!
{
…}
Fonction anonyme où l'argument est représenté par⍵
:0::
en cas d'erreur:0
retourner zéro⋄
Essayez maintenant:⍵∩⎕D
l'intersection de l'argument et de l'ensemble des chiffres D (supprime les points d'exclamation)⍎
exécuter cela (le transforme en un nombre)⍳
ɩ ndices de cela(
…)/
Insérer (APL est associatif à droite, au besoin) la fonction suivante entre les termes:⍵~⎕D
l' argument sans D igits (feuilles points d'exclamation)≢
compter (c.-à-d. combien de points d'exclamation)'×+-⌹'⊃⍨
utilisez-le pour choisir dans la liste des symboles *⍎
exécuter (transforme le symbole en fonction)⌹
(division matricielle) est utilisé à la place de÷
(division normale) pour provoquer une erreur sur une liste videla source
::
un dfn?::
événement se produit, la valeur à droite de::
est immédiatement renvoyée.Perl 5 , 96 octets
Essayez-le en ligne!
la source
Dyalog APL, au moins 29 caractères
L'expression est PRESQUE correcte. Il passe tous les cas de test SAUF
0!!!!
pour lesquels il donne1
au lieu des requis0
et c'est parce qu'en APL la réduction d'un vecteur vide est censée retourner l'élément neutre pour la fonction utilisée pour réduire. Pour le quotient qui est 1. Pour le moment je n'ai pas le temps d'essayer de le réparer mais je vais le laisser ici un jour de pluie.la source
{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}
essayez-le en ligne!05AB1E ,
2524 octetsEssayez-le en ligne!
la source
Mathematica, 152 octets
la source
Javascript,
111163 octetsVersion lisible
la source