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.


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

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).


"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!


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

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
@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)


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.