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.


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

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).


"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!


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

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
@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)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.