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

2
Könnten Sie eine schrittweise Anleitung für einen Testfall hinzufügen?
Rod

5
Willkommen bei PPCG! Schöne erste Herausforderung!
FantaC


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.


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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.