Un entier positif peut être représenté dans une base entière 1 <= b < inf
.
Lorsqu'il est converti dans cette base, il a un certain nombre de chiffres distincts.
Tout entier positif dans la base 1
a 1
un chiffre distinct.
La plupart des entiers positifs dans la base 2
ont 2
des chiffres distincts, les exceptions étant celles de la forme 2^n - 1
, qui ne l'ont que 1
.
Ainsi, le premier entier positif qui peut être représenté dans une base entière avec 1
un chiffre unique est 1
et le premier qui peut être représenté avec 2
des chiffres distincts est 2
.
On peut dire que 1
c'est le premier entier à diversité numérique 1
et 2
le premier entier à diversité numérique 2
.
Défi:
Étant donné un entier positif, n
renvoyez le premier entier positif (en base dix *) qui a une diversité numérique de n
.
* si votre langue ne prend en charge qu'une base spécifique (par exemple, unaire ou binaire), vous pouvez sortir dans cette base.
Votre algorithme doit fonctionner en théorie pour toute entrée entière positive: il peut échouer car la précision de l'entier de votre langue est trop petite pour la sortie; mais peut échouer car la conversion de base n'est définie que jusqu'à une certaine limite.
Cas de test
input output
1 1
2 2
3 11
4 75
5 694
6 8345
7 123717
17 49030176097150555672
20 5271200265927977839335179
35 31553934355853606735562426636407089783813301667210139
63 3625251781415299613726919161860178255907794200133329465833974783321623703779312895623049180230543882191649073441
257 87678437238928144977867204156371666030574491195943247606217411725999221158137320290311206746021269051905957869964398955543865645836750532964676103309118517901711628268617642190891105089936701834562621017362909185346834491214407969530898724148629372941508591337423558645926764610261822387781382563338079572769909101879401794746607730261119588219922573912353523976018472514396317057486257150092160745928604277707892487794747938484196105308022626085969393774316283689089561353458798878282422725100360693093282006215082783023264045094700028196975508236300153490495688610733745982183150355962887110565055971546946484175232
C'est le code-golf , la solution la plus courte en octets gagne.
OEIS: A049363 - également le plus petit numéro pandigital dans la base n.
la source
Python, 40 octets
Testez-le sur Ideone .
Comment ça fonctionne
Un nombre à n chiffres distincts doit être clairement exprimé en base b ≥ n . Puisque notre objectif est de minimiser le nombre, b doit également être aussi petit que possible, donc b = n est le choix logique.
Cela nous laisse avec l'organisation des chiffres 0,…, n-1 pour créer un nombre aussi petit que possible, ce qui signifie que les chiffres les plus significatifs doivent être aussi petits que possible. Comme le premier chiffre ne peut pas être un 0 dans la représentation canonique, le plus petit nombre est
(1) (0) (2) ... (n-2) (n-1) n = n n-1 + 2n n-3 +… + (N-2) n + (n-1) , que f calcule récursivement.
la source
Python 2,
5446 octetsC'est un très très très ! solution rapide et itérative.
Essayez-le en ligne
Il n'y a pas de récursivité, donc cela fonctionne pour de grandes entrées. Voici le résultat de
n = 17000
(prend 1-2 secondes):http://pastebin.com/UZjgvUSW
la source
lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
JavaScript (ES6), 29 octets
la source
J, 9 octets
Basé sur la méthode @Dennis .
Usage
Explication
Il existe une solution alternative basée sur l'utilisation de l'indice de permutation. Étant donné l'entrée n , créez la liste des chiffres
[0, 1, ..., n]
et recherchez la permutation en utilisant un index de n !, Et convertissez-la en une liste de chiffres n de base . La solution correspondante en J pour 12 octetsla source
[1,0,2,3,...,n-1]
?Rubis,
373534 octetsLa réponse pour une donnée
n
prend la forme10234...(n-1)
en basen
. En utilisantn=10
comme exemple:Commencez par
n
:10
Multipliez par
n
et ajoutez 2:102
Multiplier par
n
et ajouter 3:1023
Etc.
EDIT: Il est plus court d'utiliser la carte, semble-t-il.
EDIT 2: Merci pour le conseil, m-chrzan!
la source
(2...n)
sera un octet plus court.CJam , 9 octets
Essayez-le en ligne!
Explication
la source
CJam (9 octets)
Démo en ligne
Dissection
Évidemment, le plus petit nombre avec une diversité numérique
n
est trouvé par conversion[1 0 2 3 ... n-1]
de base en basen
. Cependant, notez que la conversion de base intégrée ne nécessite pas que les chiffres soient dans la plage0 .. n-1
.Notez que dans le cas spécial,
n = 1
nous obtenons1 [0] 1 1 tb
ce1 [0 1] b
qui est1
.la source
Haskell, 31 octets
Convertit la liste
[n,2,3,...,n-1]
en base enn
utilisant la méthode de Horner via le pliage. Une version moins golfée de ceci est donnée sur la page OEIS .Merci à nimi pour 3 octets!
la source
f
?) Pour être une solution de golf valide? (il n'est tout simplementf
pas référencé plus tard dans le code)\n->fold1...
, ce qui est aussi long que le nommer. Vous pouvez écrire une fonction sans point où la variable d'entrée n'est pas nommée en combinant des sous-fonctions, mais ce serait terrible ici avec trois références àn
.foldl
et commencer parn
:f n=foldl((+).(*n))n[2..n-1]
05AB1E , 9 octets
Essayez-le en ligne!
Explication
n = 4
utilisé par exemple.la source
C ++ -
18155Était sur le point de publier cette vraie solution cool en utilisant
<numeric>
:puis j'ai réalisé que c'était beaucoup plus facile:
la source
Perl 6 ,
34 3130 octetsTraduit de l'exemple Haskell sur la page OEIS .
[&(…)]
se transforme…
en un opérateur infixe sur place[…]
illustration ci-dessus transforme un op infixe en un pli (gauche ou droite selon l'associativité de l'opérateur)Étendu:
Usage:
la source
Brain-Flak ,
8476 octetsMerci à Wheat Wizard pour avoir joué au golf 8 octets
Essayez-le en ligne!
Explication
Le programme pousse les valeurs de
0
àn-1
vers la pile remplace le haut0
et1
avec1
et0
. Ensuite, il multiplie le haut de la pile parn
et ajoute la valeur en dessous jusqu'à ce qu'il ne reste qu'une seule valeur sur la pile.Essentiellement, il trouve les chiffres du plus petit nombre dans la base
n
qui contientn
différents chiffres (pourn
> 1, il est toujours de la forme1023...(n-1)
). Il calcule ensuite le nombre en fonction des chiffres et de la base.Code annoté
la source
{}{}(()(<()>))([][()])
par(<{}{}>)([(())][])
pour économiser quatre octets(<{}{}>)((()))
pour économiser quatre octets supplémentairesJulia, 26 octets
Essayez-le en ligne!
la source
ShapeScript , 25 octets
L'entrée est en unaire, la sortie est en décimal. Essayez-le en ligne!
la source
PHP, 78 octets
Version en ligne
60 octets ne fonctionne que jusqu'à n = 16 avec la précision des tests
Pour n = 144 INF
n = 145 NAN
la source
k, 12 octets
Basé sur la réponse de Dennis .
la source
JavaScript (ES6), 39 octets
N'utilise pas
=>
la source