簡略化されたGoodsteinシーケンスを出力する


22

次のように記述されている場合、数値はbase-b簡略化されたGoodstein形式です。

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

番号の簡略化されたグッドシュタインシーケンスは、番号をベース1の簡略化されたグッドシュタイン形式で記述し、すべての1を2に置き換えて1を減算することから始まります。など、0に達するまで。

あなたのプログラムは、正整数の入力を受け取り、そのGoodsteinシーケンスを出力/印刷して終了します。プログラムは100未満の数値を処理する必要がありますが、妥当な時間内に終了しない場合があります。

たとえば、入力として3を指定すると、プログラムは出力するはずです(右側は単なる説明です)

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

間隔は関係ありません。


受賞基準:

これはです。最短のコードが優先されます。


1
最後の0を含める必要がありますか?
KSab

5
@KSab Hm ....いいえ、そうではないと思います。
単に美しいアート

回答:


2

05AB1E、19バイト

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

次のように再配置することもできます >Å1[ND>:`Ž<)0KD'+ý,

オンラインでお試しください!

説明

Å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バイト

Lynnのおかげで-3バイト

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

オンラインでお試しください!

n = 100まで簡単に実行できます(tioを完全に表示するには出力が長すぎます)。


「間隔は問題ではない」ので、そこは大丈夫です。
単に美しいアート

:STDINからの入力を読み取ることで、バイト保存n=input() b=1 while n:…
リン・

1
そしてさらに2つn+=n/b-1;b+=174バイト
リン

1
@SimplyBeautifulArt修正
KSab

1
@SimplyBeautifulArtそれは明らかにwhileループに関係しているので、while次のaを置くことはできません;。これは、while次の各文(セミコロンで区切られている)で行が開始される場合、whileのスコープ内であると見なされ、動作があいまいまたは少なくともある程度不透明になるためだと推測します
-KSab



1

Python 3、155バイト

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

これは次のように再フォーマットできます。

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

の最初の行を見逃し、1+1+...プログラムが正の整数入力を処理することになっていることに注意してください。
単に美しいアート

1
はい、お願いします。また、MathJaxはこのサイトには動作しません:Pを
単純に美しいアート

1
私にとっては、ゴルフバージョンの代わりにスペースを入れたようです+
単に美しいアート


1
@RGSはと-~x同じ値を持ちx+1ますが、単項-(否定)と単項~(ビットごとの否定)の優先順位はより大きいため、括弧で囲む必要はありません*。あなたの場合[1]*-~nはに等しい[1]*(n+1)です。
ovs

1

Javascript ES6、121文字

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)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.