Keluarkan urutan Goodstein

18

(Ini mungkin cukup klasik tetapi ini adalah posting pertama saya di sini, jadi saya belum siap untuk barang-barang mewah)

The Goodstein urutan didefinisikan untuk jumlah masukan sebagai berikut:

Pilih angka awal n , misalkan b = 2 dan ulangi:

  • write n dalam basis heriditary b notasi
  • gantikan semua ( b ) s dengan ( b +1) s dalam n dan kurangi 1
  • output evaluasi desimal baru n
  • kenaikan b

Notasi Basis Herediter adalah dekomposisi angka di mana basisnya adalah angka yang lebih besar untuk muncul. Contoh:

  • 83 dalam HB3: 3^(3+1)+2
  • 226 dalam HB2: 2^(2^(2+1))+2^(2+1)+2

Urutan Goodstein selalu berakhir pada 0 , tetapi mereka cenderung pertama kali mendapatkan cukup besar cukup cepat sehingga tidak diminta untuk menampilkan urutan lengkap.


Tugas:

Diberi nomor input dalam format apa pun yang masuk akal, tugas Anda adalah menampilkan urutan Goodstein untuk nomor ini setidaknya hingga mencapai 10 ^ 25 atau 0

Contoh:

Input: 3
Output: 3, 3, 3, 2, 1, 0
Input: 13
Output: 13, 108, 1279, 16092, 280711, 5765998, 134219479, 3486786855, 100000003325, 3138428381103, 106993205384715, 3937376385706415, 155568095557821073, 6568408355712901455, 295147905179352838943, 14063084452067725006646, 708235345355337676376131, 37589973457545958193377292
Input: 38
Output: 38, 22876792454990

Detail:

  • Nomor input dapat berupa array, string, integer, selama basis desimal
  • Output mengikuti aturan yang sama
  • Pemisahan istilah dalam output dapat berupa spasi, baris baru, atau pemisahan yang masuk akal
  • Segera setelah urutan menjadi lebih besar dari 10 ^ 25, program Anda dapat keluar secara normal, melemparkan kesalahan / pengecualian, atau melanjutkan (tidak ada batasan)
  • Ini adalah , jadi jawaban tersingkat (dalam byte) menang
  • Tentu saja, lubang standar dilarang
  • Python ungolfed contoh kerja di sini
BusyAnt
sumber
2
Bisakah Anda menambahkan langkah demi langkah dari satu test case?
Rod
5
Selamat datang di PPCG! Tantangan pertama yang bagus!
FantaC
1
Terkait Terkait
Martin Ender
2
@ ØrjanJohansen Ya, bug yang int(q/base.b), q%base.bperlu q//base.b, q%base.b(atau hanya divmod(q, base.b)) untuk menghindari kesalahan floating-point.
Anders Kaseorg
2
Apakah "setidaknya sampai mencapai 10 ^ 25 atau 0" berarti program diizinkan untuk melanjutkan setelah mencapai 0 (mungkin dengan −1, −2, −3, ...)?
Anders Kaseorg

Jawaban:

3

Pyth , 28 26 byte

.V2JbL&bs.e*^hJykb_jbJ=ty

Baris baru tertinggal sangat penting.

Cobalah online! (Tautan ini termasuk tambahan yang Qtidak diperlukan oleh versi Pyth saat ini.)

Bagaimana itu bekerja

.V2JbL&bs.e*^hJykb_jbJ=ty
.V2                          for b in [2, 3, 4, ...]:
   Jb                          assign J = b
     L                         def y(b):
      &b                         b and
                   jbJ             convert b to base J
                  _                reverse
         .e                        enumerated map for values b and indices k:
             hJ                      J + 1
            ^  yk                    to the power y(k)
           *     b                   times b
(newline)                      print Q (autoinitialized to the input)
                        y      y(Q)
                       t       subtract 1
                      =        assign back to Q

Penting bahwa ydidefinisikan ulang di setiap iterasi loop untuk mencegah memoisasi melintasi perubahan ke variabel global J.

Anders Kaseorg
sumber
3

Haskell , 77 byte

(&2)adalah fungsi anonim mengambil Integerdan mengembalikan daftar (berpotensi sangat panjang) dari Integers, gunakan sebagai (&2) 13.

(&2)
n&b|n<0=[]|let _?0=0;e?n=(e+1)?div n b+mod n b*(b+1)^0?e=n:(0?n-1)&(b+1)

Cobalah online! (terputus pada 10^25.)

Bagaimana itu bekerja

  • (&2)memulai urutan dengan basis 2.
  • n&bmenghitung urutan dimulai dengan angka ndan pangkalan b.
    • Ini berhenti dengan daftar kosong jika n<0, yang umumnya terjadi setelah langkah n==0.
    • Jika tidak, itu akan bergantung npada daftar yang dikembalikan secara rekursif oleh ekspresi (0?n-1)&(b+1).
  • ?adalah operator fungsi lokal. 0?nmemberikan hasil konversi nke basis turun temurun b, kemudian meningkatkan basis di mana-mana.
    • Konversi berulang dengan variabel emelacak eksponen saat ini. e?nmengkonversi nomor tersebut n*b^e.
    • Rekursi berhenti dengan 0kapan n==0.
    • Kalau tidak, itu dibagi ndengan basis b.
      • (e+1)?div n b menangani rekursi bagi hasil bagi dan eksponen lebih tinggi berikutnya.
      • mod n b*(b+1)^0?emenangani sisa (yang merupakan digit yang sesuai dengan eksponen saat ini e), kenaikan basis, dan mengubah eksponen saat ini secara turun temurun dengan 0?e.
Ørjan Johansen
sumber