遺伝的基盤の変化


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

遺伝的塩基変化nからbc表記はH(b, c, n)、遺伝塩基取ることによって得られる数でbの表現をn、すべてを交換bすることによりc、得られた式を評価します。たとえば、

H(3, 2, 7981676788374679859068493351144698070458)

です

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

チャレンジ

あなたが入力三つの整数として与えられているbcnあなたが想定する可能性があるため、n >= 0b, 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バイト

2バイトを節約してくれた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と他のすべての数字の2つの部分に分割しますn/b。現在の場所の値は、オプションのパラメータに格納されますs。現在の数字は塩基に変換されcc**、指数がs再帰的に変換されます。残りは同じ方法で変換さ+H(b,c,n/b,s+1)れますが、場所の値sは1つ高くなります。

基本変換とは異なり、遺伝的基本変換では、変換するために再帰の現在の場所の値を覚えておく必要がありました。

読みやすくするために、固定グローバル定数の場合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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.