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.Réponses:
Python 2,
138122 octetsCela recherche des nombres saints jusqu'à 5 N pour un N d' entrée , ce qui est ridiculement lent:
Ici, la limite est de 5 N 2 , et vous pouvez réellement exécuter les cas de test, au prix d'un seul octet:
Le premier extrait est valide, comme 5 N ≥ 5 N 2 pour tous les entiers positifs N .
la source
Lua, 317 octets
J'ai eu quelques problèmes à faire ça, certaines choses à Lua ne fonctionnent pas comme je pense. Je vais devoir essayer de jouer avec eux si je veux jouer au golf. Vous pouvez tester lua en ligne en remplaçant
arg[1]
par le nombre d'éléments que vous souhaitez :).Non golfé et explications
Les ternaires imbriqués utilisés pour la nouvelle valeur de
m
peuvent être traduits en if imbriqués comme:De plus, j'aurais aimé remplacer le niché
for
en utilisanttable.sort
, mais, pour une raison que je ne sais pas, ce qui suit ne fonctionne pas malgré le fait de ne pas produire une boucle infinie ou d'écraser la fonction de tri.la source
JavaScript (ES6),
166165 octetsEdit: enregistré 1 octet en retournant un tableau de chaînes.
Non golfé:
la source