การแปลงจำนวนเงินของลำดับเศษส่วน


16

พื้นหลัง

ลำดับแฟร็ทัลเป็นลำดับเลขจำนวนเต็มที่คุณสามารถลบการเกิดขึ้นครั้งแรกของทุกจำนวนเต็มและจบลงด้วยลำดับเดียวกันก่อน

ลำดับเช่นที่ง่ายมากที่เรียกว่าparaphrases Kimberling ของ คุณเริ่มต้นด้วยจำนวนธรรมชาติบวก:

1, 2, 3, 4, 5, 6, 7, 8, 9, ...

จากนั้นคุณกระเพื่อมในช่องว่าง:

1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...

และจากนั้นคุณเติมช่องว่างด้วยตัวเองซ้ำ ๆ (รวมถึงช่องว่าง):

1, 1, 2, _, 3, 2, 4, _, 5, 3, 6, _, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, _, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, 1, 9, ...

นั่นคือลำดับแฟร็กทัลของเรา! ทีนี้ลองหาผลรวมบางส่วน:

1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...

แต่ถ้าเราทำขั้นตอนนี้ซ้ำอีกล่ะ? "Fractalise" ลำดับใหม่ (เช่นผลรวมบางส่วนที่ได้จากขั้นตอนข้างต้น):

1, _, 2, _, 4, _, 5, _, 8, _, 10, _, 14, _, 15, _, 20, _, 23, ...
1, 1, 2, _, 4, 2, 5, _, 8, 4, 10, _, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, _, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, 1, 20, 8, 23, ...

และรับผลรวมบางส่วนอีกครั้ง:

1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...

ล้างซ้ำ ปรากฎว่ากระบวนการนี้มาบรรจบกัน ทุกครั้งที่คุณทำซ้ำขั้นตอนนี้คำนำหน้าขนาดใหญ่ของลำดับจะยังคงอยู่ หลังจากที่จำนวนเงินที่ไม่มีที่สิ้นสุดของการทำซ้ำคุณจะจบลงด้วย OEIS A085765

สนุกจริง:1กระบวนการนี้จะมาบรรจบกันเพื่อลำดับเดียวกันแม้ว่าเราไม่ได้เริ่มต้นจากจำนวนธรรมชาติตราบเท่าที่ลำดับเดิมเริ่มต้นด้วย หากลำดับดั้งเดิมเริ่มต้นด้วยลำดับอื่นxเราจะได้รับx*A085765แทน

ความท้าทาย

รับจำนวนเต็มบวกNเอาท์พุทNองค์ประกอบที่สามของลำดับที่แปรสภาพ

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

คุณสามารถเลือกว่าจะให้ดัชนีNเป็น 0- หรือตาม 1

กรณีทดสอบ

ลำดับเริ่มต้นด้วย:

1, 2, 4, 5, 9, 11, 16, 17, 26, 30, 41, 43, 59, 64, 81, 82, 108, 117, 147, 151, 192, 203, 246, 248, 307, 323, 387, 392, 473, 490, 572, 573, 681, 707, 824, 833, 980, 1010, 1161, 1165, 1357, 1398, 1601, 1612, 1858, 1901, 2149, 2151, 2458, 2517

ดังนั้นการป้อนข้อมูลควรจะส่งผลในการส่งออก59

นี่คือการใช้งานอ้างอิงไร้เดียงสา CJamซึ่งสร้างNตัวเลขแรก(ที่ระบุNใน STDIN) โปรดทราบว่ารหัสของคุณควรกลับNองค์ประกอบที่ไม่ใช่คำนำหน้าทั้งหมด


เพียงแค่ตรวจสอบ: เราจะแสดงNเทอมที่A085765ถูกต้องไหม
GamrCorps

@GamrCorps ใช่
Martin Ender

คำตอบ:


7

CJam ( 23 22 ไบต์)

จำนวนเงินที่จะได้รับบางส่วนที่ดัชนีแม้แต่ลำดับเศษส่วนซึ่งเป็นA086450 การเกิดซ้ำที่กำหนดไว้ที่นั่นตามคำจำกัดความของ A086450 เป็นพื้นฐานสำหรับการใช้งานเหล่านี้

ใช้ "สแต็ค" อย่างชัดเจน (ในคำพูดที่ทำให้ตกใจเพราะมันไม่ใช่ LIFO):

{),){2md~)\),>+$)}h+,}

การสาธิตออนไลน์

การผ่า

{         e# Anonymous function body; for clarify, pretend it's f(x)
          e# We use a stack [x_0 ... x_i] with invariant: the result is sum_j f(x_j)
  ),      e# Initialise the stack to [0 ... x]
  )       e# Uncons x, because our loop wants one value outside the stack
  {       e# Loop. Stack holds [x_0 ... x_{i-1}] x_i
    2md   e# Split x_i into (x_i)/2 and (x_i)%2
    ~)\   e# Negate (x_i)%2 and flip under (x_i)/2
    ),>   e# If x_i was even, stack now holds [x_0 ... x_{i-1}] [0 1 ... (x_i)/2]
          e# If x_i was odd, stack now holds [x_0 ... x_{i-1}] [(x_i)/2]
    +     e# Append the two arrays
    $     e# Sort to get the new stack
    )     e# Uncons the greatest element in the new stack
  }h      e# If it is non-zero, loop
          e# We now have a stack of zeroes and a loose zero
  +,      e# Count the total number of zeroes, which is equivalent to sum_j f(0)
}

ที่ 23 ไบต์มีวิธีการที่มีประสิทธิภาพมากขึ้นด้วย memoisation:

{2*1a{2md~)\){j}%>:+}j}

การสาธิตออนไลน์


1
ฉันแน่ใจว่ามีบางภาษาที่สั้นกว่าในการนำไปใช้f(0) = 1; f(n) = f(n/2) + (n % 2 ? 0 : f(n-2)); return f(2*x)แต่ฉันไม่สามารถหาวิธีที่จะประหยัดด้วยวิธีการนั้นใน CJam
Peter Taylor

9

Python 2 55 49 42

ฉันไม่รู้ว่าเกิดอะไรขึ้น แต่ดูเหมือนยากที่จะเอาชนะสูตร Maple จากหน้า OEIS สิ่งนี้ใช้การจัดทำดัชนีแบบ 0

f=lambda n,t=0:n<1or f(n/2,n%2)-~-t*f(n-1)

ขอบคุณ @PeterTaylor สำหรับ -6 ไบต์


เป็นเรื่องง่ายที่จะปรับให้เหมาะสม 6 ตัวอักษรหากคุณไม่สนใจประสิทธิภาพ ส่วนหลังจากที่ครั้งแรกorได้อย่างมีประสิทธิภาพg(n,1) = f(n/2,n%2); g(n,0) = f(n-1) + g(n,1); เพื่อให้คุณสามารถดึงออกมาร่วมกันg(n,1)ที่จะได้รับf=lambda n,t=0:n<1or f(n/2,n%2)+0**t*f(n-1)
ปีเตอร์เทย์เลอร์


2

เทมเพลตถือว่าเป็นอันตราย , 124

Fun<If<A<1>,Add<Ap<Fun<Ap<If<Sub<A<1>,Mul<I<2>,Div<A<1>,I<2>>>>,A<0>,A<0,1>>,Div<A<1>,I<2>>>>,A<1>>,Ap<A<0>,Sub<A<1>,T>>>,T>>

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ มันเหมือนกันมากกับคำตอบ Python ของฉันสูตรเมเปิลในหน้า OEIS ยกเว้นว่าฉันไม่ได้ใช้มอดุลัสดังนั้นฉันต้องใช้ nn / 2 * 2 แทน n% 2

ขยาย:

Fun<If<
    A<1>,
    Add<
        Ap<
            Fun<Ap<
                If<
                    Sub<
                        A<1>,
                        Mul<
                            I<2>,
                            Div<A<1>,I<2> >
                        >
                    >,
                    A<0>,
                    A<0,1>
                >,
                Div<A<1>,I<2>>
            >>,
            A<1>
        >,
        Ap<
            A<0>,
            Sub<A<1>, T>
        >
    >,
    T
>> 


0

Matlab 108 103

ฉันใช้ความจริงที่ว่าซีรี่ส์ที่ต้องการคือผลรวมบางส่วนของhttps://oeis.org/A086450

แต่ความซับซ้อนในการคำนวณของการดำเนินการของฉันอยู่ไกลจากที่ดีที่สุดแม้สำหรับการกลับเป็นซ้ำที่เรียบง่ายนี้

n=input('')+1;
z=zeros(1,n);z(1)=1;
for k=1:n;
z(2*k)=z(k);
z(2*k+1)=sum(z(1:k+1));
end;
disp(sum(z(1:n)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.