Como aprendimos de The Holy Numbers , hay 5 dígitos sagrados ( 0, 4, 6, 8, 9
), y los enteros positivos que consisten únicamente en esos dígitos son santos. Además, la santidad de un número es la suma de los agujeros en el número ( +2
para cada 0
o 8
, y de lo +1
contrario).
Ahora, hay una propiedad adicional a tener en cuenta, para representar de manera verdadera y precisa la santidad de un número. Verá, lo que importa no es solo el número de agujeros en el dígito, sino también en qué parte del número ocurre.
Considera el número 88
. Según nuestras viejas reglas, tendría una santidad de 4
. ¡Pero eso no es justo! El 8
de la izquierda está haciendo más trabajo que el otro 8
, ¡10 veces el trabajo! Debe ser recompensado por su trabajo. Lo recompensaremos con puntos de santidad adicionales equivalentes a la santidad total de todos los dígitos a su derecha (incluidos los puntos de santidad adicionales otorgados por esta regla a los dígitos a su derecha), menos 1.
Aquí hay más ejemplos a tener en cuenta:
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
Todos los dígitos son recompensados adecuadamente por su trabajo con santidad extra, y todo está bien. Llamaremos a esta propiedad "mayor hollaridad"
En el gran lenguaje Python, un algoritmo para calcular la hollaridad mejorada podría verse así:
# 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)
El reto
Dado un número entero n > 0
, n
genera los primeros Números Sagrados, ordenados por una mayor hollaridad ascendente, utilizando el valor numérico como un desempate. Puede suponer que la entrada y la salida no serán mayores que el número entero máximo representable en su idioma o 2^64 - 1
, lo que sea menor.
Como referencia, aquí hay algunos casos de prueba (entrada, seguido de salida):
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 ese es el caso, probablemente valga la pena averiguar qué entrada genera primero esos números, para que las personas puedan probar sus respuestas.