Xuất trình tự Goodstein đơn giản hóa


22

Một số ở dạng Goodstein đơn giản b cơ sở nếu nó được viết là

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

Chuỗi Goodstein được đơn giản hóa của một số bắt đầu bằng cách viết số ở dạng Goodstein đơn giản hóa cơ sở 1, sau đó thay thế tất cả 1 bằng 2 và trừ 1. Viết lại kết quả ở dạng Goodstein đơn giản hóa cơ sở 2, sau đó thay thế tất cả 2 bằng 3 và trừ 1 , vv cho đến khi bạn đạt 0.

Chương trình của bạn là lấy một đầu vào số nguyên dương và đầu ra / in chuỗi Goodstein của nó và chấm dứt. Chương trình của bạn nên xử lý các số nhỏ hơn 100, mặc dù nó có thể không chấm dứt trong một khoảng thời gian hợp lý.

Ví dụ, được đưa ra 3 làm đầu vào, chương trình của bạn sẽ xuất ra (phía bên phải chỉ là giải thích)

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

Khoảng cách không thành vấn đề.


Tiêu chí chiến thắng:

Đây là . Mã ngắn nhất sẽ thắng.


1
Có bắt buộc phải bao gồm 0 cuối không?
KSab

5
@KSab Hừm .... không, tôi đoán là không.
Nghệ thuật đơn giản là đẹp

Câu trả lời:


2

05AB1E , 19 byte

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

Cũng có thể được sắp xếp lại như >Å1[ND>:`Ž<)0KD'+ý,

Hãy thử trực tuyến!

Giải trình

Å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 byte

-3 byte nhờ Lynn

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

Hãy thử trực tuyến!

Dễ dàng chạy tới n = 100 (mặc dù đầu ra quá dài để tio hiển thị đầy đủ).


"Khoảng cách không thành vấn đề", vì vậy bạn vẫn ổn ở đó.
Nghệ thuật đơn giản là đẹp

Lưu một byte bằng cách đọc đầu vào từ STDIN:n=input() b=1 while n:…
Lynn

1
Và hai cái nữa với n+=n/b-1;b+=1. 74 byte
Lynn

1
Đã sửa lỗi @SimplyBeautitableArt
KSab

1
@SimplyBeautitableArt rõ ràng phải làm với vòng lặp while, bạn không thể đặt một câu whilesau ;. Tôi đoán rằng điều này là do nếu dòng được bắt đầu bằng whilemỗi câu lệnh sau (được phân tách bằng dấu chấm phẩy) được xem xét trong phạm vi của nó và hành vi sẽ mơ hồ hoặc ít nhất là hơi mờ
KSab



1

Python 3, 155 byte

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

Điều này có thể được định dạng lại thành

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

Bạn bỏ lỡ dòng đầu tiên 1+1+...và lưu ý rằng chương trình của bạn có nghĩa vụ xử lý bất kỳ đầu vào số nguyên dương nào.
Nghệ thuật đơn giản đẹp

1
Vâng làm ơn. Ngoài ra, MathJax không hoạt động trên trang web này: P
Simply Beautiful Art

1
Đối với tôi, có vẻ như bạn đặt một khoảng trống trong phiên bản golf của bạn thay vì a +.
Nghệ thuật đơn giản là đẹp


1
@RGS -~xcó cùng giá trị như x+1, nhưng bạn không cần phải ngoặc đơn, vì unary -(phủ định) và unary ~(phủ định bitwise) có độ ưu tiên cao hơn *. Trong trường hợp của bạn [1]*-~nlà bằng [1]*(n+1).
trứng

1

Javascript ES6, 121 ký tự

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)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.