Emette la sequenza di Goodstein


18

(Questo potrebbe essere abbastanza classico ma questo è il mio primo post qui, quindi non sono ancora pronto per le cose fantasiose)

La sequenza di Goodstein è definita per un numero di input come segue:

Scegli un numero iniziale n , lascia che b = 2 e ripeti:

  • scrittura n della base ereditari b notazione
  • sostituire tutte le ( b ) s ( b +1) s in n e sottrarre 1
  • emette la nuova valutazione decimale di n
  • incremento b

La notazione di base ereditaria è una decomposizione di un numero in cui la base è il numero più grande da visualizzare. Esempi:

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

Le sequenze di Goodstein finiscono sempre a 0 , ma tendono a diventare piuttosto grandi abbastanza velocemente, quindi non viene richiesto di produrre la sequenza completa.


Compito:

Dato un numero di input in qualsiasi formato ragionevole, il tuo compito è produrre la sequenza di Goodstein per questo numero almeno fino a quando non raggiunge 10 ^ 25 o 0

Esempi:

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

Dettagli:

  • Il numero di input può essere un array, una stringa, un numero intero, purché sia ​​in base decimale
  • L'output segue la stessa regola
  • La separazione dei termini nell'output può essere spazi, nuove righe o qualsiasi separazione ragionevole
  • Non appena la sequenza diventa maggiore di 10 ^ 25, il programma potrebbe uscire normalmente, generare un errore / eccezione o continuare (nessuna restrizione)
  • Questo è , quindi vince la risposta più breve (in byte)
  • Naturalmente, sono vietate le scappatoie standard
  • Python esempio non funzionante qui

2
Potresti aggiungere uno step-by-step di un caso di test?
Rod,

5
Benvenuti in PPCG! Bella prima sfida!
FantaC,


2
@ ØrjanJohansen Sì, il bug è che int(q/base.b), q%base.bdeve essere q//base.b, q%base.b(o semplicemente divmod(q, base.b)) per evitare errori in virgola mobile.
Anders Kaseorg,

2
"Almeno fino a quando non raggiunge 10 ^ 25 o 0" significa che il programma può continuare dopo che raggiunge 0 (presumibilmente con −1, −2, −3, ...)?
Anders Kaseorg,

Risposte:


3

Pyth , 28 26 byte

.V2JbL&bs.e*^hJykb_jbJ=ty

La nuova riga finale è significativa.

Provalo online! (Questo link include un extra Qnon necessario per la versione corrente di Pyth.)

Come funziona

.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

È importante che yvenga ridefinito in ogni iterazione del ciclo per impedire la memoizzazione attraverso le modifiche alla variabile globale J.


3

Haskell , 77 byte

(&2)è una funzione anonima che accetta Integere restituisce un elenco (potenzialmente molto lungo) di Integers, usa as (&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)

Provalo online! (interrompe alle 10^25.)

Come funziona

  • (&2)inizia la sequenza con base 2.
  • n&bcalcola la sottosequenza a partire dal numero ne dalla base b.
    • Si interrompe con un elenco vuoto se n<0, cosa che generalmente accade al passaggio successivo n==0.
    • Altrimenti, antepone nall'elenco restituito in modo ricorsivo dall'espressione (0?n-1)&(b+1).
  • ?è un operatore di funzioni locali. 0?ndà il risultato della conversione nin base ereditaria b, quindi incrementando la base ovunque.
    • La conversione ricorre con la variabile che etiene traccia dell'esponente corrente. e?nconverte il numero n*b^e.
    • La ricorsione si interrompe con 0quando n==0.
    • Altrimenti, si divide nper la base b.
      • (e+1)?div n b gestisce la ricorsione per il quoziente e l'esponente successivo più alto.
      • mod n b*(b+1)^0?egestisce il resto (che è la cifra corrispondente all'esponente corrente e), l'incremento della base e la conversione ereditaria dell'esponente corrente 0?e.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.