Erbliche Basisänderung

9

Hintergrund

In dieser Herausforderung eine base bDarstellung einer ganze Zahl nist Ausdruck nals eine Summe von Potenzen von b, wo jeder Begriff höchstens tritt b-1Zeiten. Zum Beispiel kann die basen- 4Darstellungsart 2015ist

4^5 + 3*4^4 + 3*4^3 + 4^2 + 3*4 + 3

Nun wird die erbliche Basisdarstellung bvon nerhalten, indem die Exponenten in ihre Basisdarstellungen bkonvertiert werden, dann ihre Exponenten konvertiert werden und so weiter rekursiv. So ist die erbliche base- 4Darstellung 2015IS

4^(4 + 1) + 3*4^4 + 3*4^3 + 4^2 + 3*4 + 3

Als komplexeres Beispiel dient die erbliche Basisrepräsentation 3von

7981676788374679859068493351144698070458

ist

2*3^(3^(3 + 1) + 2) + 3 + 1

Die erbliche Basisänderung von nvon bbisc , bezeichnet H(b, c, n), ist die Zahl, die erhalten wird, indem die erbliche Basisdarstellung bvon genommen nwird, jede bdurch ersetzt cwird und der resultierende Ausdruck bewertet wird. Zum Beispiel der Wert von

H(3, 2, 7981676788374679859068493351144698070458)

ist

2*2^(2^(2 + 1) + 2) + 2 + 1 = 2051

Die Herausforderung

Sie werden als Eingang drei ganze Zahlen gegeben b, c, n, für die Sie übernehmen n >= 0und b, c > 1. Ihre Ausgabe ist H(b, c, n). Die kürzeste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig. Sie können entweder eine Funktion oder ein vollständiges Programm schreiben. Sie müssen in der Lage sein, beliebig große Ein- und Ausgänge (Bignums) zu verarbeiten.

Testfälle

4 2 3 -> 3
2 4 3 -> 5
2 4 10 -> 1028
4 4 40000 -> 40000
4 5 40000 -> 906375
5 4 40000 -> 3584
3 2 7981676788374679859068493351144698070458 -> 56761
2 3 2051 -> 35917545547686059365808220080151141317047

Fun Fact

Für jede ganze Zahl ndie durch

n1 = n
n2 = H(2, 3, n1) - 1
n3 = H(3, 4, n2) - 1
n4 = H(4, 5, n3) - 1
....

erreicht schließlich 0. Dies ist als Goodsteins Theorem bekannt .

Zgarb
quelle

Antworten:

6

CJam, 60 58 45 43 41 38 36 Bytes

Vielen Dank an Optimizer für das Speichern von zwei Bytes.

l~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~

Testen Sie es hier.

Nimmt die Eingabe in der richtigen Reihenfolge auf n b c.

Sie können dies verwenden, um alle Testfälle zu testen:

"3 4 2 
3 2 4 
10 2 4 
40000 4 4 
40000 4 5 
40000 5 4 
7981676788374679859068493351144698070458 3 2 
2051 2 3 "N/
{
~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~
p}/

Erläuterung

Dies ist eine ziemlich direkte Implementierung des in der Herausforderung erläuterten Prozesses, außer dass ich die rekursive Basiserweiterung, Basensubstitution und Berechnung des Endergebnisses verschachtele:

l~:C;:B;{Bb)1$,,@f{1$~=C@)F#*+}~}:F~
l~:C;:B;                             "Read and evaluate input, store b and c in B and C.";
        {                       }:F  "Define a block F. This performs the required conversion.";
         Bb                          "Get digits of input number in base B.";
           )                         "Split off 0-power digit.";
            1$,                      "Copy remaining digits. Get their length n.";
               ,                     "Make array [0 1 ... n-1].";
                @                    "Pull up remaining digits.";
                 f{           }      "Map this block onto the range, passing in the digits
                                      as a second argument each time.";
                   1$~=              "Copy current i, bitwise complement, access digit array.
                                      This accesses the digits in reverse order.";
                       C             "Push the new base C.";
                        @)           "Pull up current i and increment to get power.";
                          F          "Apply F recursively.":
                           ~         "Raise C to the resulting power.";
                            *        "Multiply by digit.";
                             +       "Add to running total.";
                               ~     "The result will be in an array. Unwrap it.";
                                   ~ "Execute F on the input n.";
Martin Ender
quelle
8

Python 2, 55

H=lambda b,c,n,s=0:n and n%b*c**H(b,c,s)+H(b,c,n/b,s+1)

Eine rekursive Lösung. Wie der rekursive Algorithmus zum Konvertieren zwischen Basen, außer dass er auch auf dem Exponenten rekursiv ist.

Wir teilen uns nin zwei Teile, die aktuelle Ziffer n%bund alle anderen Ziffern n/b. Der aktuelle Ortswert wird im optionalen Parameter gespeichert s. Die aktuelle Ziffer wird in Basis cmit konvertiert c**und der Exponent swird rekursiv konvertiert. Der Rest wird dann auf die gleiche Weise konvertiert, da +H(b,c,n/b,s+1)der Platzwert jedoch sum eins höher ist.

Im Gegensatz zur Basiskonvertierung musste bei der erblichen Basiskonvertierung der aktuelle Stellenwert in der Rekursion gespeichert werden, damit er konvertiert werden konnte.

Um das Lesen zu vereinfachen, sehen Sie hier, wie bund wann cfeste globale Konstanten sind.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)
xnor
quelle
Ich habe dies hauptsächlich gepostet, weil ich nicht wusste, dass Sie benannte Argumente in Python verwenden können : D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Fühlen Sie sich frei, es hinzuzufügen, wenn Sie möchten (ich gehe zu Tipps für das Golfen in Python: D)
FryAmTheEggman