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

2
Bisakah Anda menambahkan langkah demi langkah dari satu test case?
Rod

5
Selamat datang di PPCG! Tantangan pertama yang bagus!
FantaC


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.


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