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.