Le système de nombres factoriels , également appelé factoradique, est un système de nombres mixtes radix. Les factorielles déterminent la valeur de position d'un nombre.
Dans ce système, le chiffre le plus à droite peut être 0 ou 1, le deuxième chiffre le plus à droite peut être 0, 1 ou 2, etc. Cela signifie qu'un n
nombre factoriel numérique peut avoir une valeur maximale de (n + 1)!
.
Par exemple, pour convertir le nombre factoriel 24201
en décimal, vous feriez ceci:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Par conséquent, le nombre factoriel 24201
est de 349
base 10
.
Pour convertir un nombre décimal (avec 349
comme exemple) en nombre factoriel, vous feriez ceci:
Prenez la plus grande factorielle inférieure au nombre. Dans ce cas, c'est le cas 120
, ou 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
La 349
base 10
est donc le nombre factoriel 24201
.
Votre défi consiste à créer le programme ou la fonction la plus courte qui convertit un numéro d'entrée dans l'autre base.
L'entrée sera une représentation sous forme de chaîne d'un entier non négatif. Un nombre factoriel sera précédé d'un !
(par exemple !24201
), tandis qu'un nombre décimal ne sera précédé de rien. Vous pouvez supposer que l'entrée maximale sera 10! - 1
- 3628799
en décimal et 987654321
en factoradique. Cela signifie que les lettres n'apparaîtront pas dans une entrée / sortie factorielle.
Le programme n'a pas besoin d'ajouter un !
à une sortie factorielle et peut sortir une chaîne ou un entier. L'entrée peut être dans n'importe quel format raisonnable.
Cas de test:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
la source
⍴⍵∩'!'
par'!'∊⍵
pour enregistrer un personnage.~'!'
par∩⎕D
pour enregistrer un caractère.Python 2.7 (
163157152)Version plus lisible:
Panne:
la source
'!'==i[0]
avec'!'in i
, et peut utilisera=x=1
. De plus, vous n'avez pas besoin de crochets autour de l'instruction exec.(len(i)-1)
par~-len(i)
.(a,b)['!'in i]
et j'ai réussi à raser 6 caractères. Ce n'est pas aussi lisible que par leGolfScript (
48 4443 caractères)Il s'agit d'un programme autonome. La conversion factoriadique => décimale est assez lente, car elle effectue une recherche en utilisant la conversion décimale => factoriadique plutôt qu'une conversion de base directe.
Le format d'entrée permet un changement de mode très court:
.~
copie la chaîne d'entrée et l'évalue, donc si l'entrée n'est qu'un nombre, nous nous retrouvons par exemple"1234" 1234
sur la pile, et si elle commence par!
(logique non, avec aucune non vide chaîne étant véridique) on se retrouve par exemple0 30311
sur la pile. Ensuite, la valeur au bas de la pile est véridique pour décimal => factoriadique et fausse pour factoriadic => décimal.la source
PHP <7,1
178 171 170 168 164 155 155 147 144 138 126123 123 octetsExécuter en tant que pipe avec
-r
ou tester en ligne .sous-fonction nécessaire: la base factorielle est réutilisée (incrémentée / diminuée dans les boucles)décimal 0 renvoie une chaîne vide au lieu de(les deux autres réponses PHP le font aussi.)0
.Si cela est inacceptable, ajoutez +5 pour le cas supplémentaire.non golfé:
idées de golf abandonnées:
$b<=$x
->$b<$x
(-1)casserait les factorielles décimales pures (c'est-à-dire celles qui donnent un nombre factoriel avec un seul chiffre non nul). La solution de JMPC en souffre; HamZa´s ne le fait pas.
floor($x/$b)
->(int)($x/$b)
pourrait être un peu plus rapide, mais la conversion de type précède la division, j'ai donc besoin des parenthèses et je ne gagne pas un octet.
$x/$b|0
fait l'affaireLa boucle en fait-> dec est similaire à la recherche factorielle en dec-> fact. Même incrément, le corps n'a pas d'importance, mais malheureusement un preset différent et une post-condition différente. Dang; aurait pu y jouer au golf -21.YAY j'ai trouvé une solution. A pris un peu de golf, mais a coupé un autre -4 (non: -9) et a fermé tous les bugs / échappatoires.
Plus de potentiel ... ou ai-je fini de jouer au golf?
la source
+$r
au lieu d'$r|0
enregistrer un octet. Pareil pourif($x|0)
JavaScript (ES 6)
139 137 122 113111essayé une approche différente en utilisant un peu de magie de tableau; mais je me suis retrouvé à
174172 octets avec ça:J'ai donc pris mon code PHP et l'ai traduit. Pourrait supprimer tous les
$
s et quelques-uns;
, mais la nécessité d'initialiser les vars a absorbé une partie de cet avantage. Géré au golf les deux réponses un peu plus loin, cependant.golfé
non golfé
suite de tests
la source
.split('')
=>.split``
f=
. Peut-r+=(x/(b/=j--)|0)
être aussir+=x/(b/=j--)|0
?Perl 6 ,
666560 octets-1 octet grâce à Jo King
Essayez-le en ligne!
la source
GolfScript, 69 caractères
Prend l'entrée de STDIN comme d'habitude et imprime le résultat. Test en ligne .
la source
Haskell, 221 caractères
Code Golf
Usage
Code non golfé
la source
Mathematica
213 177175Un nombre factoriel est encapsulé
f[]
, qu'il s'agisse d'une entrée ou d'une sortie.Usage
Conversion du nombre factoriel en nombre décimal .
QuotientRemainder[n,j!]
agit récursivement sur les chiffres du nombre factoriel de gauche à droite, décrémentantj
à chaque pas.QuotientRemainder[349, 5!]
, par exemple, renvoie{2, 109}
et ainsi de suite.Conversion du nombre décimal en nombre factoriel . De droite à gauche, la fonction pure
# (p++)! &
, multiplie chaque chiffre#
, par la factorielle appropriée.la source
Python, 128 caractères
Cela prend environ une demi-heure pour fonctionner, mais c'est petit:
Il construit une liste de tous les nombres factoriels <= 9 chiffres dans l'ordre numérique, puis effectue une recherche ou un index à convertir.
Si vous voulez tester, remplacez simplement
10**9
par10**6
et limitez-vous aux nombres variadiques à 6 chiffres.Je pourrais techniquement enregistrer un personnage en utilisant
range(10**9)
au lieu dexrange(10**9)
. N'essayez pas ca a la maison.la source
d+2
etfor
PHP
231214204Réponse la plus récente
Ancienne réponse
Exemple
Sortie
la source
foreach(range())
peut être remplacé par une simplefor
boucle (-9). J'aime bien l'idée.24
devrait revenir1000
mais revient400
. Correction:g(++$p)<$x
->g(++$p)<=$x
(+1)for
construction:,
devrait être;
3) J'ai encore 7 changements en économisant 20 octets sur ce code. Je les veux?if
condition, puis utilisez mon type sexy cast en int (-6) Cela n'affectera pas le résultat décimal 0! e) lafor
construction restante peut être réécrite avec une très bellewhile(++$t<$c=strlen($x))
: incrémentation avant body -> $ t n'a pas besoin d'initialisation (-6)JELLY, 5 octets
Explication
* Jelly est plus jeune que l'âge de la question donc ma réponse est non compétitive.
la source
V
etṾ
.)Gelée , 15 octets
Essayez-le en ligne!
Comment ça marche
Pourquoi
*)
fonctionne¬
est NON logique par élément. Lorsque donné un seul entier, il devient un simple zéro, ce qui est faux. Cependant, quand on lui donne une chaîne, chaque élément (caractère) est mis à zéro, et le résultat entier est un tableau de zéros qui est vrai.Zéro comme entier est un cas particulier. Il passe par la route "factorielle -> entière", mais il donne toujours zéro qui est correct.
Sans base factorielle intégrée, 25 octets
Essayez-le en ligne!
Comment ça marche
la source
K, 102
Pourrait certainement être amélioré.
la source
D (159 caractères)
Non golfé et avec point d'entrée de programme
Tous les arguments de ligne de commande sont imprimés en tant que
<original> -> <converted>
. Seul le nombre décimal à factoradique est réellement implémenté dansx
. L'inverse appelle simplementx
avec tous les nombres décimaux (0 .. *) jusqu'à ce que le résultat soit égal à l'entrée. Cela prend environ 3 secondes pour la plus grande entrée (! 987654321).Version en ligne exécutable: http://dpaste.dzfl.pl/46e425f9
la source
string n
pourchar[]n
enregistrer un octet (je sais que je suis en retard ici).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
peut devenirif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
pour économiser deux octets.VBA 225
Merci à Titus pour l'aide! Toujours à la recherche de golf.
la source
b
une valeur numérique au lieu de comparer le premier caractère?If Not IsNumeric(b) Then
mais cela prend plus de caractères. Maintenant, je ne suis pas entré et j'ai réexaminé tout le code; il peut y avoir un moyen légèrement meilleur de le faire avec l'IsNumeric
ensemble. - Correction, il y a une légère amélioration ici. Merci!For d=9To 1Step-1
etFact(d)
->For d=0To 8
etFact(9-d)
deux autres si vous le faitesFor d=2To e
etFact(e-d+1)*Mid(b,d,1)
PHP , 124 octets
Essayez-le en ligne!
Élargi
la source
Perl 6 , 150 octets
la source
APL (NARS), 36 caractères, 72 octets
il semble que 10⊥ (9..2) ⊤ soit meilleur que la fonction récursive, grâce à Howard pour l'autre solution APL qui montre que ... (même si je ne comprends pas 100%). Entrée pour les nombres sans '!' <10 !. Tester:
la source