Vous devez écrire un programme ou une fonction qui a donné trois entiers positifs n b k
comme sorties d'entrée ou renvoie les derniers k
chiffres avant les zéros de fin dans la b
représentation de base de n!
.
Exemple
n=7 b=5 k=4
factorial(n) is 5040
5040 is 130130 in base 5
the last 4 digits of 130130 before the trailing zeros are 3013
the output is 3013
Contribution
- 3 entiers positifs
n b k
où2 <= b <= 10
. - L'ordre des entiers d'entrée peut être choisi arbitrairement.
Sortie
- Une liste de chiffres retournés ou sortis sous forme de nombre entier ou de liste entière.
- Les zéros non significatifs sont facultatifs.
- Votre solution doit résoudre tout exemple de cas de test en moins d'une minute sur mon ordinateur (je ne testerai que les cas fermés. J'ai un PC inférieur à la moyenne.).
Exemples
Nouveaux tests ajoutés pour vérifier l'exactitude des soumissions. (Ils ne font pas partie de la règle d'exécution de moins d'une minute.)
Entrée => Sortie (avec le choix d'omettre les zéros non significatifs)
3 10 1 => 6
7 5 4 => 3013
3 2 3 => 11
6 2 10 => 101101
9 9 6 => 6127
7 10 4 => 504
758 9 19 => 6645002302217537863
158596 8 20 => 37212476700442254614
359221 2 40 => 1101111111001100010101100000110001110001
New tests:
----------
9 6 3 => 144
10 6 3 => 544
C'est le golf de code, donc l'entrée la plus courte gagne.
7 5 3
"013" ou "13" serait produit7 10 4
cas de test, je dirais13
n
ouk
? Ou peut-on les limiter à la plage du type entier du langage?Réponses:
Dyalog APL , 23 octets
Ce programme fonctionne tant que la factorielle ne dépasse pas la limite de représentation interne. Dans Dyalog APL, la limite peut être augmentée de
⎕FR←1287
.Suppose que les variables n, b et k ont été définies (par exemple
n b k←7 5 4
), mais si vous souhaitez plutôt demander n , b et k (dans cet ordre), remplacez les trois caractères par⎕
.la source
Mathematica,
5748 octets9 octets enregistrés grâce à @ 2012rcampion.
la source
b
premier pour économiser 2 octets?IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&
(ceci et votre original sont assez rapides)SlotSequence
astuce que j'ai utilisée dans mon commentaire ne fonctionne qu'avec la commande actuelle, vous ne pouvez donc plus enregistrer.Python,
198192181 181 caractèresC'est assez rapide, ~ 23 secondes sur le plus grand exemple. Et pas de facteur intégré (je vous regarde, Mathematica!).
la source
[2,3,2,5,3,7,2,3,5][b-2]
pourrait êtreint('232537235'[b-2])
d'économiser 3 octets.[1,1,2,1,1,1,3,2,1][b-2]
De même.111973>>2*(b-2)&3
est encore plus courte. C'est le même nombre d'octets pour le premier cependant (90946202>>3*(b-2)&7
).Pyth,
2635 octetsC'est une fonction de 3 arguments, nombre, base, nombre de chiffres.
Manifestation.
Le cas de test le plus lent, le dernier, prend 15 secondes sur ma machine.
la source
PARI / GP, 43 octets
La vitesse de négociation pour l'espace donne cet algorithme simple:
Chacun des cas de test s'exécute en moins d'une seconde sur ma machine.
la source
Mathematica - 48 octets
Non golfé:
Exemple:
Pour les cas les plus importants, le facteur limitant ne génère pas les chiffres:
La correspondance des motifs semble l'être
O(n^2)
, ce qui fait que les deux derniers cas de test dépassent largement la minute.la source
Bash / coreutils / dc, 60 octets
Utilise le
dc
script de ma réponse pour trouver le factoriel , sortie en base$2
, avecsed
pour couper les zéros de fin ettail
pour sélectionner les derniers$3
chiffres.la source
rev
pour réduire le retour en arrière, mais c'est çadc
qui mange le CPU ...Haskell,
111109 octetsUtilisation:
f 158596 8 20
->[3,7,2,1,2,4,7,6,7,0,0,4,4,2,2,5,4,6,1,4]
Prend environ 8 secondes pour
f 359221 2 40
mon ordinateur portable de 4 ans.Comment ça marche: pliez la multiplication (
*
) dans la liste[1..n]
. Convertissez chaque résultat intermédiaire en baseb
sous la forme d'une liste de chiffres (le moins significatif en premier), supprimez les zéros non significatifs, puis prenez les premiersk
chiffres et convertissez à nouveau en base 10. Enfin, convertissez àb
nouveau en base , mais avec le chiffre le plus significatif en premier.la source
Python 3, 146 octets
Je ne suis pas sûr que les cas de test fonctionneront tous assez rapidement - les plus grands sont très lents (car ils parcourent le nombre).
Essayez-le en ligne ici (mais soyez prudent).
la source
Java,
303299296 octetsSur mon ordinateur, cela fait en moyenne un peu moins d'un tiers de seconde sur le
359221 2 40
boîtier de test. Prend des entrées via des arguments de ligne de commande.la source
bc, 75 octets
Cela utilise certaines extensions GNU pour réduire la taille du code; un équivalent conforme à POSIX pèse 80 octets:
Pour garder les temps d'exécution raisonnables, nous coupons les zéros de fin (
while(!x%b)x/=b
) et tronquons aux derniersk
chiffres (x%=b^k
) lorsque nous calculons le factoriel (for(x=1;n;)x*=n--
).Programme de test:
L'autonomie de la suite de tests complète est d'environ 4¼ secondes sur mon poste de travail de 2006.
la source
bc
programme (golf ou pas), donc tous les conseils sont particulièrement les bienvenus ...PHP, 80 octets
Utilisé comme
f(359221,2,40)
pour le dernier cas de test. Fonctionne assez bien pour tous les cas de test.Essayez ici!
la source