A raiz digital (também soma digital repetida) de um número inteiro positivo é o valor (um dígito) obtido por um processo iterativo de soma de dígitos, em cada iteração usando o resultado da iteração anterior para calcular uma soma de dígitos. O processo continua até que um número de um dígito seja alcançado.
Por exemplo, a raiz digital de 65536 é 7 , porque 6 + 5 + 5 + 3 + 6 = 25 e 2 + 5 = 7 .
Classificar todas as raízes digitais não faz muito sentido, uma vez que começaria com infinitos 1 s.
Em vez disso, criaremos listas de todos os números inteiros de um dígito, juntamente com suas raízes digitais, depois todos os números de dois dígitos, juntamente com suas raízes digitais, depois os triplos, quádruplos e assim por diante.
Agora, para cada uma dessas listas, classificaremos para que todos os números inteiros com raízes digitais de 1 apareçam primeiro, depois todos os números inteiros com raízes digitais de 2 e assim por diante. A classificação será estável, de modo que a lista de números inteiros com determinadas raízes digitais deve estar em ordem crescente após a classificação.
Por fim, concatenaremos essas listas em uma única sequência. Essa sequência começará com todos os números de um dígito, depois todos os números de dois dígitos (classificados por sua raiz digital), depois todos os números de três dígitos e assim por diante.
Desafio:
Pegue um número inteiro positivo n como entrada e imprima o número n- ésimo na sequência descrita acima. Você pode escolher se a lista é 0 - indexada a 1 - indexada.
A sequência é assim:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91, 11, 20, 29 ...
72, 81, 90, 99, 100, 109, 118, ...
981, 990, 999, 1000, 1009, 1018, 1027, ...
Casos de teste:
Os casos de teste são 1 indexados.
n f(n)
9 9
10 10
11 19
40 13
41 22
42 31
43 40
44 49
45 58
600 105
601 114
602 123
603 132
604 141
605 150
4050 1453
4051 1462
4052 1471
4053 1480
4054 1489
4055 1498
Mais fácil de copiar:
n = 9, 10, 11, 40, 41, 42, 43, 44, 45, 600, 601, 602, 603, 604, 605, 4050, 4051, 4052, 4053, 4054, 4055,
f(n) = 9, 10, 19, 13, 22, 31, 40, 49, 58, 105, 114, 123, 132, 141, 150, 1453, 1462, 1471, 1480, 1489, 1498
Esclarecimentos:
- Você não pode produzir todos os n primeiros elementos. Você deve apenas produzir o n 'ésimo.
- Teoricamente, o código deve funcionar para todos os números inteiros até 10 ^ 9 , mas não há problema se o tempo limite exceder o TIO (ou outros intérpretes com restrições de tempo) para entradas maiores que 999 .
- As explicações são incentivadas.
É código-golfe , então o código mais curto em cada idioma vence! Não desanime com outras soluções no idioma em que deseja jogar golfe, mesmo que sejam menores do que o que você pode gerenciar!
Respostas:
Python 2 ,
7860524645 bytes-6 bytes graças a GB .
-1 byte graças a Jakob .
Experimente online!
Finalmente chegou a um formulário fechado, indexado em 1.
Python 2 , 78 bytes
Indexado a 0.
Experimente online!
fonte
Python 3 , 80 bytes
Experimente online!
1 indexado. Este é o melhor que eu pude gerenciar no Python 3 (bem, exceto pelo 78-byter , que é uma porta da minha solução Python 2 abaixo; acho que este é muito mais interessante). Os programas completos do Python 2 são vantajosos para esse desafio em particular, porque
input()
precisa de uma conversão paraint
no Python 3 (+5 bytes),exec
é uma função, e não uma instrução (+2 bytes) e/
executa a divisão inteira por padrão se seus argumentos forem inteiros em Py 2 (+1 byte), então isso é definitivamente mais curto do que responder à resposta dos ovs .Como funciona
Configuração
Isso define uma função recursiva f que recebe um argumento inteiro ie outro, k , cujo padrão é 1 . Enquanto k ≤ i , a função f retorna f (i, 10k) , multiplicando k por 10 a cada vez até que se torne maior que i .
Alcance alvo e indexação correta
Após esse conjunto de operações, ficamos com i , a entrada inicial e a variável k, que representa a menor potência de 10 maior que i . Dessa forma, somos capazes de gerar o intervalo (inteiro) [floor (k / 10), k) , que basicamente inclui todos os números inteiros que são:
Como desconsideramos os números inteiros menores que x = floor (k / 10) , devemos mudar a indexação para que contabilizemos os números ausentes. A maneira óbvia é subtrair sua contagem, x , de i , para indexarmos na lista (após a classificação, que é descrita abaixo), tendo, portanto, ix . No entanto, como a lista contém 9k / 10 , itens e a indexação em uma lista no índice -y, para alguns y positivos, produz o y- ésimo elemento do final do Python, isso é simplesmente equivalente à indexação com ik , economizando 4 bytes.
Classificando cada pedaço pela raiz digital
A fórmula da função raiz digital é 1 + ((n-1) mod 9) (consulte a seção Fórmula de congruência deste artigo da Wikipedia ). Como 1 seria adicionado a cada um deles, é supérfluo ao classificar, então ficamos com o (n-1) mod 9 . A maneira como o
%
operador do Python funciona quando recebem números negativos no RHS é muito conveniente, porque podemos usar n pymod -9 para salvar ainda mais um byte.Python 2 , 72 bytes
Inspirado pela submissão de Chas Brown .
Experimente online!
fonte
Python 2 ,
737170 bytesExperimente online!
2 bytes thx para o Sr. XCoder ; e 1 byte thx para H.PWiz .
Este é o índice 0.
fonte
i%9
deve ser suficiente em vez dei%9+1
... desta maneira você venceu meu 72 byter: DD:len(`~i`)
deve funcionar #Geléia ,
15 14 109 bytesExperimente online!
Quão?
Usa uma versão em golf da solução de formulário fechado criada por ovs em sua resposta em Python ...
A fórmula exposta por ovs é: 9 * (n% b) + (n / b) + b - 1 que b = 10 andar (log (n, 10))
Agora, se c é a contagem de dígitos decimais de n, então b-1 é c-1 noves em decimal.
É igual a nove vezes o valor de c-1 ones em decimal (por exemplo
111*9=999
).Além disso, n / b é o dígito à frente de n e n% b é o restante dos dígitos como um número decimal.
Uma fórmula como b * x + y pode ser implementada como uma conversão da
[x,y]
base b(ou seja, b ^ 1 * x + b ^ 0 * y = b * x + y )
Como tal, podemos pegar um número, n (por exemplo
7045
), dividi-lo nos dígitos inicial e final, colocando o dígito inicial no final ([[0,4,5],7]
), adicionar um a todos os dígitos do primeiro item para atender à adição de b-1 ([[1,5,6],7]
) converte-os das listas decimais em números inteiros ([156,7]
) e converte-os da base nove (1411
).Na implementação abaixo, adicionamos um a todos os dígitos de ambos os itens ao atender b-1 (
[[0,4,5],8]
), convertemos de listas decimais em números inteiros ([156,8]
), convertemos da base nove (1412
) e subtraímos o que esse processo adicionou (1411
).Anterior, 14 byter:
Experimente online!
Este constrói a lista até a próxima potência de 10 acima da entrada, classificando esses números naturais e, em
[digitalRoot, digitCount]
seguida, localiza o valor no índice inserido.fonte
Haskell ,
9488 bytesExperimente online! Indexado a 0.
Explicação:
A compreensão da lista gera a sequência como lista infinita na qual indexamos
!!
:x
é um a menos que o número atual de dígitos e é extraído da lista infinita[0,1,2,3, ...]
i
itera no intervalo de1
a9
e é utilizado para a classificação por as raízes digitaisn
itera sobre todos os números comx+1
dígitosuntil(<10)(sum.map(read.pure).show)
calcula a raiz digital ( veja aqui uma explicação )n
é adicionado à lista se sua raiz digital for iguali
.fonte
Retina , 65 bytes
Experimente online! 1 indexado. Explicação:
Construa uma lista de linhas de
_
s de 0 até a próxima potência de 10 (exclusiva).Classifique todos eles em ordem de raiz digital.
Converta de unário para decimal.
Classifique-os em ordem de comprimento.
Extraia o
n
elemento th.fonte
Pitão ,
36 31 25 24 2322 bytes1 indexado.
Suíte de teste!
Como funciona (desatualizado)
fonte
05AB1E ,
1911 bytesPorta da minha resposta Python .
-6 bytes (!) Graças a Kevin Cruijssen .
Experimente online!
fonte
g<°©÷¹®%9*®O<
. Aqui está a explicação que eu estava prestes a postar .Pitão , 23 bytes
Experimente aqui.
-3 graças a Mr. Xcoder
1 indexado.
fonte
Perl 6 ,
6858 bytesTeste com base em 0
Teste com base em 1
Expandido:
fonte
Ruby ,
4338 bytesExperimente online!
Originalmente, uma porta da excelente resposta Python de ovs e depois simplificava um pouco mais.
fonte
Java 8, 68 bytes
Porta chata da resposta do @ovs 'Python 2 , portanto, certifique-se de votar nele!
-1 byte graças a @Jakob
Experimente online.
fonte
K4 , 38 bytes
Solução:
Exemplos:
Explicação:
A solução do porto de Jonathan Allan, quando eu ficar sem memória, construindo as raízes digitais de 1 a 1e9.
Bônus:
A tradução da solução dos ovs é mais simples, mas mais longa:
fonte
Geléia , 19 bytes
Experimente online!
-1 graças a Mr. Xcoder .
1 indexado.
fonte
J, 24 bytes
Este tácito expressão é agrupada em parênteses para significar que deve ser tratada por si só e não como parte de qualquer expressão a seguir (como os argumentos).
A frase '] /:' ordena (ascendente '/:') a matriz original ']' pela soma '+ /' dos dígitos A expressão
converte um número em um vetor de caracteres com '":' e aplica seu inverso '".' - caractere para número - aplicado a cada item '&>'. Portanto, 65536 -> '65536' -> 6 5 5 3 6.
A conjunção de potência '^:' perto do final da expressão aplica o código que acabamos de explicar (à esquerda) um número especificado de vezes. Nesse caso, o número especificado de vezes é o infinito '_', o que significa continuar aplicando até que o resultado pare de mudar.
O final "" 0 "significa aplicar toda a expressão à esquerda em cada item escalar (0-dimensional) à direita, que seria a matriz de números à qual queremos aplicar isso.
fonte
Elixir , 239 bytes
Experimente online!
Explicação recebida (lentamente)! Acho que não pode ficar muito mais curto que isso, mas estou sempre aberto a sugestões
fonte
Perl 5
-pF
, 27 bytesExperimente online!
Usa a fórmula de @ ovs e as explicações de @ JonathanAllen para criar um bom código compacto.
fonte