遗传基础变化


9

背景

在这一挑战,一个碱基b表示的整数的n是的表达n作为功率的总和b,其中每个术语最多出现b-1次数。例如,的基本4表示2015

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

现在,遗传碱基b的表示n是通过将指数纳入其碱基获得的b陈述,然后将它们的指数,等等递归。因此,的遗传基础4表示2015

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

作为一个更复杂的例子中,遗传碱基3的表示

7981676788374679859068493351144698070458

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

遗传基数变化(nbc表示为H(b, c, n))是通过获取的遗传基数b表示形式n,用bby 替换每一个c并评估结果表达式而获得的数字。例如,

H(3, 2, 7981676788374679859068493351144698070458)

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

挑战

您作为输入三个整数bcn,为此,你可以假设n >= 0b, c > 1。您的输出是H(b, c, n)。最短的字节数获胜,并且不允许出现标准漏洞。您可以编写函数或完整程序。您必须能够处理任意大的输入和输出(大数)。

测试用例

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。这就是所谓的古德斯坦定理

Answers:


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

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。当前数字将转换为cc**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 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.