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.


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

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


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


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

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.