단순화 된 Goodstein 시퀀스 출력


22

다음과 같이 쓰면 숫자가 b로 단순화 된 Goodstein 형식입니다.

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

숫자의 단순화 된 굿 슈타인 시퀀스는 밑이 1 인 단순화 된 굿 슈타인 형태로 숫자를 쓴 다음 1을 모두 2로 바꾸고 1을 뺀 것으로 시작합니다. 결과를 밑이 2 인 간단한 굿 스타 인 형태로 다시 쓴 다음 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 Hm .... 아뇨.
Simply Beautiful Art

답변:


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

파이썬 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까지 쉽게 실행됩니다 (출력이 너무 길어 완전히 표시 할 수는 없음).


"간격은 중요하지 않습니다", 당신은 괜찮습니다.
Simply Beautiful Art

STDIN에서 입력을 읽어 바이트를 저장하십시오.n=input() b=1 while n:…
Lynn

1
와 두 개 더 n+=n/b-1;b+=1. 74 바이트
Lynn

1
@SimplyBeautifulArt 수정 됨
KSab

1
@SimplyBeautifulArt 그것은 분명히 while 루프와 관련이 있으며 while다음을 넣을 수 없습니다 ;. 라인이 while각각의 다음 문장 (세미콜론으로
구분됨)



1

파이썬 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

자바 스크립트 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.