Considere as potências inteiras positivas de cinco em decimal. Aqui estão os 25 primeiros, alinhados à direita:
X 5^X
1 5
2 25
3 125
4 625
5 3125
6 15625
7 78125
8 390625
9 1953125
10 9765625
11 48828125
12 244140625
13 1220703125
14 6103515625
15 30517578125
16 152587890625
17 762939453125
18 3814697265625
19 19073486328125
20 95367431640625
21 476837158203125
22 2384185791015625
23 11920928955078125
24 59604644775390625
25 298023223876953125
Observe que a coluna mais à direita dos poderes é todos 5
. A segunda coluna da direita é toda 2
. A terceira coluna da direita, leia de cima para baixo, os suplentes 1
, 6
, 1
, 6
, etc. Os começos próxima coluna 3
, 5
, 8
, 0
e, em seguida ciclos.
De fato, toda coluna (se descermos o suficiente) tem uma sequência de dígitos com um ciclo cujo comprimento é duas vezes maior que o do ciclo anterior, exceto os ciclos inicial 5
e final 2
.
Chamando N o número da coluna, começando com N = 1 à direita, os primeiros ciclos são:
N cycle at column N
1 5
2 2
3 16
4 3580
5 17956240
6 3978175584236200
7 19840377976181556439582242163600
8 4420183983595778219796176036355599756384380402237642416215818000
Desafio
Dado um número inteiro positivo N, insira os dígitos decimais do ciclo na coluna N, conforme descrito acima. Por exemplo, a saída para N = 4 seria 3580
.
Os dígitos podem ser impressos como uma lista, como [3, 5, 8, 0]
em outro formato razoável, desde que:
- Os dígitos estão em ordem, conforme lidos de cima para baixo nas colunas de energia. por exemplo,
0853
é inválido. - O ciclo começa com o número superior em sua coluna de potência. por exemplo,
5803
é inválido, pois a quarta coluna começa com3
não5
. - Exatamente um ciclo é produzido. por exemplo,
358
ou35803
ou35803580
todos seriam inválidos.
Seu código deve funcionar para pelo menos N = 1 a 30.
Se desejar, você pode assumir que as colunas são indexadas em 0 em vez de indexadas em 1. Então N = 0 dá 5
, N = 1 dá 2
, N = 2 dá 16
, N = 3 dá 3580
, etc.
O código mais curto em bytes vence .
2^(N-2)
excetoN = 1
Respostas:
Python 2,
626158 bytesBaseado em zero. Presumo que os sufixos L sejam aceitáveis.
Resultado:
Solução anterior:
Explicação:
A
range(2**n/2)
utiliza a observação de que cada ciclo tem comprimento r = 2 n-1 , excepto quando n = 0, por isso, apenas calcular os dígitos de ordem n para 5 m a 5 m + r - 1 .O início do ciclo de 5 m é o primeiro número maior que 10 n . Resolver 5 m ≥ 10 n fornece m ≥ n / log 10 5. Aqui aproximamos o log 10 5 ≈ 0,7, que será quebrado quando n = 72. Poderíamos adicionar mais dígitos para aumentar a precisão:
O
/ 10**n % 10
loop simplesmente extrai o dígito desejado. Outra solução alternativa usa manipulação de strings. Eu usei o truque~n == -n-1
aqui para remover 1 byte.Como mencionado no comentário, a expressão
5**(m+i) / 10**n
pode ser ainda mais simplificada dessa maneira, o que fornece a resposta atual de 58 bytes.(A divisão
x/2**n
pode ser feita usando o deslocamento à direita bit a bitx>>n
. Infelizmente, devido à precedência do operador do Python, isso não salva bytes.) A fração 3/7 também pode ser aprimorada em um mannar semelhante:fonte
(5**(n*3/7-~i)>>n)%10
. Como você está usando um poder de 5 dividido por um poder (menor) de 10, pode reduzir o poder de 5 e alternar para a direita.n/.7 - n
→n*10/7 - n
→n*3/7
. Em princípio, é extrair os dígitos da menor potência de 5 maior que 2ⁿ (com 3/7 uma aproximação para 1 / log₂ (5) ). Além disso, usar emrange(2**n/2or 1)
vez disso fornece uma saída consistente.(x>>n)%10
não melhora,x/2**n%10
então não uso o deslocamento de bits por enquanto, pois talvez haja uma maneira de fatorar o comum2**n
.2**n
, mas parece um pouco mais longa:int(5**(-~i-n*log(2,5)%1))%10
(simplifiqueiint(n*log(2,5))-n*log(2,5)
como-(n*log(2,5)%1)
).2**n
argumento aqui e o intervalo.dc , 72 bytes
Indexação baseada em 0.
Isso usa aritmética inteira exata - sem aproximações de logaritmo. Ele funcionará até a capacidade de memória do computador.
Experimente o programa dc online!
O código dc pode ser transformado em uma solução Bash:
Utilitários Bash + GNU,
967775 bytesExperimente a versão online do Bash!
fonte
Mathematica,
666052 bytesFunção anônima, indexada em 0. Usa aproximação de log5 (10) (≈ 0,7)
Como funciona?
Utilize 2 ^ (entrada) / 2 e 1. Gere {1.. esse número}
Adicionar entrada / .7
Eleve 5 à potência do resultado (gerando potências de 5), divida por 10 ^ de entrada (eliminando os dígitos à direita da coluna desejada)
Aplique o módulo 10, utilizando o dígito da pessoa (a coluna desejada).
Versão exata, 58 bytes
fonte
JavaScript (ES7),
7876 bytes0 indexado, ou seja,
f(0)
dá2
.Snippet de teste
Mostrar snippet de código
O snippet usa em
Math.pow
vez de**
para compatibilidade entre navegadores.fonte
CJam, 35
Experimente online
É eficiente em termos de espaço e não é extremamente lento, levou vários minutos para a entrada 30 no meu computador (usando o interpretador java).
fonte
Geléia ,
2621 bytes-2 bytes usando a ideia de aproximação de 0,7 do kennytm
Experimente online! (tempo limite excedido para n> 15 )
Retorna uma lista de números inteiros, os dígitos.
Baseado em zero. Teoricamente, trabalha para n <= 72 (substitua
.7
por5l⁵¤
, para obter precisão do ponto flutuante).Quão?
Localmente: a memória do conjunto de trabalho para n = 17 subiu para cerca de 750 MB e subiu para cerca de 1 GB ; para n = 18 , alcançou lentamente 2,5 GB e aumentou para 5 GB .
fonte
Perl 6 , 52 bytes
Funciona para entradas arbitrariamente altas, com memória suficiente (ou seja, sem aproximação do logaritmo) .
Retorna uma lista de dígitos.
Experimente online!
Como funciona
A parte "elemento pulando" funciona assim:
//
é o operador "definido ou".|()
retorna um Slip vazio , que se dissolve na lista externa como 0 elementos, essencialmente garantindo que o elemento atual seja ignorado.O caso de borda
n=1
funciona bem, porque2**n/4
se torna0.5
e^(0.5)
significa0 ..^ 0.5
aka "números inteiros entre 0 (inclusive) e 0,5 (não incluído)", ou seja, uma lista com o único elemento 0.fonte
J, 50 bytes
Nota: deve passar em número estendido
Uso:
fonte
Haskell , 73 bytes
Experimente online! Usa indexação 0.
Explicação:
fonte
Lote, 294 bytes
Produz cada dígito em sua própria linha. Funciona calculando as potências de 5 à mão, mas funciona apenas
N=33
devido ao uso de números inteiros de 32 bits para manter a contagem de quantos dígitos imprimir.s
contém os últimosN
dígitos (invertidos) da potência atual de 5, enquantot
contémx
s usados como preenchimento, embora osx=0
façam avaliar como zero quando a próxima potência for calculada. Exemplo paraN=4
:fonte
JavaScript (ES6), 73 bytes
1 indexado. Um pouco mais curto que a resposta do ES7 , mas falha 3 etapas antes (em N = 13).
Demo
Mostrar snippet de código
fonte
PHP> = 7.1, 104 bytes
Sandbox do PHP Online
fonte