输出简化的Goodstein序列


22

如果数字写为,则以b-b简化的Goodstein形式表示。

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

数字的简化Goodstein序列开始于以1为底的简化Goodstein形式写数字,然后将所有1替换为2并减去1。将结果以base-2简化的Goodstein形式重写,然后将所有2替换为3并减去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嗯....不,我想不是。
Simply Beautiful Art

Answers:


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字节

-3字节感谢Lynn

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

在线尝试!

轻松达到n = 100(尽管输出太长,无法完整显示tio)。


“间距无关紧要”,所以在那很好。
Simply Beautiful Art

通过读取来自STDIN的输入来保存字节:n=input() b=1 while n:…
Lynn

1
还有两个n+=n/b-1;b+=174字节
Lynn

1
@SimplyBeautifulArt已修复
KSab

1
@SimplyBeautifulArt它显然与while循环有关,您不能在while其后放置一个;。我想这是因为如果在行while的范围内考虑以以下每个语句(由分号分隔)开头的行,并且该行为将是模棱两可的或至少有些不透明
KSab,2017年


2

Mathematica,123个字节

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


在线尝试!


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+...,并注意您的程序应该处理任何正整数输入。
Simply Beautiful Art

1
是的,请。此外,MathJax在此网站上不起作用:P
Simply Beautiful Art

1
对我来说,看来您在高尔夫球版中放置了一个空格,而不是一个空格+
Simply Beautiful Art


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)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.