Спадкові зміни бази


9

Фон

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

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

Тепер, спадкова base- bуявлення nвиходить шляхом перетворення експоненти в їх base- 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), - це число, отримане шляхом прийняття спадкової бази - 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. Це відомо як теорема Гудштейна .

Відповіді:


6

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

Завдяки Optimizer за збереження двох байтів.

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

Пітон 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)

Я розміщував це здебільшого, тому що я не розумів, що ви можете використовувати названі аргументи в pyth : D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Не соромтеся додати його, якщо хочете (я переходжу до підказок щодо гольфу в pyth: D)
FryAmTheEggman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.