নিকটতম ভগ্নাংশ


24

টাস্ক:

আপনার প্রোগ্রামটি বিন্যাসে একটি যথাযথ , ধনাত্মক সাধারণ ভগ্নাংশ দেওয়া হয়েছে <numerator>/<denominator>

এই ইনপুটটির জন্য, এটি দুটি ভগ্নাংশ খুঁজে বের করতে হবে।

  1. একটি ভগ্নাংশ যা ইনপুট থেকে কম is
  2. একটি ভগ্নাংশ যা ইনপুট থেকে বড়।

উভয় ভগ্নাংশের অবশ্যই ইনপুট থেকে কম ডিনোমিনেটর থাকতে হবে। সমস্ত সম্ভাব্য ভগ্নাংশগুলির মধ্যে, তাদের ইনপুটটির সাথে সর্বনিম্ন পার্থক্য থাকা উচিত।

আউটপুট:

আপনার প্রোগ্রামের আউটপুট অবশ্যই হবে:

  • বিন্যাসে ইনপুট থেকে ছোট একটি ভগ্নাংশ <numerator>/<denominator>
  • একটি স্পেস অক্ষর অনুসরণ করে (ASCII কোড 32)।
  • বিন্যাসে ইনপুটের চেয়ে বড় ভগ্নাংশ অনুসরণ করে <numerator>/<denominator>

নিম্নরূপ:

«fraction that is < input» «fraction that is > input»

নিয়মাবলী:

  • আউটপুট করা সমস্ত ভগ্নাংশটি অবশ্যই সর্বনিম্ন শর্তে
  • আউটপুট করা সমস্ত ভগ্নাংশ অবশ্যই সঠিক ভগ্নাংশ হতে পারে।
  • যদি নিয়মের দ্বারা অনুমোদিত কোনও যথাযথ ভগ্নাংশ সম্ভব না হয় তবে আপনাকে 0ভগ্নাংশ <ইনপুট এবং 1ভগ্নাংশ> ইনপুটের পরিবর্তে আউটপুট দিতে হবে ।
  • আপনি ভগ্নাংশটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে গ্রহণ করতে চান কিনা yourprogram.exe 2/5বা ব্যবহারকারী ইনপুটটির জন্য অনুরোধ করতে পারেন।
  • আপনি ধরে নিতে পারেন আপনার প্রোগ্রামটি অবৈধ ইনপুট গ্রহণ করবে না।
  • সংক্ষিপ্ততম কোড (কোনও বাইটে, কোনও ভাষায়) জিতে যায়।
  • কোনও অ-মানক কমান্ড-লাইন আর্গুমেন্ট (আর্গুমেন্ট যা সাধারণত স্ক্রিপ্ট চালানোর প্রয়োজন হয় না) মোট অক্ষর গণনার দিকে গণনা করে।

  • আপনার প্রোগ্রামটি অবশ্যই না করে:

    • যে কোনও বাহ্যিক সংস্থান উপর নির্ভর করে।
    • নির্দিষ্ট ফাইলের নাম থাকার উপর নির্ভর করে।
    • প্রয়োজনীয় আউটপুট ছাড়া অন্য কিছু আউটপুট।
    • দৌড়াতে ব্যতিক্রমী দীর্ঘ সময় নিন। যদি আপনার প্রোগ্রামটি 179565/987657কোনও গড় বাড়ির ব্যবহারকারীর কম্পিউটারে 6-সংখ্যার সংখ্যক এবং ডিনোমিনেটর (উদা। ) দিয়ে ভগ্নাংশের জন্য এক মিনিটেরও বেশি সময় ধরে চলে যায় তবে এটি অবৈধ।
    • 0ডিনোমিনেটর হিসাবে আউটপুট ভগ্নাংশ । আপনি শূন্য দ্বারা ভাগ করতে পারবেন না।
    • অঙ্ক 0হিসাবে আউটপুট ভগ্নাংশ । আপনার প্রোগ্রামটি 0ভগ্নাংশের পরিবর্তে আউটপুট দিতে হবে ।
    • একটি ইনপুটযুক্ত ভগ্নাংশ হ্রাস করুন। যদি ইনপুট হিসাবে প্রদত্ত ভগ্নাংশটি হ্রাসযোগ্য হয় তবে আপনাকে অবশ্যই ভগ্নাংশটি ইনপুটযুক্ত হিসাবে ব্যবহার করতে হবে।
  • আপনার প্রোগ্রামটি অবশ্যই এমন একটি প্রোগ্রামিং ভাষায় লেখা উচিত নয় যার জন্য এই চ্যালেঞ্জ পোস্ট হওয়ার আগে প্রকাশ্যে উপলব্ধ সংকলক / দোভাষীর উপস্থিতি ছিল না।

উদাহরণ:

ইনপুট: 2/5
আউটপুট: 1/3 1/2

ইনপুট: 1/2
আউটপুট: 0 1

ইনপুট: 5/9
আউটপুট: 1/2 4/7

ইনপুট: 1/3
আউটপুট: 0 1/2

ইনপুট: 2/4
আউটপুট: 1/3 2/3

ইনপুট: 179565/987657
আউটপুট: 170496/937775 128779/708320


1
আপনার প্রথম উদাহরণ স্পেসিফিকেশনের সাথে মেলে না: উভয় ভগ্নাংশের অবশ্যই ইনপুট থেকে কম ডিনোমিনেটর থাকতে হবে।
হাওয়ার্ড

1
প্রথম উদাহরণ, আউটপুট হওয়া উচিত 1/3 1/2
হাইকো ওবারডিক

@ হাইকো ওবারডিক আপনি ঠিক বলেছেন সংশোধন করা হয়েছে।
ব্যবহারকারী 2428118

1
"গড় বাড়ির ব্যবহারকারীর কম্পিউটার" সংজ্ঞা দিন। 1.6GHz ইন্টেল অ্যাটম মেশিনে 90 সেকেন্ড কি গ্রহণযোগ্য?
জন ডিভোরাক

2
আপনার শেষ উদাহরণটি ভুল। ইনপুট ভগ্নাংশ আউটপুট ভগ্নাংশের প্রথম সমান।
ডেভিডসি 21

উত্তর:


3

সেজ - 119 117

x,X=map(int,raw_input().split('/'))
a=0
A=c=C=1
while C<X:exec("ab,,AB"[c*X>C*x::2]+"=c,C");c=a+b;C=A+B
print a/A,b/B

সেজ কেবলমাত্র শেষ লাইনে প্রয়োজন, যা আউটপুট যত্ন করে। অন্য সব কিছুই পাইথনে কাজ করে।

প্রতিস্থাপন raw_input()সঙ্গে sys.argv[1]ইনপুট একটি প্রম্পট পরিবর্তে একটি কম্যান্ড-লাইন যুক্তি থেকে পড়তে হয়েছে। এটি অক্ষরের সংখ্যা পরিবর্তন করে না। ( sysপ্রথমে আমদানি না করে পাইথনে কাজ করে না ))

এটি মূলত বিদ্যমান উপাদানগুলির মধ্যস্থতাকারীগুলি ব্যবহার করে সম্পর্কিত ফেরে ক্রমটি পুনরাবৃত্তভাবে তৈরি করে তবে ইনপুটটির নিকটবর্তী সেই উপাদানগুলিতে নিজেকে সীমাবদ্ধ করে। অন্য দৃষ্টিকোণ থেকে, এটি সম্পর্কিত ফ্রেই সিকোয়েন্সগুলিতে নেস্টেড-ইন্টারভেল অনুসন্ধান চালায়।

এটি আমার মেশিনে এক সেকেন্ডেরও কম সময়ের মধ্যে সমস্ত উদাহরণকে সঠিকভাবে প্রক্রিয়া করে।

এখানে একটি অবারিত সংস্করণ:

x,X = map(Integer,sys.argv[1].split('/'))
x = x/X
a = 0
c = b = 1
while c.denominator() < X:
    if c > x:
        b = c
    else:
        a = c
    c = ( a.numerator() + b.numerator() ) / ( a.denominator() + b.denominator() )
print a,b

আমি ইতিমধ্যে ভয় পেয়েছি যে আমি এই অনুগ্রহের জন্য কোনও নতুন জমা পড়ব না। মহান কাজ.
ব্যবহারকারী 2428118

দারুণ কৌশল exec!
xnor

অনুগ্রহকালীন সময়ের মধ্যে একমাত্র উত্তর হিসাবে জমা দেওয়া, আমি এর মাধ্যমে আপনাকে অনুগ্রহ প্রদান করছি। অভিনন্দন।
ব্যবহারকারী 2428118

আমি কেবল উদাহরণগুলির মধ্যে একটিতে একটি ত্রুটি স্থির করেছি । আপনি আপনার জমাটি সংশোধন করতে চাইতে পারেন (যদিও আপনি এটি জমা দেওয়ার অর্ধ বছর হয়ে গেছে)।
ব্যবহারকারী 2428118

12

পাইথন 2.7 - 138

x,y=n,d=map(int,raw_input().split('/'))
while y:x,y=y,x%y
def f(p,a=d):
 while(a*n+p)%d:a-=1
 print`(a*n+p)/d`+('/'+`a`)*(a>1),
f(-x);f(x)

আমি সুস্পষ্ট উদ্দীপনা সমাধান দিয়ে শুরু করেছি, তবে আমি বুঝতে পেরেছি যে ওপি যেহেতু এক মিনিটের মধ্যে ছয় ডিজিটের অঙ্ক এবং ডিনোমিনেটর দিয়ে উদাহরণগুলি সমাধান করতে সক্ষম হয়েছিল, তাই ট্রিলিয়ন সম্ভাবনার চেষ্টা করার চেয়ে আমার আরও ভাল সমাধানের প্রয়োজন need আমি ফ্যারি সিকোয়েন্সের জন্য উইকিপিডিয়া পৃষ্ঠায় একটি সহজ সূত্রটি পেয়েছি: যদি a / b, c / d এর সাথে থাকে a/b<c/d, তবে তার সাথে , ফেরে সিক্যুয়েন্সগুলির একটিতে প্রতিবেশী হয় b*c-a*b=1। আমার প্রোগ্রামের f এর ভিতরে লুপটি এই সত্যটি অ-হ্রাস সংখ্যাগুলিতে প্রসারিত করে, জিসিডি ব্যবহার করে, যা অন্যদিকে লুপ গণনা করে।

আমি ইতিমধ্যে এটি বেশ কঠিন গল্ফ করেছি, তবে আমি কোনও পরামর্শ শুনতে পছন্দ করব।

সম্পাদনা:

166-> 162: সরানো হয়েছে aএবং bবাইরের প্রোগ্রাম থেকে। তারা অপ্রয়োজনীয় ছিল।
162-> 155: str()-> ` 155->
154: যুক্ত হয়েছে k
154-> 152: xফাংশনের অভ্যন্তর থেকে সরানো , পরিবর্তে এটি একটি আর্গুমেন্ট হিসাবে পাস করেছে।
152-> 150: aএটি একটি আর্গুমেন্ট হিসাবে পাস করার পরিবর্তে একটি ডিফল্ট মান দিয়েছে।
150-> 146: এর আরম্ভের পরিবর্তিত xএবং y
146-> 145: সরানো হয়েছে k
145-> 144: পরিবর্তিত ... এবং ... বা ... (..., ...) [...] এর ফলে একটি স্থান সংরক্ষণ করা হবে।
144-> 138: (..., ...) [...] থেকে ... + ... * (...) পরিবর্তন করা হয়েছে। @ Mbomb007 ধন্যবাদ।

পরীক্ষার কেস:

2/5
1/3 1/2

1/2
0 1

2/4
1/3 2/3

179565/987657
170496/937775 128779/708320

12345678/87654321
12174209/86436891 11145405/79132382

দ্বিতীয় থেকে শেষ পরীক্ষাটি আমার কম্পিউটারে এক সেকেন্ডের অধীনে গিয়েছিল, যখন শেষটি প্রায় 5-10 সেকেন্ড সময় নেয়।


এটি k=1খাঁটি দুষ্টতা।
ইভপোক

1
@ এভপোক: আমি চেষ্টা করছিলাম k = y = n কে কাজ করার জন্য, তবে আপনি যদি কোনও ফাংশনের অভ্যন্তরে একটি পরিবর্তনশীল পরিবর্তন করেন তবে অজগর এটি স্থানীয় হতে চায়। 4 টি অক্ষরে লোকাল ভেরিয়েবল পাওয়ার একমাত্র উপায় ছিল। এছাড়াও, যেহেতু ভগ্নাংশটি ইতিবাচক এবং যথাযথ, তাই
ডোনামিনেটর

পাইথনের সাথে কমান্ড-লাইন আর্গুমেন্টগুলি সহজ, সুতরাং এখানে নির্দেশ অনুসারে সেগুলি ইনপুটটির জন্য ব্যবহার করা উচিত ছিল।
অ্যালেক্স

1
" আপনি ভগ্নাংশটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে (উদাহরণস্বরূপ yourprogram.exe 2/5) বা ব্যবহারকারী ইনপুটটির জন্য প্রম্পট হিসাবে পেতে চান তা চয়ন করতে পারেন " "
isaacg

6 টি অক্ষর সংরক্ষণ করুন:print`(a*n+p)/d`+('/'+`a`)*(a>1),
mbomb007

5

গণিত, 163 বাইট

{a,b}=FromDigits/@InputString[]~StringSplit~"/";r=Range[b-1];""<>Riffle[#~ToString~InputForm&/@(#@DeleteCases[#2[a/b*r]/r,a/b]&@@@{{Max,Floor},{Min,Ceiling}})," "]

এটি ব্যবহারকারী ইনপুট এবং স্ট্রিং হিসাবে ইনপুট / আউটপুট প্রয়োজনীয়তার দ্বারা গুরুতরভাবে সীমাবদ্ধ। স্ট্রিংগুলির সাথে কাজ করা ম্যাথামেটিকায় সত্যই জটিল (কমপক্ষে আপনি যখন গল্ফ করতে চান)। ম্যাথমেটিকায় এটি প্রাকৃতিক উপায়ে করা, (কেবলমাত্র পূর্ণসংখ্যা এবং যুক্তি ব্যবহার করে) আমি সম্ভবত এটি 50% আকারে নামিয়ে আনব।

এটি আমার মেশিনে কয়েক সেকেন্ডে 6-সংখ্যার নম্বর করতে পারে।

কিছুটা বেশি পঠনযোগ্য (যদিও সত্যই নিরপেক্ষ নয়):

{a, b} = FromDigits /@ InputString[]~StringSplit~"/";
r = Range[b - 1];
"" <> Riffle[#~ToString~
     InputForm & /@ (#[DeleteCases[#2[a/b*r]/r, a/b]] & @@@ {{Max, 
       Floor}, {Min, Ceiling}}), " "]

মজা করার জন্য, এই "প্রাকৃতিক উপায়ে" করা, অর্থাত্ একটি সংখ্যক এবং ডিনোমিনেটর গ্রহণ এবং দুটি যুক্তি ফিরিয়ে নেওয়া, এটি কেবলমাত্র 84 টি অক্ষর (সুতরাং আমার 50% অনুমানটি আসলে খুব কাছের ছিল):

f[a_,b_]:=#@DeleteCases[#2[a/b*(r=Range[b-1])]/r,a/b]&@@@{{Max,Floor},{Min,Ceiling}}

3

জুলিয়া - 127 125 বাইট

লুপগুলির প্রয়োজনীয়তা এড়াতে আমি গাণিতিক দৃষ্টিকোণ থেকে এটি পৌঁছেছি, সুতরাং এই কোডটি বড় ইনপুটগুলির জন্য বেশ দ্রুত চলে note অন্যথায় বাজে উত্তরগুলি উত্পন্ন হয় - যদি ক এবং খ উভয়ই ইন্টার 32-এ (32 বিট সিস্টেমে 16 টি) প্রকাশযোগ্য হয় তবে কোনও সমস্যা হয় না।

আপডেট: আর ডিভের জন্য ব্যাকস্ল্যাশ আর ওভারলোড করার দরকার নেই, saving, নেট সেভিং 2 বাইট ব্যবহার করে।

a,b=int(split(readline(),"/"));k=gcd(a,b);f=b-invmod(a÷k,b÷k);d=2b-f-b÷k;print(a*d÷b,d<2?" ":"/$d ",a*f÷b+1,"/$f"^(f>1))

Ungolfed:

a,b=int(split(readline(),"/")) # Read in STDIN in form a/b, convert to int
k=gcd(a,b)           # Get the greatest common denominator
f=b-invmod(a÷k,b÷k)  # Calculate the denominator of the next biggest fraction
d=2b-f-b÷k           # Calculate the denominator of the next smallest fraction
print(a*d÷b,d<2?" ":"/$d ",a*f÷b+1,"/$f"^(f>1)) # Calculate numerators and print

বেসিক ধারণা: অ্যাড-বিসি = জিসিডি (এ, বি) (পরবর্তী ক্ষুদ্রতম) এবং be-af = gcd (a, b) (পরের বৃহত্তম) কে সন্তুষ্ট করে বি এর চেয়ে বৃহত্তম ডি এবং এফ কম সন্ধান করুন, তারপরে সি এবং ই থেকে গণনা করুন আছে। ফলাফল আউটপুট সি / ডি / এফ হয়, যদি না হয় ডি বা এফ 1 হয়, সেই ক্ষেত্রে / ডি বা / এফ বাদ দেওয়া হয়।

মজার বিষয় হল, এর অর্থ কোডটি ইতিবাচক অনুচিত ভগ্নাংশের জন্যও কাজ করে, যতক্ষণ ইনপুটটি পূর্ণসংখ্যা না হয় (এটি, জিসিডি (এ, বি) = ক)।

আমার সিস্টেমে, ইনপুটিং 194857602/34512958303আউটপুট নিতে অনুভূতিযুক্ত সময় নেয় না171085289/30302433084 23772313/4210525219


পরীক্ষা দিয়ে 55552/999999আমাকে দেয় -396/920632 486/936509
ব্যবহারকারী 2428118

@ ইউজার 2428118 - আপনি কি 32 বিট সিস্টেমে আছেন (বা 32 বিট জুলিয়া ব্যবহার করছেন)? আমি "ইনট" ব্যবহার করেছি, যার অর্থ 32 বিট সিস্টেমে এটি ইন্টার 64 এর পরিবর্তে ইন্টার 32 ব্যবহার করবে। int32(55552*999999)দেয় -282630400। আমার জন্য, সেই পরীক্ষার সাথে, আমি পেয়েছি 51143/920632 52025/936509- নোটগুলি একই এবং নোটগুলি 52025-51143 = 486 - (- 396)। আমি এই সমস্যাটি উল্লেখ করার জন্য একটি নোট যুক্ত করব।
গ্লেন ও

আপনি যদি কোডটি সমস্ত ইন্টার 64 আকারের ইনপুটগুলির জন্য কাজ করে তা নিশ্চিত করতে চান তবে আপনি "int 128" এর সাথে "int" প্রতিস্থাপন করতে পারেন। এই পরিবর্তনটির সাথে 1234567891234567/2145768375829475878ফলাফলগুলি ইনপুট করে 869253326028691/1510825213275018197 365314565205876/634943162554457681। এই পরিবর্তনটি মাত্র 3 টি অতিরিক্ত অক্ষর যুক্ত করে।
গ্লেন ও

হ্যাঁ, আমি একটি 32-বিট কম্পিউটার ব্যবহার করছি। আমি যখন এটির জন্য সময় পেয়েছি তখন আমি এটি একটি 64৪-বিট মেশিনে চেষ্টা করব।
ব্যবহারকারী 2428118

একটি 64-বিট কম্পিউটারে পরীক্ষা করা সঠিক ফলাফল দেয়, তাই আমি এই উত্তরটি গ্রহণ করছি।
ব্যবহারকারী 2428118

2

জাভাস্ক্রিপ্ট, 131

চর্বিযুক্ত তীর চিহ্ন এবং evalকল সহ:

m=>{for(e=eval,n=e(m),i=p=0,q=1;++i</\d+$/.exec(m);)if(n*i>(f=n*i|0))g=f+1,p=f/i>e(p)?f+'/'+i:p,q=g/i<e(q)?g+'/'+i:q;return p+' '+q}

179565/987657চাপ পরীক্ষা প্রায় মধ্যে কার্যকর 35 সেকেন্ড , ফায়ারফক্স উপর অনেক Chrome- এ আরো (~ 6 মিনিট)

দ্রুত পদ্ধতি এবং ছাড়াই evalএবং চর্বিযুক্ত তীর চিহ্ন

for(n=eval(m=prompt(a=i=p=0,b=c=d=q=1));++i<m.match(/\d+$/);)if(n*i>(f=n*i|0))g=f+1,p=f*c>i*a?(a=f)+'/'+(c=i):p,q=g*d<i*b?(b=g)+'/'+(d=i):q;alert(p+' '+q)

দ্য 179565/987657চাপ পরীক্ষা প্রায় 5 সেকেন্ডের মধ্যে মৃত্যুদন্ড কার্যকর করা হয়।

গল্ফড নয়:

m=prompt(); //get input
a=0; c=1; //first fraction
b=1; d=1; //second fraction
n=eval(m); //evaluate input
for (i=1; i<m.match(/\d+$/); i++) { //loop from 1 to input denominator
  f=Math.floor(n*i);
  if (n*i > f) { //if fraction not equal to simplification of input
    g=f+1; // f/i and g/i are fractions closer to input
    if (f/i>a/c) a=f, c=i;
    if (g/i<b/d) b=g; d=i; 
  }
}
alert(a+'/'+c+' '+b+'/'+d); //output values handling 0 and 1 correctly

খুব ... অনেক ... eval। EEK
জন ডিভোরাক

3
নিয়ে পরীক্ষা 2/6দেয় 1/3 2/5, তবে 1/3নয় কম কিন্তু সমান 2/6
ব্যবহারকারী 2428118

@ ব্যবহারকারী 2428118 স্থির হয়েছে
মাইকেল এম এম

এই উত্তর এত তাড়াতাড়ি কেন গৃহীত হয়েছে?
ইভপোক

1
@ ইউজার ২৪২৮১৮৮: আপনি জানেন, সমাধান গ্রহণের আগে আপনি কয়েক দিন সময় পার করতে পারবেন। এছাড়াও, এই সমাধানটি এখন আর সবচেয়ে কম নয়।
isaacg

2

পার্ল, 142 বাইট (সিপিএএন ছাড়াই 155)

use bare A..Z;$/="/";N=<>;D=<>;F=N/D;K=G=1;for$H(1..D){J<F&&J>E?(E,I):J>F&&J<G?(G,K):()=(J=$_/H,"$_/$H")for(Z=int F*H)..Z+1}print I||0," $K\n"

অথবা যদি সিপিএএন মডিউলগুলি অনুমোদিত না হয় / ৪-৪ বার দ্রুত কোডের প্রয়োজন হয়:

$/="/";$N=<>;$D=<>;$F=$N/$D;$g=$G=1;for$d(1..$D){$f<$F&&$f>$E?($E,$e):$f>$F&&$f<$G?($G,$g):()=($f=$_/$d,"$_/$d")for($z=int$F*$d)..$z+1}print$e||0," $g\n"

পূর্ববর্তী সংস্করণটি আমার মেশিনে 9.55 সেকেন্ড নেয়, পরবর্তী সংস্করণটি ২.৪৪ সেকেন্ড।

কম অপঠনযোগ্য:

($N, $D) = split(m[/], <>);
$F = $N / $D;
$G = 1;
foreach $d (1 .. $D) {
    $z = int $F * $d;
    foreach $_ ($z .. $z + 1) {
        $f = $_ / $d;
        ($f < $F && $f > $E ? ($E, $e) :
        ($f > $F && $f < $G ? ($G, $g) : ())) = ($f, "$_/$d");
    }
}
print $e || 0, ' ', $g || 1, "\n";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.