Como aprendemos com The Holy Numbers , existem 5 dígitos sagrados ( 0, 4, 6, 8, 9
), e números inteiros positivos consistindo apenas desses dígitos são sagrados. Além disso, a santidade de um número é a soma dos furos no número ( +2
para cada 0
ou 8
, e +1
de outro modo).
Agora, há uma propriedade adicional a ser levada em consideração, para representar de maneira verdadeira e precisa a santidade de um número. Veja bem, não é apenas o número de furos no dígito que importa, mas também o local em que ocorre.
Considere o número 88
. Pelas nossas velhas regras, teria uma santidade 4
. Mas isso não é justo! O 8
lado esquerdo está fazendo mais trabalho que o outro 8
- 10 vezes o trabalho! Deve ser recompensado por seu trabalho. Nós o recompensaremos com pontos de santidade extras iguais à santidade total de todos os dígitos à sua direita (incluindo os pontos de santidade extras concedidos por esta regra aos dígitos à direita), menos 1.
Aqui estão mais exemplos a serem levados em consideração:
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 os dígitos são adequadamente recompensados por seu trabalho com santidade extra, e tudo está bem. Vamos chamar essa propriedade de "holaridade aprimorada".
Na grande linguagem Python, um algoritmo para calcular a holaridade aprimorada pode ser algo como isto:
# 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)
O desafio
Dado um número inteiro n > 0
, n
produza os primeiros Números Sagrados, classificados por holaridade aprimorada crescente, usando o valor numérico como desempatador. Você pode assumir que a entrada e a saída não serão maiores que o número máximo máximo representável no seu idioma ou 2^64 - 1
, o que for menor.
Para referência, aqui estão alguns casos de teste (entrada, seguidos por saída):
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
? Se for esse o caso, provavelmente vale a pena descobrir qual entrada gera esses números primeiro, para que as pessoas possam testar suas respostas.Respostas:
Python 2,
138122 bytesIsso procura números sagrados de até 5 N para uma entrada N , que é ridiculamente lenta:
Aqui o limite é 5 N 2 e você pode realmente executar os casos de teste, ao custo de um único byte:
O primeiro fragmento é válido, como 5 N ≥ 5 N 2 para todos os números inteiros positivos N .
fonte
Lua, 317 bytes
Eu tive alguns problemas ao fazer isso, algumas coisas em Lua não funcionam como eu acho. Vou ter que tentar jogar com eles, se quiser jogar golfe. Você pode testar o lua online substituindo
arg[1]
pelo número de elementos que deseja :).Ungolfed e explicações
Os ternários aninhados usados para o novo valor de
m
podem ser traduzidos em ifs aninhados como:Além disso, eu adoraria substituir o aninhado
for
usandotable.sort
, mas, por um motivo que não sei, o seguinte não funciona, apesar de não produzir um loop infinito ou esmagar a função de classificação.fonte
JavaScript (ES6),
166165 bytesEditar: salvou 1 byte retornando uma matriz de seqüências de caracteres.
Ungolfed:
fonte