การเปลี่ยนฐานพันธุกรรม


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เป็นตัวแทนของ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จากbเป็นc , แสดงH(b, c, n)เป็นจำนวนที่ได้รับโดยการใช้การbแทนฐานทางพันธุกรรมของn, แทนที่ทุก ๆbโดยc, และประเมินผลการแสดงออก ตัวอย่างเช่นค่าของ

H(3, 2, 7981676788374679859068493351144698070458)

คือ

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

ความท้าทาย

คุณจะได้รับเป็น input สามจำนวนเต็ม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ในที่สุดก็มาถึง นี้เรียกว่าทฤษฎีบท Goodstein ของ

คำตอบ:


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)

ผมเคยโพสต์นี้มากที่สุดเพราะผมไม่ได้ตระหนักถึงคุณสามารถใช้อาร์กิวเมนต์ที่มีชื่อใน D(GHY=Z0)R&Y+*%YG^H(GHZ)(GH/YGhZpyth: รู้สึกอิสระที่จะเพิ่มถ้าคุณต้องการ (ฉันออกไปเคล็ดลับสำหรับการเล่นกอล์ฟใน pyth: D)
FryAmTheEggman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.