Wie wir aus den heiligen Zahlen erfahren haben , gibt es 5 heilige Ziffern ( 0, 4, 6, 8, 9
), und positive ganze Zahlen, die nur aus diesen Ziffern bestehen, sind heilig. Außerdem ist die Heiligkeit einer Zahl die Summe der Löcher in der Zahl ( +2
für jedes 0
oder 8
und +1
sonstiges).
Nun gibt es eine zusätzliche Eigenschaft, die berücksichtigt werden muss, um die Heiligkeit einer Zahl wirklich und genau darzustellen. Sie sehen, es kommt nicht nur auf die Anzahl der Löcher in der Ziffer an, sondern auch darauf, wo sie vorkommt.
Betrachten Sie die Nummer 88
. Nach unseren alten Regeln hätte es eine Heiligkeit von 4
. Das ist aber kaum fair! Die 8
linke macht mehr Arbeit als die andere 8
- zehnmal so viel ! Es sollte für seine Arbeit belohnt werden. Wir werden es mit zusätzlichen Heiligkeitspunkten belohnen, die der Gesamtheiligkeit aller Ziffern zu seiner Rechten entsprechen (einschließlich der zusätzlichen Heiligkeitspunkte, die diese Regel den Ziffern zu seiner Rechten gewährt), minus 1.
Hier sind weitere Beispiele zu berücksichtigen:
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
Alle Ziffern werden für ihre Arbeit angemessen mit zusätzlicher Heiligkeit belohnt, und alles ist in Ordnung. Wir werden diese Eigenschaft "verstärkte Ganzheitlichkeit" nennen.
In der großartigen Sprache Python könnte ein Algorithmus zur Berechnung der erweiterten Holarität ungefähr so aussehen:
# 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)
Die Herausforderung
Bei einer gegebenen Ganzzahl n > 0
werden die ersten n
heiligen Zahlen ausgegeben , sortiert nach aufsteigender verstärkter Holarität, wobei der numerische Wert als Tiebreaker verwendet wird. Sie können davon ausgehen, dass die Eingabe und Ausgabe nicht größer ist als die maximal darstellbare Ganzzahl in Ihrer Sprache oder 2^64 - 1
, je nachdem, welcher Wert kleiner ist.
Als Referenz sind hier einige Testfälle (Eingabe, gefolgt von Ausgabe):
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
? In diesem Fall lohnt es sich wahrscheinlich herauszufinden, welche Eingabe zuerst solche Zahlen generiert, damit die Benutzer ihre Antworten testen können.