Keluarkan urutan Goodstein yang disederhanakan

22

Angka dalam basis-b disederhanakan bentuk Goodstein jika ditulis sebagai

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

Urutan Goodstein yang disederhanakan dari suatu angka dimulai dengan menuliskan angka pada basis-1 bentuk Goodstein yang disederhanakan, kemudian mengganti semua 1 dengan 2 dan mengurangi 1. Tulis ulang hasilnya dalam basis-2 bentuk Goodstein yang disederhanakan, kemudian ganti semua 2 dengan 3 dan kurangi 1 , dll. hingga Anda mencapai 0.

Program Anda adalah mengambil input integer positif dan mengeluarkan / mencetak urutan Goodstein-nya dan mengakhiri. Program Anda harus menangani angka kurang dari 100, meskipun mungkin tidak berakhir dalam jumlah waktu yang wajar.

Misalnya, diberi 3 sebagai input, program Anda harus menampilkan (sisi kanan hanya penjelasan)

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

Jarak tidak masalah.


Kriteria kemenangan:

Ini adalah . Kode terpendek menang.

Seni Cukup Indah
sumber
1
Apakah harus memasukkan 0 yang terakhir?
KSab
5
@Klik Hm .... tidak, kurasa tidak.
Simply Beautiful Art

Jawaban:

2

05AB1E , 19 byte

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

Bisa juga diatur ulang sebagai >Å1[ND>:`Ž<)0KD'+ý,

Cobalah online!

Penjelasan

Å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
Emigna
sumber
10

Python 2, 77 74 byte

-3 byte terima kasih kepada Lynn

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

Cobalah online!

Mudah berjalan hingga n = 100 (meskipun outputnya terlalu panjang untuk ditampilkan sepenuhnya).

KSab
sumber
"Jarak tidak masalah", jadi kamu baik-baik saja di sana.
Simply Beautiful Art
Simpan satu byte dengan membaca input dari STDIN:n=input() b=1 while n:…
Lynn
1
Dan dua lagi dengan n+=n/b-1;b+=1. 74 byte
Lynn
1
@SimplyBeautifulArt diperbaiki
KSab
1
@SimplyBeautifulArt rupanya ada hubungannya dengan loop sementara, Anda tidak bisa memasukkan yang whileberikut ;. Saya menduga bahwa ini karena jika baris dimulai dengan whilesetiap pernyataan berikut (dipisahkan oleh titik koma) dianggap di dalam ruang lingkupnya sementara dan perilakunya akan ambigu atau setidaknya agak buram
KSab
2

Mathematica, 123 byte

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


Cobalah online!

J42161217
sumber
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

Ini dapat diformat ulang menjadi

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
RGS
sumber
Anda melewatkan baris pertama 1+1+..., dan perhatikan bahwa program Anda seharusnya menangani input bilangan bulat positif.
Simply Beautiful Art
1
Ya silahkan. Juga, MathJax tidak berfungsi di situs ini: P
Simply Beautiful Art
1
Bagi saya, tampaknya Anda memberi spasi pada versi golf Anda, bukan a +.
Simply Beautiful Art
1
106 bytes
ovs
1
@RGS -~xmemiliki nilai yang sama dengan x+1, tetapi Anda tidak perlu tanda kurung, karena unary -(negasi) dan unary ~(bitwise negasi) memiliki prioritas lebih tinggi daripada *. Dalam kasus Anda [1]*-~nsama dengan [1]*(n+1).
Ovs
1

Javascript ES6, 121 karakter

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)

Qwertiy
sumber