কিছু পর্যায়ক্রমিক এবং অ-পর্যায়ক্রমিক অংশগুলি অদলবদল করুন


21

প্রতিটি যৌক্তিক সংখ্যার দশমিক উপস্থাপনে p/qআপনার পর্যায়ক্রমিক লেজ, একটি অ পর্যায়ক্রমিক মাথা এবং নিম্নলিখিত বিন্যাসে দশমিক বিন্দুর আগে একটি বিভাগ থাকে:

(before decimal point).(non-periodic)(periodic)

কিছু উদাহরণ অন্তর্ভুক্ত:

1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571)            ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)()                    ## no periodic part
-2/15 = -0.13... = -(0).(1)(3)                ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
                                              ## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()()                            ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)

চ্যালেঞ্জটি হ'ল পর্যায়ক্রমিক এবং অ-পর্যায়ক্রমিক অংশগুলি অদলবদল করা, before decimal pointএকা রেখে নতুন একটি সংখ্যা তৈরি করা। উদাহরণ স্বরূপ:

25/168 = 0.148809523... = (0).(148)(809523)
       => (0).(809523)(148) = 0.809523148148... = 870397/1080000

যদি কোনও সংখ্যার কোনও পর্যায়ক্রমিক অংশ না থাকে তবে 0.25সেই সংখ্যাটিকে একটি নতুন পর্যায়ক্রমিক সংখ্যায় পরিণত করুন, এবং বিপরীতে।

1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1

চ্যালেঞ্জ

  • xইনপুট হিসাবে স্ট্রিং, দুটি ইনপুট, একটি যুক্তিযুক্ত সংখ্যা বা আপনার ভাষা অনুসারে যেকোনো পদ্ধতিতে কোনও ভগ্নাংশ নিন ।
  • xদশমিকের আগে অংশ ছেড়ে এক নতুন সংখ্যা তৈরির দশমিক উপস্থাপনের পর্যায়ক্রমিক এবং অ পর্যায়ক্রমিক অংশগুলি অদলবদল করুন । পর্যায়ক্রমিক অংশটি সর্বদা যত তাড়াতাড়ি সম্ভব শুরু হয় যাতে অ পর্যায়ক্রমিক অংশ যতটা সম্ভব ছোট হয়। উদাহরণ নীচে।
  • নতুন ভগ্নাংশ হিসাবে অদলবদল করা নম্বরটি ফিরিয়ে দিন। আউটপুট হওয়া উচিত হলেও প্রয়োজনীয়ভাবে ইনপুট হ্রাস হয় না। ইনপুট ফর্ম্যাট আউটপুট ফর্ম্যাট থেকে পৃথক করার অনুমতি দেওয়া হয়।
  • লব pএর xএক মিলিয়ন বা তার কম পরম মান একটি পূর্ণসংখ্যা এবং হর হতে হবে qএর xএকটি হতে হবে নন-জিরো এক মিলিয়ন বা তার কম পরম মান পূর্ণসংখ্যা।
  • সংখ্যক rএবং ডিনোমিনেটরsফলাফলের এক মিলিয়নের কম হওয়ার নিশ্চয়তা নেই। এই সংখ্যার পর্যায়ক্রমিক অংশগুলির দৈর্ঘ্য দেওয়া, আপনি সরাসরি ফ্লোটে রূপান্তর এড়াতে বাঞ্ছনীয়।
  • এটি কোড গল্ফ। বাইট জিতে সংক্ষিপ্ত উত্তর।

উদাহরণ

1/70 = (0).(0)(142857)     => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571)      => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923)      => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)()         => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3)        => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
      => (1).(736842105263157894)(9) = (1).(736842105263157895)()  ## since 0.999... = 1
      = 1.736842105263157895 = 1736842105263157895/1000000000000000000
      = 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21)        => (1).(21)() = 1.21 = 121/100
2/1 = (2).()()             => (2).()() = 2 = 2/1
0/1 = (0).()()             => (0).()() = 0 = 0/1
0/2 = (0).()()             => (0).()() = 0 = 0/1
299/792 = (0).(377)(52)    => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142)  => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142)  => (6).(857142)(7) = 6.857142777... = 12342857/1800000

0পরীক্ষার কেস 2 ( 10/7) এর শেষে একটি অনুপস্থিত রয়েছে : 1428571/100000হওয়া উচিত 1428571/1000000
জংহওয়ান মিন

1
যেমন বলা আছে কোনও প্রদত্ত ইনপুটটির জন্য কোনও অনন্য উত্তর থাকবে না। 1/7হিসাবে প্রতিনিধিত্ব যেতে পারে (0).()(142857) বা (0).(1)(428571), 1প্রতিনিধিত্ব করা যেতে পারে যেমন (1).()(), (0).()(9), (0).()(99), (0).(9)(9), ইত্যাদি
ngenisis

@ এনজেনিসিস এটি উদাহরণগুলিতে অন্তর্ভুক্ত ছিল তবে আমি এটি স্পষ্ট করে দিয়েছি। প্রতিক্রিয়াটির জন্য ধন্যবাদ :)
শার্লক 9

@ আর.কেপ আমি ইতিমধ্যে চ্যালেঞ্জটিতে বলেছি যে এখানে ভাসমান ব্যবহারগুলি এড়ানো ভাল। কোনও ফ্লোটে রূপান্তর না করে কোনও সংখ্যার দশমিক সংখ্যা খুঁজে পাওয়ার উপায় রয়েছে। আমি আশা করি এটি আপনার প্রশ্নের জবাব দিয়েছে :)
শার্লক 9

পি এবং কি উভয়ই নেতিবাচক হতে পারে?
edc65

উত্তর:


5

পাইথন 2, 292 বাইট

def x(n,d):
 L=len;s=cmp(n*d,0);n*=s;b=p=`n/d`;a={};n%=d
 while not n in a:
  a[n]=p;q=n/d;n=n%d
  if q==0:n*=10;p+=' '
  p=p[:-1]+`q`
 p=p[L(a[n]):];a=a[n][L(b):]
 if n==0:p=''
 n=int(b+p+a);d=10**L(p+a)
 if a!='':n-=int(b+p);d-=10**L(p)
 import fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)

অবহেলিত সংস্করণ, অজগর 2 এবং 3 উভয় ক্ষেত্রেই কাজ করে। দশমিক প্রতিনিধিত্বও মুদ্রণ করে।

def x(n,d):
# sign handling
 s=n*d>0-n*d<0
 n*=s
# b, a, p: BEFORE decimal, AFTER decimal, PERIODIC part
 b=p=str(n//d)
 a={}
 n%=d
# long division
 while not n in a:
  a[n]=p
  q=n//d
  n=n%d
  if q==0:
   n*=10
   p+=' '
  p=p[:-1]+str(q)
# a/p still contain b/ba as prefixes, remove them
 p=p[len(a[n]):]
 a=a[n][len(b):]
 if n==0: p=''
# print decimal representation
 print("(" + b + ").(" + a + ")(" + p + ")")
# reassemble fraction (with a and p exchanged)
 n=int(b+p+a)
 d=10**len(p+a)
 if a!='':
  n-=int(b+p)
  d-=10**len(p)
# reduce output
 from fractions import gcd
 g=gcd(n,d)
 return(n//g*s,d//g)

চেষ্টা করুনd=10**len(p+a)
শার্লক

1
সহজ পরীক্ষার জন্য এখানে টিআইও লিঙ্ক রয়েছে: এটি অনলাইনে চেষ্টা করুন!
ক্রিটসি লিথোস

আপনার উত্তরে ভাল হয়েছে: ডি। কিছু আরও golfing টিপস: ব্যবহার আরো সেমিকোলন যেখানে সম্ভব, লাইনে স্থান পরিত্রাণ পেতে if n==0: p='', ব্যবহার ``আপনি ব্যবহার যে জায়গায় str, যেমন `n/d`পরিবর্তে str(n/d), এবং পুনঃনামকরণ lenকরার Lসঙ্গে L=len;ফাংশনের শুরুতে।
শার্লক

@ শার্লক ৯ আমি ব্যাকটিক্স সম্পর্কে জানতাম না। সব পরামর্শের জন্য ধন্যবাদ।
রেনার পি।

কোন সমস্যা নেই. এখানে আরও কিছু রয়েছে: ডি সেমিকোলনের জন্য দুটি স্থান: n=int(b+p+a);d=10**L(p+a)এবং import fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)। এছাড়াও, আপনার বর্তমান সম্পাদনার জন্য আমি 295 বাইট পেয়েছি আপনি কি ভুলে যাচ্ছেন এমন কোনও অতিরিক্ত নিউলাইন রয়েছে?
শার্লক

2

জেলি , 102 101 89 87 83 81 79 78 77 74 বাইট

এটি লিখতে দীর্ঘ সময় নিয়েছে, ডিবাগ করতে খুব দীর্ঘ সময় লেগেছে, এবং অবশ্যই অনেক গল্ফিং দরকার ( আট সাত ছয় পাঁচটি লিংক, পবিত্র গরু), তবে এটি আমার জ্ঞানের সেরা, সঠিক। ডেনিসকে এখানে সাহায্যের জন্য অনেক ধন্যবাদ, বিশেষত প্রথম দুটি লিঙ্কের সাথে। রেনার পি.কেও অনেক ধন্যবাদ, যেমন আমি পাইথন উত্তরে প্রচুর অ্যালগরিদম ধার করেছিলাম।

গল্ফিং সম্পাদনাগুলি: -1 বাইট জেন্ডারহলকে ধন্যবাদ। সঠিক লজিক্যাল নয় অন্তর্নির্মিত ব্যবহার না করা থেকে বাগ ফিক্স। সংখ্যার লিঙ্কগুলিকে গল্ফ করা থেকে -13 বাইট। dডেনিসকে ধন্যবাদ দিয়ে নেতিবাচক জন্য একটি বাগ ঠিক করা থেকে +1 বাইট । লিঙ্কগুলি পুনর্গঠন করুন যাতে অঙ্ক জেনারেশন সমস্ত একটি লিঙ্কে থাকে। দ্বিতীয় এবং তৃতীয় লিঙ্কগুলির সংমিশ্রণ থেকে -2 বাইট -4 তৃতীয় এবং চতুর্থ লিঙ্কের কিছু সাধারণ উপাদানগুলি দ্বিতীয় লিঙ্ক এবং প্রধান লিঙ্কে সরিয়ে নেওয়া থেকে বাইটস। কিছু অতিরিক্ত অতিরিক্ত চেইন অপারেটর অপসারণ থেকে -2 বাইট। সংখ্যার লিঙ্কটি পুনরায় সাজানো থেকে -২ বাইট -1 বাইটটি Ḣ€দ্বিতীয় লিঙ্কের শেষে চলে যাওয়া থেকে। মূল লিঙ্কে একটি বাগ ঠিক করা। -1 বাইট পরিবর্তন Ṫ ... ,Ḣথেকে Ḣ ... ṭ। মূল লিঙ্কে অঙ্কের লিঙ্কটি সরানো থেকে -3 বাইট

গল্ফিং পরামর্শ স্বাগত! এটি অনলাইন চেষ্টা করুন!

2ị×⁵d⁴
ÇÐḶ,ÇÐĿḟ@\µḢḅÐfıṭµḢḊṭµḢ€€µF,ḢQ
ÇL€⁵*
×Ṡ©⁸×%µ³,⁴A:/;Ѐ2ĿḌ×®,Ç_/€µ:g/

ব্যাখ্যা

প্রথমে, আমি মূল লিঙ্কটি ব্যাখ্যা করব , যা অন্য লিঙ্কগুলিকে কল করে।

×Ṡ©⁸×%µ³,⁴A:/;Ѐ2ĿḌ×®,Ç_/€µ:g/  Main link. Left argument: n (int), right argument: d (int)
                                Split into three chains.
×Ṡ©⁸×%  First chain
×       Multiply n by d.
 Ṡ©     Yield sign(n*d) and save it to the register.
   ⁸×   Multiply by n.
     %  Yield n*sgn(n*d) modulo d.

µ³,⁴A:/;Ѐ2ĿḌ×®,Ç_/€  Second chain
                        What follows is the formula for the numerator.
                        (+) means combining the digits of two numbers into one number.
                        ( `integer (+) periodic (+) non-periodic` - `integer (+) periodic` )
µ                     Start a new monadic chain with n*sgn(n*d)%d.
 ³,⁴                  Pair the original two arguments as a nilad.
    A                 Get their absolute values.
     :/               Integer divide to get the integer part of abs(n)/abs(d).
          2Ŀ          Yield the results of the second link.
       ;Ѐ            Append the integer part to each item in the right argument.
                        This appends to both lists from the second link.
            Ḍ         Convert each list from decimal to integer.
             ×®       Multiply by sign(n*d) retrieved from the register.
               ;Ç     Concatenate with the result of the third link (our new denominator).
                 _/€  Reduced subtract over each list.
                        Yields the proper numerator and denominator.

µ:g/  Third chain
µ     Start a new monadic chain with [numerator, denominator].
  g/  Yield gcd(numerator, denominator).
 :    Divide [numerator, denominator] by the gcd.
      Return this as our new fraction.

তারপরে, প্রথম লিঙ্কটি যে সংখ্যাগুলি পায়।

2ị×⁵d⁴  First link: Gets the decimal digits one at a time in the format:
          [digit, remainder to use in the next iteration]
2ị      Gets the second index (the remainder).
  ×⁵    Multiply by 10.
    d⁴  Divmod with d.

এখন, দ্বিতীয় লিঙ্কটি পর্যায়ক্রমিক এবং অ-পর্যায়ক্রমিক অংশগুলি n/dএবং অন্যান্য প্রচুর ভারী উত্তোলন পায়।

ÇÐḶ,ÇÐĿḟ@\µḢḅÐfıṭµḢḊṭµḢ€€µF,ḢQ  Second link: Loops the first link,
                                  separates the periodic digits and non-periodic digits,
                                  removes the extras to get only the decimal digits,
                                  and prepares for the third and fourth links.
                                Split into five chains.
ÇÐḶ,ÇÐĿḟ@\  First chain
ÇÐḶ         Loop and collect the intermediate results **in the loop**.
    ÇÐĿ     Loop and collect **all** of the intermediate results.
   ,        Pair into one list.
       ḟ@\  Filter the loop results out the list of all results,
              leaving only [[periodic part], [non-periodic part]].

µḢḅÐfıṭµḢḊṭ  Second and third chains
µ            Start a new monadic chain.
 Ḣ           Get the head [periodic part].
   Ðf        Filter out any [0, 0] lists from a non-periodic number,
  ḅ  ı        by converting to a complex number before filtering.
               Only removes 0+0j. This removes extra zeroes at the end.
      ṭ      Tack the result onto the left argument again.
       µ     Start a new monadic chain.
        Ḣ    Get the head [non-periodic and extra baggage].
         Ḋ   Dequeue the extra baggage.
          ṭ  Tack the result onto the left argument again.

µḢ€€µF,ḢQ  Fourth and fifth chains
µ          Start a new monadic chain with the processed periodic and non-periodic parts.
 Ḣ€€       Get the head of each list (the digits)
            in both the periodic and non-periodic parts.
    µ      Start a new monadic chain with these lists of digits.
     F     Left argument flattened.
       Ḣ   Head of the left argument.
      ,    Pair the flattened list and the head into one list.
        Q  Uniquify this list. (Only removes if non-periodic part is empty)
             Removes any duplicates resulting from a purely periodic n/d.

তৃতীয় লিংক , যা আমাদের নতুন হর উৎপাদ।

ÇL€⁵*  Third link: Generate the denominator.
         What follows is the formula for the denominator.
         ( 10**(num_digits) - ( 10**(num_periodic_digits) if len(non-periodic) else 0 ) )
Ç      Yield the results of the second link.
 L€    Get the length of each item in the list.
         The number of digits in total and the number of digits in the periodic part.
   ⁵*  10 to the power of each number of digits.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.