Saída da sequência Goodstein

18

(Isso pode ser bastante clássico, mas este é o meu primeiro post aqui, então ainda não estou pronto para as coisas chiques)

A sequência Goodstein é definida para um número de entrada da seguinte maneira:

Escolha um número inicial n , deixe b = 2 e repita:

  • escreva n na notação b da base heriditária
  • substitua todos os ( b ) sa ( b +1) s no ne substrato 1
  • produz a nova avaliação decimal de n
  • incremento b

A notação de base hereditária é uma decomposição de um número em que a base é o número maior a aparecer. Exemplos:

  • 83 no HB3: 3^(3+1)+2
  • 226 no HB2: 2^(2^(2+1))+2^(2+1)+2

As seqüências de Goodstein sempre terminam em 0 , mas tendem a ficar grandes muito rapidamente, portanto, não é solicitado que você produza a sequência completa.


Tarefa:

Dado um número de entrada em qualquer formato razoável, seu trabalho é produzir a sequência Goodstein para esse número pelo menos até atingir 10 ^ 25 ou 0

Exemplos:

Input: 3
Output: 3, 3, 3, 2, 1, 0
Input: 13
Output: 13, 108, 1279, 16092, 280711, 5765998, 134219479, 3486786855, 100000003325, 3138428381103, 106993205384715, 3937376385706415, 155568095557821073, 6568408355712901455, 295147905179352838943, 14063084452067725006646, 708235345355337676376131, 37589973457545958193377292
Input: 38
Output: 38, 22876792454990

Detalhes:

  • O número de entrada pode ser uma matriz, uma sequência, um número inteiro, desde que esteja na base decimal
  • A saída segue a mesma regra
  • A separação dos termos na saída pode ser espaços, novas linhas ou qualquer separação razoável
  • Assim que a sequência for maior que 10 ^ 25, seu programa poderá sair normalmente, gerar um erro / exceção ou continuar (sem restrição)
  • Isso é , então a resposta mais curta (em bytes) vence
  • Obviamente, são proibidas brechas comuns
  • Exemplo de trabalho ungolfed Python aqui
BusyAnt
fonte
2
Você poderia adicionar um passo a passo de um caso de teste?
Rod
5
Bem-vindo ao PPCG! Bom primeiro desafio!
FantaC
2
@ ØrjanJohansen Sim, o problema é que int(q/base.b), q%base.bprecisa ser q//base.b, q%base.b(ou simplesmente divmod(q, base.b)) para evitar erros de ponto flutuante.
Anders Kaseorg
2
“Pelo menos até atingir 10 ^ 25 ou 0” significa que o programa pode continuar após atingir 0 (presumivelmente com -1, -2, -3, ...)?
Anders Kaseorg

Respostas:

3

Pitão , 28 26 bytes

.V2JbL&bs.e*^hJykb_jbJ=ty

A nova linha à direita é significativa.

Experimente online! (Este link inclui um extra Qnão necessário na versão atual do Pyth.)

Como funciona

.V2JbL&bs.e*^hJykb_jbJ=ty
.V2                          for b in [2, 3, 4, ...]:
   Jb                          assign J = b
     L                         def y(b):
      &b                         b and
                   jbJ             convert b to base J
                  _                reverse
         .e                        enumerated map for values b and indices k:
             hJ                      J + 1
            ^  yk                    to the power y(k)
           *     b                   times b
(newline)                      print Q (autoinitialized to the input)
                        y      y(Q)
                       t       subtract 1
                      =        assign back to Q

É importante que yseja redefinido em cada iteração de loop para impedir a memorização através de alterações na variável global J.

Anders Kaseorg
fonte
3

Haskell , 77 bytes

(&2)é uma função anônima que recebe Integere retorna uma (potencialmente muito longa) lista de Integers, use como (&2) 13.

(&2)
n&b|n<0=[]|let _?0=0;e?n=(e+1)?div n b+mod n b*(b+1)^0?e=n:(0?n-1)&(b+1)

Experimente online! (corta às 10^25.)

Como funciona

  • (&2)inicia a sequência com base 2.
  • n&bcalcula a subsequência começando com o número ne a base b.
    • Ele termina com uma lista vazia if n<0, o que geralmente acontece na etapa seguinte n==0.
    • Caso contrário, ele será anexado nà lista retornada recursivamente pela expressão (0?n-1)&(b+1).
  • ?é um operador de função local. 0?nfornece o resultado da conversão nem base hereditária be depois do incremento da base em todos os lugares.
    • A conversão ocorre novamente com a variável eacompanhando o expoente atual. e?nconverte o número n*b^e.
    • A recursão pára com 0quando n==0.
    • Caso contrário, ele divide npela base b.
      • (e+1)?div n b lida com a recursão para o quociente e o próximo expoente mais alto.
      • mod n b*(b+1)^0?emanipula o restante (que é o dígito correspondente ao expoente atual e), o incremento da base e a conversão do expoente atual hereditariamente com 0?e.
Ørjan Johansen
fonte