Goodstein dizisinin çıktısını al


18

(Bu oldukça klasik olabilir ama bu benim ilk yazım, bu yüzden henüz süslü şeyler için hazır değilim)

Goodstein'e dizisi aşağıdaki şekilde bir giriş numarası için tanımlandığı gibidir:

Bir başlangıç numarası almak n , izin b = 2 ve tekrar:

  • Yazma N heriditary üs b gösterimde
  • n ve alt özet tüm ( b ) s yerine ( b +1) s yerine
  • n'nin yeni ondalık değerlendirmesini çıkarır
  • b artışı

Kalıtsal Taban notasyonu, temelin görünecek daha büyük sayı olduğu bir sayının ayrıştırılmasıdır. Örnekler:

  • 83 HB3'te: 3^(3+1)+2
  • 226 HB2'de: 2^(2^(2+1))+2^(2+1)+2

Goodstein dizileri her zaman 0 ile sonuçlanır , ancak önce oldukça hızlı bir şekilde büyük olma eğilimindedirler, bu nedenle tüm dizinin çıktısını alması istenmez.


Görev:

Herhangi bir makul biçimde bir girdi numarası verildiğinde, işiniz bu sayı için Goodstein dizisini en azından 10 ^ 25 veya 0'a ulaşana kadar çıkarmaktır.

Örnekler:

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

Detaylar:

  • Girdi sayısı, ondalık temelde olduğu sürece bir dizi, bir dize, bir tam sayı olabilir
  • Çıktı aynı kurala uyar
  • Çıktıdaki terimlerin ayrılması boşluklar, yeni satırlar veya makul bir ayrım olabilir
  • Sekans 10 ^ 25'ten büyük olur olmaz, programınız normal şekilde çıkabilir, bir hata / istisna atabilir veya devam edebilir (kısıtlama yok)
  • Bu , bu yüzden en kısa cevap (bayt cinsinden) kazanır
  • Tabii ki, standart boşluklar yasaktır
  • Python ungolfed çalışma örneği burada

2
Bir test senaryosuna adım adım ekleyebilir misiniz?
Çubuk

5
PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma!
FantaC


2
@ ØrjanJohansen Evet, hata, kayan nokta hatalarından kaçınmak int(q/base.b), q%base.biçin q//base.b, q%base.b(veya basitçe divmod(q, base.b)) olması gerektiğidir.
Anders Kaseorg

2
“En azından 10 ^ 25 veya 0'a ulaşıncaya kadar”, programın 0'a ulaştıktan sonra devam etmesine izin verildiği anlamına mı geliyor (muhtemelen −1, −2, −3,… ile)?
Anders Kaseorg

Yanıtlar:


3

Pyth , 28 26 bayt

.V2JbL&bs.e*^hJykb_jbJ=ty

Sondaki satır başı önemlidir.

Çevrimiçi deneyin! (Bu bağlantı, QPyth'in mevcut sürümü için gerekli olmayan bir ekstra içerir .)

Nasıl çalışır

.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

Genel ydeğişkende yapılan değişiklikler arasında not almayı önlemek için her döngü yinelemesinde yeniden tanımlanması önemlidir J.


3

Haskell , 77 bayt

(&2)anonim bir işlev alır Integerve (potansiyel olarak çok uzun) bir Integers listesini döndürerek , olarak kullanın (&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)

Çevrimiçi deneyin! (konumunda keser 10^25.)

Nasıl çalışır

  • (&2)diziyi base ile başlatır 2.
  • n&bSayı nve tabandan başlayarak alt diziyi hesaplar b.
    • Genellikle bir n<0sonraki adımda boş bir listeyle durur n==0.
    • Aksi takdirde, nifade tarafından yinelenen olarak döndürülen listeye gider (0?n-1)&(b+1).
  • ?bir yerel işlev operatörüdür. kalıtsal üsse 0?ndönüşümün sonucunu verir , daha sonra üssü her yerde arttırır. nb
    • Dönüşüm e, geçerli üs değişkenini takip eden değişken ile geri çekilir . e?nsayıyı dönüştürür n*b^e.
    • Özyineleme 0ne zaman ile durur n==0.
    • Aksi takdirde, ntabana bölünür b.
      • (e+1)?div n b bölüm ve bir sonraki üst üs için özyinelemeyi işler.
      • mod n b*(b+1)^0?egeri kalanı (geçerli üsse karşılık gelen basamaktır e), tabanın artışını ve mevcut üssü kalıtsal olarak dönüştürmeyi ele alır 0?e.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.