Saída da sequência Goodstein simplificada

22

Um número está no formato Goodstein simplificado da base-b se for escrito como

b + b + ... + b + c,   0 < c ≤ b

A sequência simplificada de um número de Goodstein começa com a escrita do número na forma simplificada de base 1, substituindo todos os 1 por 2 e subtraindo 1. Reescreva o resultado na forma simplificada de base 2, substitua todos os 2 por 3 e subtraia 1 etc. até chegar a 0.

Seu programa é pegar uma entrada inteira positiva e imprimir / imprimir sua sequência Goodstein e terminar. Seu programa deve lidar com números inferiores a 100, embora possa não terminar em um período de tempo razoável.

Por exemplo, dado 3 como entrada, seu programa deve ser exibido (o lado direito é apenas uma explicação)

1 + 1 + 1                | 3 = 1 + 1 + 1
2 + 2 + 1                | Change 1's to 2's, then subtract 1. (2 + 2 + 2 - 1 = 2 + 2 + 1)
3 + 3                    | 3 + 3 + 1 - 1 = 3 + 3
4 + 3                    | 4 + 4 - 1 = 4 + 3
5 + 2                    | 5 + 3 - 1 = 5 + 2
6 + 1                    | 6 + 2 - 1 = 6 + 1
7                        | 7 + 1 - 1 = 7
7                        | 8 - 1 = 7
6                        | Numbers are now lower than the base, so just keep subtracting 1.
5                        |
4                        |
3                        |
2                        |
1                        |
0                        | End

O espaçamento não importa.


Critério de vitória:

Isso é . O menor código vence.

Arte simplesmente bonita
fonte
1
É necessário incluir o último 0?
KSab
5
@KSab Hm .... não, acho que não.
Simply Beautiful Art

Respostas:

2

05AB1E , 19 bytes

Å1[D'+ý,N>D>:`Ž<)0K

Também pode ser reorganizado como >Å1[ND>:`Ž<)0KD'+ý,

Experimente online!

Explicação

Å1                    # push a list of 1's the length of the input
  [                   # start a loop
   D                  # duplicate the current list
    '+ý,              # join on "+" and print
        N>D>:         # replace <current_iteration>+1 with <current_iteration>+2
             `        # flatten the list to the stack
              Ž       # break loop if the stack is empty
               <      # decrement the top number
                )     # wrap the stack in a list
                 0K   # remove zeroes
Emigna
fonte
10

Python 2, 77 74 bytes

-3 bytes graças a Lynn

n=input();b=1
while n:print"+".join(n/b*[`b`]+[`n%b`][:n%b]);n+=n/b-1;b+=1

Experimente online!

É executado facilmente até n = 100 (embora a saída seja muito longa para a exibição completa).

KSab
fonte
"O espaçamento não importa", então você está bem lá.
Simply Beautiful Art
Salve um byte lendo as entradas de STDIN:n=input() b=1 while n:…
Lynn
1
E mais dois com n+=n/b-1;b+=1. 74 bytes
Lynn
1
@SimplyBeautifulArt corrigido
KSab 18/17
1
@SimplyBeautifulArt, aparentemente, tem a ver com o loop while, você não pode colocar o whileseguinte a ;. Eu acho que isso é porque se a linha é iniciado com uma whiledeclaração de cada seguinte (separados por ponto e vírgula) é considerado dentro do seu escopo do tempo e do comportamento seria ambíguo ou pelo menos um pouco opaco
KSab
2

Mathematica, 123 bytes

(s=1~Table~#;i=1;While[s!={},Print@StringRiffle[ToString/@s,"+"];s=s/.i->i+1;s=Join[Most@s,{Last@s}-1]~DeleteCases~0;i++])&


Experimente online!

J42161217
fonte
1

Python 3, 155 bytes

n=int(input());l=[1]*(n+1);i=0
while l:
    l=[t+1 if t==i else t for t in l];l[-1]-=1;l=l[:-1] if l[-1]==0 else l;print("+".join(list(map(str,l))));i+=1

Isso pode ser reformatado em

n = int(input())
l = [0]*(n+1)
i = 0
while l:
    l = [t+1 if t==i else t for t in l]
    if l[-1] == 0:
        l = l[:-1]
    print("+".join(list(map(str,l))))
    i += 1
RGS
fonte
Você perde a primeira linha de 1+1+...e observe que seu programa deve lidar com qualquer entrada inteira positiva.
Simply Beautiful Art
1
Sim por favor. Além disso, MathJax não funciona neste site: P
Simply Beautiful Art
1
Para mim, parece que você colocou um espaço na sua versão golfada em vez de a +.
Simply Beautiful Art
1
106 bytes
ovs 18/10/10
1
@RGS -~xtem o mesmo valor que x+1, mas você não precisa colocá-lo entre parênteses, pois unário -(negação) e unário ~(negação bit a bit) têm uma precedência mais alta que *. No seu caso [1]*-~né igual a [1]*(n+1).
ovs 18/10/19
1

Javascript ES6, 121 caracteres

for(q=1,s=Array(+prompt()).fill(1).join`+`;s!=0;s=s.split(q).join(++q).replace(/\d+$/,x=>x-1).replace(/\+0$/,''))alert(s)

alert=s=>document.write(s+'\n')
document.write("<pre>")

for(q=1,s=Array(+prompt()).fill(1).join`+`;s!=0;s=s.split(q).join(++q).replace(/\d+$/,x=>x-1).replace(/\+0$/,''))alert(s)

Qwertiy
fonte