Numéros confidentiels
Soit x
un entier d'une base arbitraire, tel qu'un D
tableau de ses chiffres. x
est un nombre confidentiel si, pour tous n
entre 1
et la longueur de D
:
D[n+1] = D[n] + D[n-1] + ... + D[1] + n
Prenons, par exemple, le nombre 349
en base 10. Si nous étiquetons les indices de ce nombre, nous avons ce qui suit.
Index Digit
----- -----
1 3
2 4
3 9
À partir du premier chiffre, nous avons 1 + 3 = 4
, ce qui donne le chiffre suivant. Ensuite, avec le deuxième chiffre que nous avons 3 + 4 + 2 = 9
, qui, encore une fois, donne le chiffre suivant. Ainsi, ce nombre est un nombre confidentiel.
Étant donné un entier dont la base est comprise entre 1 et 62, calculez tous les nombres confidentiels pour cette base et affichez-en une liste, séparés par des retours à la ligne. Vous pouvez supposer qu'il existe une quantité finie de nombres confidentiels pour une base donnée.
Pour les chiffres supérieurs à 9, utilisez les caractères alpha A-Z
et pour les chiffres supérieurs à, Z
utilisez les caractères alpha a-z
. Vous n'aurez pas à vous soucier des chiffres au-delà z
.
Ils ne doivent pas être sortis dans un ordre particulier.
Exemple d'entrée:
16
Exemple de sortie:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F
C'est le golf de code, donc le code le plus court gagne. Bonne chance!
(Merci à Zach d'avoir aidé au formatage et signalé quelques problèmes.)
CD
ne figure pas dans la liste? Étant donné que toutes les autres combinaisons où le deuxième chiffre est un de plus que le premier chiffre sont répertoriées, je ne comprends pas pourquoiCD
ne se qualifie pas.Réponses:
Pyth, 38 octets
Essayez-le en ligne: Démonstration
Explication:
la source
Python 2, 104 octets
Cela utilise l'observation suivante: dans un nombre confidentiel, le chiffre
i
est suivi2*i+1
, sauf qu'il s'agiti+1
plutôt du deuxième chiffre. En essayant tous les premiers chiffres possibles et en ajoutant plus de chiffres jusqu'à ce qu'ils deviennent trop gros, nous pouvons générer tous les numéros confidentiels.Nous calculons le caractère correspondant au nombre
i
aschr(48+i+(i>9)*7+i/36*6)
, ce qui le déplace dans le nombre, la lettre majuscule ou la plage de lettres majuscules pour les intervalles0-9, 10-35, 36-61
.Ensuite, nous augmentons
i
viai+=i+1
avec deux ajustements. Pour faire cela à la placei+=1
après le premier chiffre, nous ajoutons lai
condition d's
avoir plus de1
caractères. De plus, nous devons éviter que les nombres commençant par 0 ne soient imprimés, tout en permettant0
. Pour ce faire, nous faisons un hack qui provoque l'i=0
échec de la conditioni<n
sur la boucle suivante en l'ajoutantn
. Cela se fait en remplaçant1
parn**0**i
, qui s'associe à droite àn**(0**i)
, qui est égal àn**(i==0)
oun if i==0 else 1
.la source
Python 3,
201200 octetsExplication
L'idée clé ici est que, étant donné une séquence
x
(comme, disons,[1,2,5]
), vous pouvez obtenir le terme suivant dans la séquence avecsum(x)+len(x)
, ce qui donne11
dans ce cas (B
). Vérifiez si cela est inférieur àn
, et si c'est le cas, ajoutez la séquence étendue à la liste de toutes ces séquences (ensemencée par tous les chiffres).C'est ainsi que je mappe des éléments de séquence à des personnages. Ceux-ci sont
''.join
édités ensemble puis imprimés, séparés par des retours à la ligne.la source
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))
. De plus, il est actuellement de 201 octets; pas 200.GS2, 44 octets
Il produit les nombres dans un ordre différent, mais la description du problème ne le précise pas, alors j'y vais! Voici la sortie pour l'entrée de 16.
Voici les équivalents mnémoniques des octets:
la source
CJam,
464240 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
À la fin, 0 et quelques tableaux vides sont laissés sur la pile, donc l'interprète imprime
0
.la source
gawk, 111 octets
Pour chaque chiffre de départ de
1
to,base-1
il calcule les chiffres suivants, et bien qu'ils soient inférieurs à la base, nous avons toujours un numéro confidentiel. Calcul du chiffre suivant lors de l'impression. Imprime enfin0
.la source