Nota: Esta é uma tentativa de reciclar a (s) pergunta (s) de permutação de guest271314
Existe um padrão interessante que se forma quando você encontra as diferenças entre permutações lexograficamente classificadas dos números da base 10 com dígitos únicos ascendentes. Por exemplo, 123
tem permutações:
123 132 213 231 312 321
Quando você encontra as diferenças entre elas, obtém a sequência
9 81 18 81 9
Quais são todos divisíveis por nove (por causa da soma dos dígitos dos números da base 10), além de palindrômicos.
Notavelmente, se usarmos o próximo número 1234
, obtemos a sequência
9 81 18 81 9 702 9 171 27 72 18 693 18 72 27 171 9 702 9 81 18 81 9
O que estende a sequência anterior e permanece palindrômico em torno de . Esse padrão sempre é válido, mesmo quando você começa a usar mais 10
números, embora o comprimento da sequência seja para números. Observe que, para usar os números acima 0 to 9
, não mudamos para uma base diferente, apenas multiplicamos o número por , por exemplo, .
Seu objetivo é implementar essa sequência, retornando cada elemento como um múltiplo de nove. Por exemplo, os 23 primeiros elementos dessa sequência são:
1 9 2 9 1 78 1 19 3 8 2 77 2 8 3 19 1 78 1 9 2 9 1
Alguns outros casos de teste (0 indexados):
23 => 657
119 => 5336
719 => 41015
5039 => 286694
40319 => 1632373
362879 => 3978052
100 => 1
1000 => 4
10000 => 3
100000 => 3
Regras:
- O envio pode ser:
- Um programa / função que pega um número e retorna o número nesse índice, 0 ou 1 indexado.
- Uma função de programa / que tem um número e retorna-se para a th índice, 0 ou 1 indexado.
- Um programa / função que gera / retorna a sequência infinitamente.
- O programa deve ser capaz de lidar teoricamente com os elemento e além, embora eu entenda se as restrições de tempo / memória fazem com que isso falhe. Em particular, isso significa que você não pode concatenar os dígitos e avaliar como base 10, pois algo como estaria errado.
- Isso é código-golfe , então a implementação mais curta para cada idioma vence!
Notas:
- Este é o OEIS A217626
- Ofereço uma recompensa de 500 por uma solução que elabore os elementos diretamente, sem calcular as permutações reais.
- A sequência funciona para qualquer dígito contíguo. Por exemplo, as diferenças entre as permutações de são as mesmas que para .
fonte
3628799 => -83676269
Respostas:
Geléia , 9 bytes
Experimente online! (imprima o n-ésimo elemento)
Experimente online! (20 primeiros elementos)
Explicação:
(A Jelly possui o built-in
œ?
que calcula an
permutação de uma lista em tempo aproximadamente linear. Bastante útil.)fonte
Carvão , 71 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Obtenha uma lista contendo a entrada e mais uma que a entrada.
Repita até que ambos os valores sejam zero.
Realize a conversão da base fatorial em ambos os valores. Esta é a primeira vez que eu realmente usei
≧
em uma lista!Limpe o resultado.
Faça um loop sobre cada número base fatorial.
Faça uma lista dos dígitos de 0 a comprimento - 1.
Inicialize o resultado em uma lista vazia.
Faça um loop sobre os dígitos do número base fatorial.
Adicione o próximo dígito de permutação ao resultado.
Remova esse dígito da lista.
Converta a permutação como um número base 10 e subtraia o resultado até agora.
Divida o resultado final por 9 e faça a sequência.
fonte
Perl 6 , 82 bytes
-2 bytes graças a Jo King
Experimente online!
Indexado a 0. Não enumera todas as permutações. Teoricamente, deve funcionar para todos os n, mas é compatível com n> 65536 com "Muitos argumentos na matriz de nivelamento".
A seguinte versão de 80 bytes funciona para n até 98! -2 e é muito mais rápida:
Experimente online!
A versão de 53 bytes a seguir deve, teoricamente, funcionar para todos os n, mas é defasada para n> = 20 com "recusando-se a permutar mais de 20 elementos".
Experimente online!
fonte
JavaScript (Node.js) , 134 bytes
Experimente online!
1 indexado.
A opinião de @ guest271314 está certa. O cálculo da permutação direta é mais curto ...
Explicação
Solução original (159 bytes)
Experimente online!
O link é para uma versão mais longa feita para desempenho.
Array(n+1)
torna-seArray(Math.min(n+1,15))
para fazer o trabalho de demonstração. Teoricamente, funciona até o infinito (na prática, até o limite de empilhamento).Explicação
Quero dizer, há muito para explicar.
fonte
n
, esta solução stackoverflow.com/a/34238979 fornece um meio para obter dois permutações adjacentes, ou representações número de permutações diretamente por índice, que quando golfed, deve reduzir o código necessário para produzir a saída(f(n) - f(n-1))/9
para esse tipo de resposta selecionado consistente com a regra "Um programa / função que pega um número e retorna o número nesse índice, 0 ou 1 indexado". .Pyth,
1514 bytesRetorna o enésimo termo. Experimente aqui .
fonte
J ,
44, 41 bytesExperimente online!
Nota: funciona mesmo para 10! caso de teste, mas perde alguma precisão lá ...
explicação original
fonte
JavaScript (ES6), 112 bytes
Muito parecido com o algoritmo de Shieru Asakoto .
Experimente online!
fonte