Ausgabe der Goodstein-Sequenz

18

(Das mag ziemlich klassisch sein, aber das ist mein erster Beitrag hier, also bin ich noch nicht bereit für das schicke Zeug)

Die Goodstein-Sequenz ist für eine Eingangsnummer wie folgt definiert:

Wähle eine Startnummer n , lasse b = 2 und wiederhole:

  • schreibe n in der Notation der Erbbasis b
  • Ersetze alle ( b ) s durch ( b +1) s in n und subtrahiere 1
  • Ausgabe der neuen Dezimalauswertung von n
  • Inkrement b

Die erbliche Basisnotation ist eine Zerlegung einer Zahl, bei der die Basis die größere Zahl ist, die auftreten soll. Beispiele:

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

Goodstein-Sequenzen enden immer bei 0 , werden aber in der Regel sehr schnell groß, sodass nicht die vollständige Sequenz ausgegeben werden muss.


Aufgabe:

Wenn Sie eine Eingabenummer in einem angemessenen Format eingeben, müssen Sie die Goodstein-Sequenz für diese Nummer mindestens so lange ausgeben, bis sie 10 ^ 25 oder 0 erreicht

Beispiele:

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

Einzelheiten:

  • Die eingegebene Nummer kann ein Array, eine Zeichenfolge oder eine Ganzzahl sein, solange sie in Dezimalzahlen angegeben ist
  • Die Ausgabe erfolgt nach der gleichen Regel
  • Die Trennung der Ausdrücke in der Ausgabe kann durch Leerzeichen, Zeilenumbrüche oder eine sinnvolle Trennung erfolgen
  • Sobald die Sequenz größer als 10 ^ 25 wird, wird Ihr Programm möglicherweise normal beendet, es wird ein Fehler / eine Ausnahme ausgegeben oder es wird fortgesetzt (keine Einschränkung).
  • Das ist , also gewinnt die kürzeste Antwort (in Bytes)
  • Standardlücken sind natürlich verboten
  • Python ungolfed Arbeitsbeispiel hier
BusyAnt
quelle
2
Könnten Sie eine schrittweise Anleitung für einen Testfall hinzufügen?
Rod
5
Willkommen bei PPCG! Schöne erste Herausforderung!
FantaC
1
Verbunden. Verbunden.
Martin Ender
2
@ ØrjanJohansen Ja, der Fehler int(q/base.b), q%base.bmuss sein q//base.b, q%base.b(oder einfach nur divmod(q, base.b)), um Gleitkommafehler zu vermeiden.
Anders Kaseorg
2
Bedeutet "mindestens bis 10 ^ 25 oder 0", dass das Programm nach Erreichen von 0 fortgesetzt werden darf (vermutlich mit −1, −2, −3,…)?
Anders Kaseorg

Antworten:

3

Pyth , 28 26 Bytes

.V2JbL&bs.e*^hJykb_jbJ=ty

Der abschließende Zeilenumbruch ist erheblich.

Probieren Sie es online! (Dieser Link enthält ein Extra Q, das von der aktuellen Version von Pyth nicht benötigt wird.)

Wie es funktioniert

.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

Es ist wichtig, dass dies yin jeder Schleifeniteration neu definiert wird, um zu verhindern, dass Änderungen an der globalen Variablen gespeichert werden J.

Anders Kaseorg
quelle
3

Haskell , 77 Bytes

(&2)ist eine anonyme Funktion, Integerdie eine (möglicherweise sehr lange) Liste von Integers aufnimmt und zurückgibt (&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)

Probieren Sie es online! (schneidet an 10^25.)

Wie es funktioniert

  • (&2)startet die Sequenz mit base 2.
  • n&bberechnet die Teilfolge beginnend mit der Zahl nund der Basis b.
    • Es stoppt mit einer leeren Liste, wenn n<0, was in der Regel im nächsten Schritt passiert n==0.
    • Andernfalls wird es nder vom Ausdruck rekursiv zurückgegebenen Liste vorangestellt (0?n-1)&(b+1).
  • ?ist ein lokaler Funktionsoperator. 0?nGibt das Ergebnis der Konvertierung nin eine erbliche Basis an b, die dann überall erhöht wird.
    • Die Konvertierung erfolgt mit der Variablen e, die den aktuellen Exponenten verfolgt. e?nkonvertiert die Zahl n*b^e.
    • Die Rekursion endet mit dem 0Zeitpunkt n==0.
    • Ansonsten teilt es sich ndurch die Basis b.
      • (e+1)?div n b behandelt die Rekursion für den Quotienten und den nächsthöheren Exponenten.
      • mod n b*(b+1)^0?ebehandelt den Rest (das ist die Ziffer, die dem aktuellen Exponenten entspricht e), das Inkrement der Basis und konvertiert den aktuellen Exponenten erblich mit 0?e.
Ørjan Johansen
quelle