Étant donné un entier 1 ≤ N ≤ 1 000 000 en entrée, sortez le dernier chiffre non nul de N! , où ! est le factoriel (le produit de tous les nombres de 1 à N , inclus). Il s'agit de la séquence OEIS A008904 .
Votre programme doit se terminer dans les 10 secondes sur une machine raisonnable pour toute entrée valide.
Cas de test
1 => 1
2 => 2
3 => 6
4 => 4
5 => 2
6 => 2
7 => 4
8 => 2
9 => 8
10 => 8
100 => 4
1000 => 2
10000 => 8
100000 => 6
1000000 => 4
C'est un code-golf donc le code le plus court en octets gagne!
Réponses:
Rubis - 63 caractères
Source - http://oeis.org/A008904
Gère jusqu'à un millier de chiffres en moins d'une seconde.
Tester
la source
Mathematica,
4536 octetsTrès lisible pour une réponse gagnante. :) (Là encore, il n'y a pas encore de soumission GolfScript & Co.)
Cela gère 1 000 000 d'entrées en 5 secondes environ sur ma machine.
la source
Python - 75
la source
PARI / GP - 27 octets
Cela échange la vitesse contre la taille - le boîtier de test prend beaucoup de temps (~ 6 secondes).
Cette version est beaucoup plus rapide (~ 15 microsecondes) mais prend 81 octets:
Vous pouvez utiliser ce code (non golfé) pour tester soit:
la source
Windows PowerShell, 53
565960637390Remarques:
Histoire:
$input
en chaîne suffit; la conversion enint
est appliquée implicitement.la source
Perl, 53
5861personnagesTous les espaces peuvent être supprimés, mais je l'ai laissé pour "lisibilité". Remarque: n'utilisez pas de formule explicite idiote de Sloane.
Calcule f (10 ^ 6) en 8,7 secondes sur ma machine.
Mise à jour : OP voulait que ce soit un programme complet:
Cela fait 55 caractères.
la source
CJam - 28
Vous pouvez l'essayer sur http://cjam.aditsu.net/ pour des valeurs jusqu'à 10000 environ; pour de plus grands nombres, vous devez utiliser l' interpréteur java . 1000000 s'exécute en environ 3 secondes sur mon ordinateur portable.
Explication:
Malheureusement, la solution simple est trop lente, donc je ne garde que les 7 derniers chiffres (avant les zéros de fin) après chaque multiplication.
Remarque: cette langue est beaucoup plus récente que la question.
la source
Mathematica, 34 octets
la source
05AB1E , 4 octets
Essayez-le en ligne!
Explication
la source
Gelée , 4 octets
Essayez-le en ligne!
Explication
Utilise le fait que lorsque
Ṛ
(inverser une liste; ne vectorise pas) est appliqué à un entier, il prend automatiquementD
(chiffres) en premier.Avec l'entrée 8:
Je ne pense pas qu'il y ait un "premier élément véridique" d'un octet (qui
ȯ/
agit comme) mais s'il y en a un, cela peut être raccourci à trois octets au total.la source
Java (OpenJDK 8) , 62 octets
Essayez-le en ligne!
Similaire à @Kevin Cruijssen mais enregistre 5 octets en combinant les boucles.
la source
||
par|
, et un octet supplémentaire en remplaçant==0
par<1
. Profitez de votre séjour!C,
150140135 octetsIl s'agit de la version pour les systèmes ASCII; remplacer la chaîne
33436
par11214
pour un système EBCDIC, ou par\1\1\2\1\4
pour un programme portable.Les solutions C sont un peu gênées par l'exigence de fournir un programme complet; cependant, cela répond pleinement à la question.
Essayez-le en ligne (nécessite Javascript):
Explication
Il est basé sur l'algorithme décrit dans le chiffre non nul le moins significatif de n! , se retourna pour que nous rentrions rapidement pour trouver la puissance la plus élevée de cinq, et fassions le calcul à la sortie. Les tables de constantes étaient trop grandes, je les ai donc réduites en trouvant une relation entre le résidu précédent
r
, le chiffre courantd
et la profondeur de récursiviték
:Pour
r>0
, ce à une fois décide Constanter
fois2^dk
(mod 5); les constantes sont ena[]
dessous (en ligne dans le code golfé). Nous observons également que(2^4)%5
c'est 1, donc nous pouvons réduire l'exposant pour éviter de déborder la plage deint
.Tests:
La performance est également respectable. Voici une entrée maximale pour un système avec 32 bits
int
:J'ai aussi les mêmes timings avec un maximum de 64 bits
int
.la source
2147483647!
compte plus de 19 milliards de chiffres et(2^63-1)!
plus de 170 000 000 000 000 000 000 000 de chiffres, c'est donc une grande victoire sur le calcul des factorielles.1000000!
comme spécifié dans la question est possible de calculer sur le matériel actuel; c'est seulement 5½ millions de chiffres. :-)PHP - 105
Fonctionne en moins de 10 secondes avec le boîtier de test donné.
la source
Python3
239 caractèresPeut faire 10000 en ~ 3,2 secondes (Ideone me coupe à 8 secondes, je suis sûr que cela prendra plus de 10 secondes :()
Python2.6
299 caractères (un peu plus rapide)la source
Haskell, 78 caractères
(Aurait probablement besoin d'être compilé pour calculer 1 000 000! En 10 secondes).
la source
foldl1
parproduct
(cf codegolf.stackexchange.com/questions/607/find-the-factorial/… ). Mais avez-vous réellement essayé avec 1000000! ?J -
4240 caractèresTout un programme. Enregistrez ce programme dans un fichier et exécutez avec
jconsole script.ijs 1234
. Notez que ce programme ne quitte pas l'interpréteur après avoir imprimé un résultat. Tapez^D
ouexit]0
pour quitter l'interpréteur.Voici une explication:
x #. y
interprète le vecteur entiery
comme unx
nombre de base ; par exemple, les10 #. 1 2 3 4
rendements1234
.u inv
donne le inverse d'un verbeu
. En particulier,x #. inv y
représentey
comme unx
nombre de base ; par exemple, les10 #. 1234
rendements1 2 3 4
. Notez que celainv
est défini comme^:_1
, c'est-à-direu
appliqué -1 fois.x * y
est le produit dex
et donney
ainsix 10&#.inv@* y
une représentation en base 10 du produit dex
ety
.x # y
copie le n élément -ièmey
aussi souvent que le n ième élément dex
; whenx
est un vecteur de booléens,x
sélectionne les élémentsy
à prendre. Par exemple, les1 0 1 0 # 1 2 3 4
rendements1 3
.* y
donne le signal dey
.x u~ y
est le réflexe deu
, c'est-à-dire le même quey u x
.y #~ * y
donne un vecteur de tous les élémentsy
positifs. En notation tacite, cela peut être écrit avec un crochet comme(#~ *)
.{: y
renvoie le dernier élément dey
.([:{:@(#~*)10&#.inv@*)
.u/ y
est la réduction duy
verbe dyadiqueu
inséré entre les éléments dey
. Par exemple,+/1 2 3 4
est comme1 + 2 + 3 + 4
et donne10
.([:{:@(#~*)10&#.inv@*)/ y
donne le dernier chiffre du produit des articles dey
.ARGV
est un vecteur encadré des arguments de la ligne de commande.".>{:ARGV
est le dernier argument non encadré et interprété comme un nombre.i. y
calcule les nombres naturels de0
ày - 1
.1+i. y
donne des nombres naturels de1
ày
. J'aurais pu aussi utiliser>:
incrément ici, mais1+
c'est plus clair au même prix que les caractères.1+i.".>{:ARGV
(le vecteur de1
au nombre dans le dernier argument de la ligne de commande) au verbe([:{:@(#~*)10&#.inv@*)/
et imprime le résultat avececho
.la source
Pyt , 5 octets
Explication:
Essayez-le en ligne!
la source
R ,
63555146 octetsCalcule la factorielle, extrait le dernier chiffre non nul. Merci à Giuseppe d'avoir fourni la structure de base.
Essayez-le en ligne!
Alternativement, mon ancienne réponse de 51 octets:
Calcule la factorielle, convertit en caractère, supprime tous les
0
s, puis prend le caractère final. Enregistré 2 octets grâce à Giuseppe.Essayez-le en ligne!
la source
gamma(x+1)
est plus court quefactorial(x)
(y=(x<-gamma(scan()+1))%/%10^(0:nchar(x))%%10)[!!y][1]
de 54 octets.nchar(x)
par1e5
une solution de 46 octets! Bien joué.> <> , 25 octets
Essayez-le en ligne!
Poignées 0! correctement aussi. La valeur est passée par le
-v
drapeau.la source
1000
ne produit aucune sortie sur TIO - qu'est-ce qui ne va pas?Perl 6 ,
2635 octetsEssayez-le
En programme complet:
Essayez-le
Étendu:
la source
C (gcc) , 72 octets (fonction)
Essayez-le en ligne!
C (gcc) ,
10199 octets (programme entier)Essayez-le en ligne!
Cette question a juste 8 ans, donc "machine raisonnable" n'est pas la même qu'à l'époque, mais j'obtiens des temps de ~ 0,01 seconde sur mon ordinateur lorsque je fais tous les cas de test ensemble, donc à moins que la vitesse des ordinateurs n'ait augmenté par un facteur de 1000 cette dernière décennie, ça devrait aller.
la source
Ajouter ++ , 11 octets
Essayez-le en ligne!
la source
Attaché , 26 octets
Essayez-le en ligne!
Explication
Il s'agit d'une composition de 4 fonctions:
`!
- c'est une version fonctionnelle de l'opérateur factorielDigits
- cela obtient les chiffres de la factorielle\&:(All@V)
- Il s'agit d'une fonction de sélection. Il fonctionne en liant à gauche (&:
) la fonctionAll@V
à\
, qui est select. À son tour,All@V
est un moyen rapide de tester si un nombre n'est pas 0. Il fonctionne en transposant son entrée dans un vecteur0 -> [0]
puis en demandant si tous ces membres sont véridiques (c'est-à-dire pas 0). Cela donne les chiffres du nombre sans 0.Last
- cela obtient simplement le dernier membre de ce tableau.la source
APL (Dyalog Unicode) ,
1815 octetsEssayez-le en ligne!
Fonction de préfixe tacite. Renvoie le chiffre correct pour un seul cas de test ou une chaîne de chiffres pour plusieurs cas de test.
Merci à @ Adám et @ErikTheOutgolfer pour 3 octets chacun.
Comment?
la source
APL NARS, 28 octets, 14 caractères
Je ne sais pas pourquoi mais cela passe le test:
la source
AWK ,
4757 octetsEssayez-le en ligne!
La solution d'origine ne gérait pas très bien les "grandes" valeurs d'entrée. Cela pourrait ajouter
-M
à le forcer à fonctionner, mais cela nécessite également beaucoup plus de temps de traitement.la source
inf
ça ne va pas%
très bien. :(Japt , 6 octets
Je suis venu avec quelques 6 octets différents mais j'ai préféré celui-ci. Je suis convaincu qu'il doit y avoir un moyen de le faire en 5, cependant.
Essayez-le
Explication
Ê
calcule la factorielle de l'entrée, las
convertit en chaîne et revient en entier après l'w
avoir inversée,ì
convertit le résultat en un tableau de chiffres etv
renvoie le premier élément.Alternatives
la source
Perl 5 , 36 + 10 (
-p -Mbigint
) = 46 octetsEssayez-le en ligne!
la source
f
(devrait être 4 ) et 100 ⇒7
(devrait être 4 )