Perubahan Basis Herediter

9

Latar Belakang

Dalam tantangan ini, basis- brepresentasi integer nadalah ekspresi dari nsebagai jumlah dari kekuasaan b, di mana setiap istilah terjadi pada sebagian besar b-1kali. Sebagai contoh, 4representasi dasar 2015adalah

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

Sekarang, keturunan dasar- brepresentasi ndiperoleh dengan mengubah eksponen menjadi dasar- mereka brepresentasi, kemudian mengubah eksponen mereka, dan seterusnya secara rekursif. Jadi, 4representasi dasar herediter dari 2015is

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

Sebagai contoh yang lebih kompleks, 3representasi turun temurun dari

7981676788374679859068493351144698070458

adalah

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

The perubahan dasar turun-temurun dari ndari bkec , dilambangkan H(b, c, n), adalah jumlah yang diperoleh dengan mengambil basis-turun-temurun brepresentasi n, menggantikan setiap boleh c, dan mengevaluasi ekspresi yang dihasilkan. Misalnya, nilai

H(3, 2, 7981676788374679859068493351144698070458)

adalah

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

Tantangan

Anda diberikan sebagai masukan tiga bilangan bulat b, c, n, yang Anda mungkin menganggap n >= 0dan b, c > 1. Output Anda adalah H(b, c, n). Hitungan byte terpendek menang, dan celah standar tidak diizinkan. Anda dapat menulis fungsi atau program lengkap. Anda harus dapat menangani input dan output yang besar dan sewenang-wenang (bignum).

Uji Kasus

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

Fakta Menarik

Untuk bilangan bulat apa pun n, urutan diperoleh oleh

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

akhirnya mencapai 0. Ini dikenal sebagai teorema Goodstein .

Zgarb
sumber

Jawaban:

6

CJam, 60 58 45 43 41 38 36 byte

Terima kasih kepada Pengoptimal karena menyimpan dua byte.

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

Uji di sini.

Mengambil input secara berurutan n b c.

Anda dapat menggunakan ini untuk menguji menjalankan semua kasus uji:

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

Penjelasan

Ini adalah implementasi yang cukup langsung dari proses yang dijelaskan dalam tantangan, kecuali bahwa saya interleave ekspansi basis rekursif, substitusi dasar dan perhitungan hasil akhir:

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
sumber
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)

Solusi rekursif. Seperti algoritma rekursif untuk mengkonversi antara basis, kecuali itu berulang pada eksponen juga.

Kami membagi nmenjadi dua bagian, digit saat ini n%b, dan semua digit lainnya n/b. Nilai tempat saat ini disimpan dalam parameter opsional s. Digit saat ini dikonversi ke basis cdengan c**dan eksponen sdikonversi secara rekursif. Sisanya kemudian dikonversi dengan cara yang sama, +H(b,c,n/b,s+1)tetapi nilai tempat slebih tinggi.

Tidak seperti konversi basis, konversi basis herediter diperlukan mengingat nilai tempat saat ini dalam rekursi untuk dikonversi.

Untuk kemudahan membaca, inilah yang terlihat seperti kapan bdan cmerupakan konstanta global tetap.

H=lambda n,s=0:n and n%b*c**H(s)+H(n/b,s+1)
Tidak
sumber
Aku sudah diposting ini terutama karena saya tidak menyadari Anda bisa menggunakan bernama argumen dalam pyth: D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZ. Jangan ragu untuk menambahkannya jika Anda mau (saya akan tips untuk bermain golf di pyth: D)
FryAmTheEggman