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.Respuestas:
Python 2,
138122bytesEsto busca números sagrados de hasta 5 N para una entrada N , que es ridículamente lenta:
Aquí el límite es de 5 N 2 , y en realidad puede ejecutar los casos de prueba, a costa de un solo byte:
El primer fragmento es válida, como 5 N ≥ 5 N 2 para todos los números enteros positivos N .
fuente
Lua, 317 bytes
Tuve algunos problemas para hacer esto, algunas cosas en Lua no funcionan como creo que sí. Tendré que intentar jugar con ellos si quiero jugar golf. Puede probar lua en línea reemplazándolo
arg[1]
por la cantidad de elementos que desee :).Sin golfos y explicaciones
Los ternar anidados utilizados para el nuevo valor de
m
se pueden traducir en if anidados como:Además, me hubiera encantado reemplazar el anidado
for
usandotable.sort
, pero, por una razón que no sé, lo siguiente no funciona a pesar de no producir un bucle infinito o aplastar la función de clasificación.fuente
JavaScript (ES6),
166165 bytesEditar: guardado 1 byte devolviendo una serie de cadenas.
Sin golf:
fuente