Alteração hereditária da base

9

fundo

Nesse desafio, uma representação de baseb de um número inteiro né uma expressão de numa soma de potências de b, onde cada termo ocorre na maioria das b-1vezes. Por exemplo, a 4representação base de 2015é

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

Agora, a representação de base hereditáriab de né obtida convertendo os expoentes em suas brepresentações de base , depois convertendo seus expoentes e assim por diante recursivamente. Assim, a 4representação hereditária de base 2015é

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

Como um exemplo mais complexo, a 3representação hereditária de base de

7981676788374679859068493351144698070458

é

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

A mudança de base hereditária nde bparac , denotada H(b, c, n), é o número obtido pela brepresentação- base hereditária de n, substituindo todos os bpor ce avaliando a expressão resultante. Por exemplo, o valor de

H(3, 2, 7981676788374679859068493351144698070458)

é

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

O desafio

Você é dado como entrada três inteiros b, c, n, para o qual você pode assumir n >= 0e b, c > 1. Sua saída é H(b, c, n). A menor contagem de bytes vence e as brechas padrão não são permitidas. Você pode escrever uma função ou um programa completo. Você deve poder manipular entradas e saídas arbitrariamente grandes (bignums).

Casos de teste

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

Fato engraçado

Para qualquer número inteiro n, a sequência obtida por

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

finalmente chega 0. Isso é conhecido como teorema de Goodstein .

Zgarb
fonte

Respostas:

6

CJam, 60 58 45 43 41 38 36 bytes

Agradecemos ao Optimizer por salvar dois bytes.

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

Teste aqui.

Leva a entrada em ordem n b c.

Você pode usar isso para testar a execução de todos os casos de teste:

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

Explicação

Esta é uma implementação bastante direta do processo explicado no desafio, exceto que eu intercalo expansão recursiva de base, substituição de base e cálculo do 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
fonte
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)

Uma solução recursiva. Como o algoritmo recursivo para converter entre bases, exceto que também se repete no expoente.

Dividimos nem duas partes, o dígito atual n%be todos os outros dígitos n/b. O valor atual do local é armazenado no parâmetro opcional s. O dígito atual é convertido em base ccom c**e o expoente sé convertido recursivamente. O restante é convertido da mesma maneira, +H(b,c,n/b,s+1)mas o valor do local sé um mais alto.

Diferentemente da conversão de base, a conversão de base hereditária exigia lembrar o valor do local atual na recursão para sua conversão.

Para facilitar a leitura, veja como é quando be csão constantes globais fixas.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)
xnor
fonte
Eu já postei isso principalmente porque eu não sabia que você poderia usar argumentos nomeados em pyth: D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Sinta-se livre para adicioná-lo se você quiser (eu estou fora de dicas para golfe em pyth: D)
FryAmTheEggman