Salida de la secuencia simplificada de Goodstein

22

Un número está en forma de Goodstein simplificada en base-b si está escrito como

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

La secuencia simplificada de Goodstein de un número comienza escribiendo el número en la forma simplificada de Goodstein de base 1, luego reemplazando todos los 1 con 2 y restando 1. Vuelva a escribir el resultado en la forma simplificada de Goodstein de base 2, luego reemplace los 2 con 3 y reste 1 , etc. hasta llegar a 0.

Su programa debe tomar una entrada entera positiva y generar / imprimir su secuencia de Goodstein y terminar. Su programa debe manejar números menores que 100, aunque no puede finalizar en un período de tiempo razonable.

Por ejemplo, dado 3 como entrada, su programa debería salir (el lado derecho es solo una explicación)

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

El espacio no importa.


Criterio ganador:

Este es el . El código más corto gana.

Simplemente hermoso arte
fuente
1
¿Es necesario incluir los últimos 0?
KSab
55
@KSab Hm ... no, supongo que no.
Simplemente hermoso arte

Respuestas:

2

05AB1E , 19 bytes

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

También podría reorganizarse como >Å1[ND>:`Ž<)0KD'+ý,

Pruébalo en línea!

Explicación

Å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
fuente
10

Python 2, 77 74 bytes

-3 bytes gracias a Lynn

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

Pruébalo en línea!

Se ejecuta fácilmente hasta n = 100 (aunque el resultado es demasiado largo para mostrarlo completamente).

KSab
fuente
"El espacio no importa", así que estás bien allí.
Simplemente hermoso arte
Guarde un byte leyendo la entrada de STDIN:n=input() b=1 while n:…
Lynn
1
Y dos más con n+=n/b-1;b+=1. 74 bytes
Lynn
1
@SimplyBeautifulArt solucionado
KSab
1
@SimplyBeautifulArt aparentemente tiene que ver con el ciclo while, no puedes poner un whilesiguiente a ;. Supongo que esto se debe a que si la línea se inicia con whilecada una de las siguientes afirmaciones (separadas por punto y coma) se considera dentro de su alcance del tiempo y el comportamiento sería ambiguo o al menos algo 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++])&


Pruébalo en línea!

J42161217
fuente
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

Esto puede ser reformateado en

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
fuente
Echa de menos la primera línea de 1+1+..., y tenga en cuenta que su programa debe manejar cualquier entrada entera positiva.
Simplemente hermoso arte
1
Sí por favor. Además, MathJax no funciona en este sitio: P
Simply Beautiful Art
1
Para mí, parece que pones un espacio en tu versión de golf en lugar de a +.
Simplemente hermoso arte
1
106 bytes
ovs
1
@RGS -~xtiene el mismo valor que x+1, pero no necesita ponerlo entre paréntesis, ya que unary -(negación) y unary ~(negación a nivel de bits) tienen una prioridad más alta que *. En tu caso [1]*-~nes igual a [1]*(n+1).
ovs
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
fuente