Изменение наследственной базы

9

Фон

В этой задаче базовое bпредставление целого числа nявляется выражением nв виде суммы степеней b, где каждый член встречается в большинстве b-1случаев. Например, base- 4представление 2015является

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

Теперь наследственное базисное bпредставление nполучается путем преобразования показателей в их базовые bпредставления, затем преобразования их показателей и т. Д. Рекурсивно. Таким образом, наследственная base- 4представление 2015IS

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

В качестве более сложного примера, наследственная база- 3представление

7981676788374679859068493351144698070458

является

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

Наследственная база изменения nот bдоc , обозначаемый H(b, c, n), это число , полученное путем принятия наследственного base- bпредставления n, заменяя каждый с bпомощью c, и оценивая полученное выражение. Например, значение

H(3, 2, 7981676788374679859068493351144698070458)

является

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

Соревнование

Вам предоставляется в качестве входных данных трех целых чисел b, c, n, для которых вы можете считать n >= 0и b, c > 1. Ваш выход H(b, c, n). Самый короткий счет байтов побеждает, и стандартные лазейки запрещены. Вы можете написать либо функцию, либо полную программу. Вы должны быть в состоянии обрабатывать произвольно большие входы и выходы (bignums).

Тестовые случаи

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

Интересный факт

Для любого целого числа nпоследовательность получается

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

в конце концов достигает 0. Это известно как теорема Гудштейна .

Zgarb
источник

Ответы:

6

CJam, 60 58 45 43 41 38 36 байт

Спасибо оптимизатору за сохранение двух байтов.

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

Проверьте это здесь.

Принимает ввод в порядке n b c.

Вы можете использовать это для тестирования всех тестовых случаев:

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

объяснение

Это довольно прямая реализация процесса, описанного в задаче, за исключением того, что я чередую рекурсивное расширение базы, замену базы и вычисление конечного результата:

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.";
Мартин Эндер
источник
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)

Рекурсивное решение. Подобно рекурсивному алгоритму преобразования между базами, за исключением того, что он также рекурсивный по показателю степени.

Разобьем nна две части: текущую цифру n%bи все остальные цифры n/b. Текущее значение места сохраняется в необязательном параметре s. Текущая цифра преобразуется в основание cс помощью, c**а показатель степени sпреобразуется рекурсивно. Остаток затем конвертируется таким же образом, +H(b,c,n/b,s+1)но значение места на sединицу выше.

В отличие от базового преобразования, наследственное базовое преобразование требует запоминания текущего значения места в рекурсии для его преобразования.

Для удобства чтения, вот как это выглядит, когда bи cфиксированные глобальные константы.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)
XNOR
источник
Я отправил это в основном потому , что я не понял , вы могли бы использовать именованные аргументы в pyth: D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Не стесняйтесь добавлять его, если хотите (я собираюсь дать советы по игре в гольф в пите: D)
FryAmTheEggman