Comme nous l'avons appris de The Holy Numbers , il y a 5 chiffres saints ( 0, 4, 6, 8, 9
), et les entiers positifs composés uniquement de ces chiffres sont saints. De plus, la sainteté d'un nombre est la somme des trous dans le nombre ( +2
pour chaque 0
ou 8
, et +1
autrement).
Maintenant, il y a une propriété supplémentaire à prendre en considération, pour représenter véritablement et avec précision la sainteté d'un nombre. Vous voyez, ce n'est pas seulement le nombre de trous dans le chiffre qui importe, mais aussi l'endroit où le nombre se produit.
Considérez le nombre 88
. Selon nos anciennes règles, il aurait une sainteté de 4
. Mais ce n'est pas juste! La 8
gauche fait plus de travail que l'autre 8
- 10 fois le travail! Il devrait être récompensé pour son travail. Nous le récompenserons avec des points de sainteté supplémentaires égaux à la sainteté totale de tous les chiffres à sa droite (y compris les points de sainteté supplémentaires accordés par cette règle aux chiffres à sa droite), moins 1.
Voici d'autres exemples à prendre en considération:
Number: 8080
Digital holiness: (2 + 7 - 1) + (2 + 3 - 1) + (2 + 1 - 1) + (2 + 0 - 1)
Total holiness: 15
Number: 68904
Digital holiness: (1 + 5 - 1) + (2 + 2 - 1) + (1 + 1 - 1) + (2 + 0 - 1) + (1 + 0 - 1)
Total holiness: 10
Tous les chiffres sont récompensés de manière appropriée pour leur travail avec une sainteté supplémentaire, et tout va bien. Nous appellerons cette propriété "holarité renforcée".
Dans le grand langage Python, un algorithme pour calculer l'holarité améliorée pourrait ressembler à ceci:
# assumes n is a holy number
def enhanced_holarity(n):
if n < 10:
return 1 if n in [0, 8] else 0
else:
digits = list(map(int,str(n)[::-1]))
res = []
for i,x in enumerate(digits):
res.append(enhanced_holarity(x))
if i > 0:
res[i] += sum(res[:i])
return sum(res)
Le défi
Étant donné un entier n > 0
, sortez les premiers n
nombres saints, triés par holarité améliorée ascendante, en utilisant la valeur numérique comme bris d'égalité. Vous pouvez supposer que l'entrée et la sortie ne seront pas supérieures à l'entier représentable maximum dans votre langue ou 2^64 - 1
, selon le moindre des deux.
Pour référence, voici quelques cas de test (entrée, puis sortie):
25
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 0, 8, 84, 86, 89, 40, 48, 60, 68, 90, 98, 80, 88
100
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 800, 808, 880, 888
200
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 944, 946, 949, 964, 966, 969, 994, 996, 999, 4444, 4446, 4449, 4464, 4466, 4469, 4494, 4496, 4499, 4644, 4646, 4649, 4664, 4666, 4669, 4694, 4696, 4699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 904, 906, 909, 984, 986, 989, 4044, 4046, 4049, 4064, 4066, 4069, 4094, 4096, 4099, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 940, 948, 960, 968, 990, 998, 4404, 4406, 4409, 4484, 4486, 4489, 4604, 4606, 4609, 4684, 4686, 4689, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 900, 908, 980, 988, 4004, 4006, 4009, 4084, 4086, 4089, 800, 808, 880, 888, 4440, 4448, 4460, 4468, 4490, 4498, 4640, 4648, 4660, 4668, 4690, 4698, 4040, 4048, 4060, 4068, 4090, 4098, 4400, 4408, 4480, 4488, 4600, 4608, 4680, 4688, 4000, 4008, 4080, 4088
2^64 - 1
? Si tel est le cas, il vaut probablement la peine de déterminer quelle entrée génère en premier de tels nombres, afin que les gens puissent tester leurs réponses.