Wyjście sekwencji Goodsteina

18

(To może być dość klasyczny, ale to mój pierwszy post tutaj, więc nie jestem jeszcze gotowy na fantazyjne rzeczy)

Sekwencja Goodstein jest zdefiniowany numer wejścia w następujący sposób:

Wybierz liczbę początkową n , niech b = 2 i powtórz:

  • napisz nw heriditarnej notacji b
  • zastąpić wszystkich ( b ) s do ( b + 1) jest w n i odejmowanie 1
  • wyprowadza nową ocenę dziesiętną n
  • przyrost b

Notacja dziedziczna Podstawa to rozkład liczby, w której podstawą jest większa liczba, która się pojawi. Przykłady:

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

Sekwencje Goodsteina zawsze kończą się na 0 , ale zwykle stają się dość duże dość szybko, więc nie jest wymagane podanie pełnej sekwencji.


Zadanie:

Biorąc pod uwagę liczbę wejściową w dowolnym rozsądnym formacie, Twoim zadaniem jest wyprowadzenie sekwencji Goodsteina dla tej liczby przynajmniej do osiągnięcia 10 ^ 25 lub 0

Przykłady:

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

Detale:

  • Numer wejściowy może być tablicą, łańcuchem, liczbą całkowitą, o ile jest podana w postaci dziesiętnej
  • Dane wyjściowe podlegają tej samej zasadzie
  • Rozdzielenie terminów w danych wyjściowych może być spacjami, znakami nowej linii lub dowolną rozsądną separacją
  • Gdy tylko sekwencja stanie się większa niż 10 ^ 25, twój program może wyjść normalnie, zgłosić błąd / wyjątek lub kontynuować (bez ograniczeń)
  • To jest , więc wygrywa najkrótsza odpowiedź (w bajtach)
  • Oczywiście standardowe luki są zabronione
  • Python nie działający przykład działania tutaj
Zajęty
źródło
2
Czy możesz dodać krok po kroku jeden przypadek testowy?
Rod
5
Witamy w PPCG! Ładne pierwsze wyzwanie!
FantaC
2
@ ØrjanJohansen Tak, błąd polega na tym, że int(q/base.b), q%base.bnależy q//base.b, q%base.b(lub po prostu divmod(q, base.b)), aby uniknąć błędów zmiennoprzecinkowych.
Anders Kaseorg,
2
Czy „przynajmniej do osiągnięcia 10 ^ 25 lub 0” oznacza, że ​​program może kontynuować po osiągnięciu 0 (przypuszczalnie z -1, -2, -3,…)?
Anders Kaseorg

Odpowiedzi:

3

Pyth , 28 26 bajtów

.V2JbL&bs.e*^hJykb_jbJ=ty

Końcowy znak nowej linii jest znaczący.

Wypróbuj online!(Ten link zawiera dodatkowe Qniepotrzebne w obecnej wersji Pyth.)

Jak to działa

.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

Ważne jest, aby na ynowo zdefiniować w każdej iteracji pętli, aby zapobiec zapamiętywaniu zmian w zmiennej globalnej J.

Anders Kaseorg
źródło
3

Haskell , 77 bajtów

(&2)jest anonimową funkcją pobierającą Integeri zwracającą (potencjalnie bardzo długą) listę Integers, użyj jako (&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)

Wypróbuj online!(ucina o 10^25.)

Jak to działa

  • (&2) rozpoczyna sekwencję od zasady 2 .
  • n&boblicza podsekwencję zaczynając od liczby ni podstawy b.
    • Zatrzymuje się z pustą listą, jeśli n<0, co zwykle dzieje się w następnym kroku n==0.
    • W przeciwnym razie poprzedza nlistę zwracaną rekurencyjnie przez wyrażenie(0?n-1)&(b+1) .
  • ?jest operatorem funkcji lokalnej. 0?ndaje wynik konwersjin na bazę dziedziczną b, a następnie przyrost bazy wszędzie.
    • Konwersja powtarza się ze zmienną śledzącą ebieżący wykładnik potęgi.e?nkonwertuje liczbę n*b^e.
    • Rekursja kończy się wraz z 0 kiedy n==0.
    • W przeciwnym razie dzieli się nprzez podstawęb .
      • (e+1)?div n b obsługuje rekurencję dla ilorazu i następnego wyższego wykładnika.
      • mod n b*(b+1)^0?eobsługuje resztę (czyli cyfrę odpowiadającą bieżącemu wykładnikowi e), przyrost podstawy i przeliczanie bieżącego wykładnika dziedzicznie 0?e.
Ørjan Johansen
źródło