স্টার্ন-ব্রোকট গাছের একটি ভগ্নাংশের অবস্থান খুঁজুন


11

স্টার্ন-Brocot গাছ ভগ্নাংশের একটি বাইনারি ট্রি যেখানে প্রতিটি ভগ্নাংশ numerators এবং এবং এটি প্রতিবেশী উপরে মাত্রা দুই ভগ্নাংশের denominators, যোগ করে অর্জিত হয়।

এটি "সমাপ্তি ভগ্নাংশ" দিয়ে শুরু করে 0/1এবং 1/0সেখান থেকে উত্পাদিত হয় এবং সেখান থেকে প্রতিটি ভগ্নাংশের প্রতিটি ক্রমাগত জোড়ের মধ্যে একটি ভগ্নাংশ স্থাপন করে পুনরাবৃত্তি করে সেই ভগ্নাংশের সংখ্যক এবং সংজ্ঞা যুক্ত করে, যেমন:

0.  0/1                                                             1/0
1.  0/1                             1/1                             1/0
2.  0/1             1/2             1/1             2/1             1/0
3.  0/1     1/3     1/2     2/3     1/1     3/2     2/1     3/1     1/0
4.  0/1 1/4 1/3 2/5 1/2 3/5 2/3 3/4 1/1 4/3 3/2 5/3 2/1 5/2 3/1 4/1 1/0

স্টার্ন-Brocot বৃক্ষ (প্রতিটি পুনরাবৃত্তির nতম পুনরাবৃত্তির), আছে 2^n + 1ক্রমানুসারে উপাদান, যা আমরা থেকে একটি ভগ্নাংশ আরোপ করতে 0/2^nকরতে 2^n/2^n। প্রতিটি নতুন পুনরাবৃত্তি একটানা প্রতিটি ভগ্নাংশের মধ্যে একটি ভগ্নাংশ "অর্ধেক" সন্নিবেশ করায়।

এটি স্টার্ন-ব্রোকট গাছকে ধনাত্মক যুক্তিযুক্ত সংখ্যা এবং বাইনারি ভগ্নাংশগুলি 0 এবং 1 এর মধ্যে এক থেকে এক ম্যাপিং করে তোলে, যার ফলে দুটি সেট একই কার্ডিনালিটির রয়েছে তার প্রমাণ হিসাবেও পরিবেশন করে।

আপনার কাজটি এমন কোনও প্রোগ্রাম বা ফাংশন লিখতে হয় যা সর্বনিম্ন পদে ধনাত্মক যুক্তিযুক্ত সংখ্যার সংখ্যক এবং ডিনোমিনেটর দেওয়া হয়, স্টার-ব্রোকট গাছের মধ্যে ভগ্নাংশের অবস্থানের সাথে বাইনারি ভগ্নাংশ নির্ধারণ করে।

ইনপুট এবং আউটপুটগুলির উদাহরণ নীচে সরবরাহ করা হয়েছে:

2/3 -> 3/8   (4th number in iteration 3)
4/7 -> 9/32  (between 1/2 and 3/5 in the chart above)
1/1 -> 1/2   (middle number in the first iteration)

ইনপুটগুলি আপনাকে সমর্থন করার দরকার নেই, তবে রেফারেন্সের জন্য এটি অন্তর্ভুক্ত করা হয়েছে:

0/1 -> 0/1   (0/1 is considered the left number)
1/0 -> 1/1   (1/0 is considered the rightmost number)

এই লক্ষ্য অর্জনে যে কোনও ভাষায় সংক্ষিপ্ততম প্রোগ্রামটি জয়ী হয়।


কোন ইনপুট / আউটপুট প্রয়োজনীয়তা আছে? উদাহরণস্বরূপ, আপনার রেফারেন্স সমাধানের মতো কেবল একটি ফাংশনই যথেষ্ট, না কি এটি একটি একা থাকা প্রোগ্রামের দরকার? ভগ্নাংশ আউটপুট বিন্যাসে কি ব্যাপার?
ড্যারেন স্টোন

একটি ফাংশন যথেষ্ট। আমি সমস্যার বর্ণনায় সেই পরিষ্কার করে দেব।
জো জেড।

আমার এটি সম্পর্কে চিন্তা করতে দেরি হয়েছে; আমি আগামীকাল সম্ভবত এটি স্পষ্ট করার চেষ্টা করব।
জো জেড।

2
ঠিক আছে, আমি মনে করি আপনি যে দ্বিধাটির কথা মনে রেখেছেন তা হ'ল গাছের প্রতিটি গভীরতার জন্য বাম দিক থেকে ধ্রুবক ডিনোমিনেটর 2 ^ (গভীরতা + 1) এবং অংক 1, 3, 5, 7, ... নির্ধারণ করা।
পিটার টেলর

1
এটা নির্মানের একটি বিকল্প উপায় 1 পানা প্রথম অর্ডার শুরুর মধ্যে গাছের নোড (অর্থাত প্রথম সংখ্যা হয় 1/1 => 1, 1/2 => 2, 2/1 => 3, 1/3 => 4, ইত্যাদি)। যদি কোনও নোডের জন্য উত্পন্ন সংখ্যাটি হয় nতবে 2^lg n(বাইনারি লগ) সর্বাধিক বিট সেট করা থাকে nএবং কাঙ্ক্ষিত বাইনারি ভগ্নাংশ হয় (2*(n - 2^lg n) + 1) / 2^(lg n + 1)। (যে ব্যক্তি যে কোনও নির্দেশ-সেট-এ একত্রিতকারী সমাধানটি সর্বাধিক-সেট-বিটের সাহায্যে গ্রহণ করে সে সম্ভবত এই পদ্ধতির ব্যবহার করতে চাইবে)।
পিটার টেলর

উত্তর:


1

গল্ফস্ক্রিপ্ট ( 49 48 46 টি )

{0\@{}{@2*2$2$>!+@@{{\}3$)*}:j~1$-j}/\)\,?}:f;

অথবা

{0:x;\{}{.2$<!2x*+:x){\}*1$-{\}x)*}/x@)@,?}:g;

উভয়ই ফাংশন যা স্ট্যাকের উপর অংকের এবং ডিনোমিনেটর নেয় এবং স্ট্যাকের উপর অংকের এবং ডিনোমিনিটরটি রেখে দেয়। অনলাইন ডেমো

মূল ধারণাটি কংক্রিট গণিত বিভাগের 4.5 (আমার সংস্করণে পি 122) সিউডোকোডে প্রকাশ করা হয়েছে :

while m != n do
    if m < n then (output(L); n := n - m)
             else (output(R); m := m - n)

যদি এলএস এবং রুপির স্ট্রিংকে এল = 0 এবং আর = 1 দিয়ে বাইনারি মান হিসাবে ব্যাখ্যা করা হয় তবে তার চেয়ে দ্বিগুণ মানটির একটি সংখ্যক হয় এবং ডিনোমিনিটারটি কিছুটা দীর্ঘ হয়।

গল্ফস্ক্রিপ্টগুলির কাছে আগ্রহের বিষয় হিসাবে, যখন আমি উদ্ঘাটনকারীকে দরকারী বলে খুঁজে পেয়েছি তখন সেগুলির মধ্যে এটি একটি। (ঠিক আছে, আমি কেবল এটি লুপ কাউন্টার হিসাবে ব্যবহার করি তবে এটি কিছুই অপেক্ষা ভাল)।


1

গাণিতিক, 130 114 111 চার্স

f=#~g~0&;0~g~q_=q;p_~g~q_:=g[#,(Sign[p-#]+q)/2]&@FromContinuedFraction[ContinuedFraction@p/.{x___,n_}:>{x,n-1}]

উদাহরণ:

f[2/3]

3/8

f[4/7]

9/32

f[1]

1/2


1

রুবি, 132 125

রুবি & জিওজেড থেকে রেফারেন্স সমাধানটি গল্ফ করেছে।

def t(n,d)u=k=0;v,j,f,g,b=[1,]*5;c=2
while(z=(f*d).<=>(g*n))!=0;z>0?(j,k=f,g):(u,v=f,g);b=b*2-z;f,g=u+j,v+k;c*=2;end
[b,c]end

ব্যবহারের উদাহরণ:

>> t(2,3)
=> [3, 8]
>> t(4,7)
=> [9, 32]
>> t(1,1)
=> [1, 2]

1

রুবি (69 টি) কফিস্ক্রিপ্ট (59 টি অক্ষর)

এটি এমন একটি ফাংশন যা সংখ্যার এবং ডিনোমিনেটরটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং দ্বিখণ্ডনের পরে অঙ্ক এবং ডিনোমিনেটর সমন্বিত একটি অ্যারে প্রদান করে।

g=(a,b,x=0,y=1)->c=a>=b;a&&g(a-b*c,b-a*!c,2*x+c,2*y)||[x,y]

অনলাইন ডেমো

এটি উপরের আমার গল্ফস্ক্রিপ্ট সমাধানের মতো একই পদ্ধতির ব্যবহার করে তবে এটি আরও বেশি পঠনযোগ্য কারণ বক্সিং এবং অ্যারেতে আনবক্সিংয়ের বিষয়ে চিন্তা না করেই আমি 4 ভেরিয়েবল ব্যবহার করতে পারি। আমি কফিস্ক্রিপ্টটি বেছে নিয়েছি কারণ এটি $20 পিএইচপি-র উপরে সংরক্ষণযোগ্য ভেরিয়েবলগুলির সাথে প্রিফিক্স করে না , এতে সংক্ষিপ্ত ফাংশন সংজ্ঞা বাক্য গঠন রয়েছে যা ডিফল্ট প্যারামিটার মানগুলিকে অনুমতি দেয় (সুতরাং কোনও f(a,b,x,y)ফাংশনে মোড়ানোর দরকার নেই g(a,b) = f(a,b,0,1)), এবং আমাকে বুলিয়ানগুলিকে পূর্ণসংখ্যা হিসাবে ব্যবহার করতে দেয় দরকারী মান সহ এক্সপ্রেশন। যারা এটি জানেন না তাদের জন্য কফিস্ক্রিপ্টের স্ট্যান্ডার্ড সি-স্টাইলের টের্নারি অপারেটর নেই ( C?P:Q) তবে আমি C&&P||Qএখানে বিকল্প দিতে পারছি কারণ Pকখনও মিথ্যা হবে না।

একটি যুক্তিযুক্তভাবে আরও মার্জিত, তবে অল্প অল্প সংক্ষিপ্ত, বিকল্পটি বিভাগ এবং মডুলোর সাথে পুনরাবৃত্তি বিয়োগকে প্রতিস্থাপন করা হয়:

f=(a,b,x=0,y=1,p=0)->a&&f(b%a,a,(x+p<<b/a)-p,y<<b/a,1-p)||[x+p,y]

(65 টি অক্ষর; অনলাইন ডেমো )। এটি এইভাবে লেখা ইউক্লিডের অ্যালগরিদমের সাথে সম্পর্কটি উন্মোচিত করে।


আপনার চারপাশে আপনার প্রথম বন্ধনীর প্রয়োজন নেই a<bযা আপনাকে একটি চর সংরক্ষণ করে। ইনলাইনিং cআরও দুটি দেয়। আপনি f=->a,b,x=0,y=1{...}এমনকি সংক্ষিপ্ত সংজ্ঞা জন্য সিনট্যাক্স বিবেচনা করতে পারেন ।
হাওয়ার্ড

@ হওয়ার্ড, আমি জানি না আপনি রুবির কোন সংস্করণটি ব্যবহার করছেন তবে আইডিয়োতে ​​আমি যদি এই প্যারেন্টেসিসগুলি সরিয়ে ফেলার চেষ্টা করি বা সেই ফাংশন সিনট্যাক্সটি ব্যবহার করার চেষ্টা করি তবে আমি একটি সিনট্যাক্স ত্রুটি পেয়েছি।
পিটার টেলর

c=a<b ?পরে অতিরিক্ত স্থান দিয়ে চেষ্টা করুন b। অন্যথায় প্রশ্নের চিহ্নটিকে অংশ হিসাবে বিবেচনা করা হয় b
হাওয়ার্ড

0

পাইথন - 531

শেষ-স্থানের রেফারেন্স সমাধান হিসাবে পরিবেশন করার জন্য পাইথনের একটি অবারিত সমাধান:

def sbtree(n, d): 
    ufrac = [0, 1]
    lfrac = [1, 0]
    frac = [1, 1]
    bfrac = [1, 2]
    while(frac[0] * d != frac[1] * n): 
        if(frac[0] * d > frac[1] * n): 
            # push it towards lfrac
            lfrac[0] = frac[0]
            lfrac[1] = frac[1]
            bfrac[0] = bfrac[0] * 2 - 1 
        elif(frac[0] * d < frac[1] * n): 
            # push it towards ufrac
            ufrac[0] = frac[0]
            ufrac[1] = frac[1]
            bfrac[0] = bfrac[0] * 2 + 1 
        frac[0] = ufrac[0] + lfrac[0]
        frac[1] = ufrac[1] + lfrac[1]
        bfrac[1] *= 2
    return bfrac

এটি কেবল দুটি ভগ্নাংশের মধ্যস্থত সর্বদা two দুটি ভগ্নাংশের মানগুলির মধ্যে থাকবে বলে এই সুযোগ গ্রহণ করে ভগ্নাংশের মধ্যে দ্বিপদী অনুসন্ধান করে ।


0

গল্ফস্ক্রিপ্ট, 54 টি অক্ষর

'/'/n*~][2,.-1%]{[{.~3$~@+@@+[\]\}*].2$?0<}do.@?'/'@,(

টাস্কে নির্দিষ্ট ফর্মটি ইনপুট অবশ্যই STDIN এ দেওয়া উচিত। আপনি অনলাইন চেষ্টা করতে পারেন ।

> 4/7
9/32

> 9/7
35/64

> 5/1
31/32

0

গণিত 138

আলেফালফার পদ্ধতির মতো প্রবাহিত নয়, তবে আমি এ পর্যন্ত উত্পাদন করতে সক্ষম হয়েছি এটিই সেরা।

q_~r~k_:=Nest[#+Sign@k/(2Denominator@# )&,q,Abs@k]  
g@d_:=
Module[{l=ContinuedFraction@d,p=-1},
l[[-1]]-=1;
(p=-p;# p)&/@l]
h[q_]:=Fold[r,1/2,g@q]

পরীক্ষামূলক

h[2/3]
h[4/7]
h[1]

3/8
9/32
1/2


0

জাভাস্ক্রিপ্ট 186

f=(p1,q1,p2,q2)=>{if(p1*q2+1==p2*q1){return{p:p1+p2,q:q1+q2}}let p,q,pl=0,ql=1,ph=1,qh=0;for(;;){p=pl+ph;q=ql+qh;if(p*q1<=q*p1){pl=p;ql=q}else if(p2*q<=q2*p){ph=p;qh=q}else return{p,q}}}

কম হতে পারে, তবে আমি পঠনযোগ্য গল্ফ পছন্দ করি


0

হাস্কেল , 125 বাইট

n((a,b):(c,d):r)=(a,b):(a+c,b+d):n((c,d):r)
n a=a
z=zip[0..]
t x=[(j,2^i)|(i,r)<-z$iterate n[(0,1),(1,0)],(j,y)<-z r,x==y]!!0

এটি অনলাইন চেষ্টা করুন!

একটি জুটির আকারে ইনপুট এবং আউটপুট (n,d)

সংক্ষিপ্ত বর্ণনা:

nপ্রতিটি জোড় ভগ্নাংশ দেখে এবং প্রথমটি এবং পুনরাবৃত্তির মধ্যে নতুন সন্নিবেশ করিয়ে (যা দ্বিতীয় ভগ্নাংশটি ঠিক সেখানে রাখবে) পূর্ববর্তী থেকে পরবর্তী সারিটি তৈরি করে। বেস কেসটি খুব সহজ কারণ এটি মূলত কেবল পরিচয়ের কাজ। tফাংশনটি পুনরাবৃত্তি করে যা কেবল দুটি সীমানা ভগ্নাংশের সাথে প্রাথমিক অবস্থার ভিত্তিতে অনির্দিষ্টকালের জন্য ফাংশনটি পুনরায় করে। tতারপরে প্রতিটি সারিতে ( i) এবং সারিটির প্রতিটি আইটেমকে সূচীকরণ ( j) করে এবং আমরা যা খুঁজছি তার সাথে মেলে এমন প্রথম ভগ্নাংশের সন্ধান করে। এটি যখন খুঁজে পায় এটি অঙ্ক jহিসাবে এবং 2^iডিনোমিনেটর হিসাবে ফলন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.