Sortie de la séquence Goodstein simplifiée

22

Un nombre est en forme Goodstein simplifiée en base-b s'il est écrit comme

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

La séquence Goodstein simplifiée d'un nombre commence par l'écriture du nombre sous la forme Goodstein simplifiée en base 1, puis en remplaçant tous les 1 par 2 et en soustrayant 1. Réécrivez le résultat sous la forme Goodstein simplifiée en base 2, puis remplacez tous les 2 par 3 et soustrayez 1 , etc. jusqu'à ce que vous atteigniez 0.

Votre programme doit prendre une entrée entière positive et sortir / imprimer sa séquence Goodstein et terminer. Votre programme doit gérer des nombres inférieurs à 100, bien qu'il ne puisse pas se terminer dans un délai raisonnable.

Par exemple, étant donné 3 comme entrée, votre programme devrait sortir (le côté droit est juste une explication)

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

L'espacement n'a pas d'importance.


Critère gagnant:

C'est du . Le code le plus court gagne.

Art tout simplement magnifique
la source
1
Faut-il inclure le dernier 0?
KSab
5
@KSab Hm .... non, je suppose que non.
Simply Beautiful Art

Réponses:

2

05AB1E , 19 octets

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

Pourrait également être réorganisé comme >Å1[ND>:`Ž<)0KD'+ý,

Essayez-le en ligne!

Explication

Å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
la source
10

Python 2, 77 74 octets

-3 octets grâce à Lynn

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

Essayez-le en ligne!

Fonctionne facilement jusqu'à n = 100 (bien que la sortie soit trop longue pour être entièrement affichée).

KSab
la source
"L'espacement n'a pas d'importance", donc ça va.
Simply Beautiful Art
Enregistrer un octet en lisant l'entrée de STDIN:n=input() b=1 while n:…
Lynn
1
Et deux de plus avec n+=n/b-1;b+=1. 74 octets
Lynn
1
@SimplyBeautifulArt fixed
KSab
1
@SimplyBeautifulArt cela a apparemment à voir avec la boucle while, vous ne pouvez pas mettre un whilesuivant a ;. Je suppose que cela est dû au fait que si la ligne est démarrée avec une whiledéclaration suivante (séparée par des points-virgules), elle est considérée à l'intérieur de sa portée et le comportement serait ambigu ou au moins quelque peu opaque
KSab
2

Mathematica, 123 octets

(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++])&


Essayez-le en ligne!

J42161217
la source
1

Python 3, 155 octets

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

Cela peut être reformaté 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
la source
Vous manquez la première ligne de 1+1+..., et notez que votre programme est censé gérer toute entrée entière positive.
Simply Beautiful Art
1
Oui s'il vous plaît. Aussi, MathJax ne fonctionne pas sur ce site: P
Simply Beautiful Art
1
Pour moi, il semble que vous ayez mis un espace dans votre version golfée au lieu d'un +.
Simply Beautiful Art
1
106 octets
ovs
1
@RGS -~xa la même valeur que x+1, mais vous n'avez pas besoin de la mettre entre parenthèses, car unaire -(négation) et unaire ~(négation au niveau du bit) ont une priorité plus élevée que *. Dans votre cas [1]*-~nest égal à [1]*(n+1).
2017 à 7h55
1

Javascript ES6, 121 caractères

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
la source