Cambio de base hereditaria

9

Antecedentes

En este desafío, una representación baseb de un número entero nes una expresión de ncomo una suma de potencias b, donde cada término se produce en la mayoría de los b-1casos. Por ejemplo, la 4representación base de 2015es

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

Ahora, la representación hereditaria de base se obtiene al convertir los exponentes en sus representaciones de base , luego convertir sus exponentes, y así sucesivamente. Por lo tanto, la representación hereditaria de base esbnb42015

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

Como un ejemplo más complejo, la 3representación hereditaria de base de

7981676788374679859068493351144698070458

es

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

El cambio de base hereditaria de nde bac , denotado H(b, c, n), es el número obtenido tomando la brepresentación de base hereditaria de n, reemplazando cada bpor cy evaluando la expresión resultante. Por ejemplo, el valor de

H(3, 2, 7981676788374679859068493351144698070458)

es

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

El reto

Se le da como entrada tres números enteros b, c, n, para los que puede asumir n >= 0y b, c > 1. Tu salida es H(b, c, n). El conteo de bytes más corto gana, y las lagunas estándar no se permiten. Puede escribir una función o un programa completo. Debe poder manejar entradas y salidas arbitrariamente grandes (bignums).

Casos de prueba

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

Hecho de la diversión

Para cualquier número entero n, la secuencia obtenida por

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

finalmente llega 0. Esto se conoce como teorema de Goodstein .

Zgarb
fuente

Respuestas:

6

CJam, 60 58 45 43 41 38 36 bytes

Gracias a Optimizer por guardar dos bytes.

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

Pruébalo aquí.

Toma entrada en orden n b c.

Puede usar esto para probar ejecutar todos los casos de prueba:

"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}/

Explicación

Esta es una implementación bastante directa del proceso explicado en el desafío, excepto que intercalo la expansión de base recursiva, la sustitución de base y el cálculo del resultado final:

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
fuente
8

Pitón 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)

Una solución recursiva. Al igual que el algoritmo recursivo para convertir entre bases, excepto que también se repite en el exponente.

Nos dividimos nen dos partes, el dígito actual n%by todos los demás dígitos n/b. El valor posicional actual se almacena en el parámetro opcional s. El dígito actual se convierte en base ccon c**y el exponente sse convierte de forma recursiva. El resto se convierte de la misma manera, +H(b,c,n/b,s+1)pero el valor posicional ses uno más alto.

A diferencia de la conversión de base, la conversión de base hereditaria requiere recordar el valor posicional actual en la recursividad para que se convierta.

Para facilitar la lectura, esto es lo que parece cuando by cconstantes globales son fijos.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)
xnor
fuente
He publicado esto sobre todo porque no me di cuenta que podría utilizar argumentos con nombre en Pyth: D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Siéntase libre de agregarlo si lo desea (estoy fuera de consejos para jugar al golf en pyth: D)
FryAmTheEggman