কীভাবে ভগ্নাংশ হ্রাস করবেন না


13

ভগ্নাংশগুলি ভুল উপায়ে হ্রাস করা হচ্ছে

এই কোড-গল্ফ চ্যালেঞ্জে আপনাকে ভগ্নাংশ খুঁজে পেতে হবে যা ভুল উপায়ে হ্রাস করা যেতে পারে তবে একই সংখ্যায় শেষ হতে পারে।

দ্রষ্টব্য: ভগ্নাংশগুলি ভুল পথে হ্রাস করার এখানে সঠিক সংজ্ঞা রয়েছে, বিশদটি দেখুন।

উদাহরণ:

64/16 = 6 4/1 6 = 4/1 = 4

অবশ্যই আপনি কেবল উভয় 6es স্ট্রাইক করতে পারবেন না তবে এখানে আপনি এখনও সঠিক মানটি দিয়ে শেষ করতে পারেন। এই চ্যালেঞ্জে আপনাকে এর মতো উদাহরণগুলি খুঁজতে হবে।

বিস্তারিত

আপনাকে একটি ফাংশন / প্রোগ্রাম লিখতে হবে যা একটি ইতিবাচক পূর্ণসংখ্যাকে nইনপুট হিসাবে গ্রহণ করে এবং বিন্যাসে ভগ্নাংশের তালিকা / অ্যারে আউটপুট / ফিরিয়ে দেয়
numerator1,denominator1,numerator2,denominator2,...

প্রোগ্রামটি প্রতিটি ভগ্নাংশের a/bসাথে খুঁজে বের করতে হবে a+b=nএবং a,b>0এটি ভুল উপায়ে হ্রাস করা যায় কিনা । (এটি প্রচলিত উপায়ে হ্রাস করা যায় বা হ্রাসের অনেকগুলি সম্ভাবনা রয়েছে কিনা তা বিবেচ্য নয়, কমপক্ষে একটি উপায়ে এটি ভুল উপায়ে কমিয়ে আনা সম্ভব হয়েছে ।)

সংজ্ঞা কুপথ: একটি ভগ্নাংশ কমে যাবে কুপথ যদি এবং কেবল যদি a ও b মধ্যে ধারাবাহিক সংখ্যার প্রদর্শিত হয় একই ক্রম এবং আপনি সাবস্ট্রিং অপসারণ যদি ভগ্নাংশ থাকার বিষয়টি মতেই মান একই।

উদাহরণ: 1536/353 16/3 এ 'হ্রাস' করা যেতে পারে তবে এই দুটি মান সমান নয় তাই আপনি এই ভগ্নাংশটি ভুল উপায়ে হ্রাস করতে পারবেন না ।

নোট করুন যে ভুল উপায়ে হ্রাস করার এই সংজ্ঞাটিতে ভগ্নাংশগুলিও অন্তর্ভুক্ত থাকতে পারে যা সঠিক উপায়ে হ্রাস করা হয়েছে: এটি বৈধ পদক্ষেপ হলেও ভুল উপায়ে110/10 = 11/1 হ্রাস করার সংজ্ঞা অনুসারে ।

স্কোরিং

সর্বনিম্ন বাইট জিতেছে। আপনি কোনও ফাংশন বা প্রোগ্রাম লিখতে পারেন যা কোনও পূর্ণসংখ্যাকে গ্রহণ করে এবং একটি অ্যারে বা স্ট্রিনড / স্ট্ডআউট ব্যবহার করে এমন একটি প্রোগ্রাম দেয় বা আপনি এনটিকে একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন এবং প্রোগ্রামের শেষে তালিকাটি অবশ্যই অন্য ভেরিয়েবলে সংরক্ষণ করতে হবে।

পরীক্ষার মামলা

দয়া করে নিম্নলিখিত টেস্টকেসগুলি অন্তর্ভুক্ত করুন (আমাকে কোনটি যুক্ত করা উচিত তা বলুন, আমি জানি না idea যে কতগুলি ভগ্নাংশ আছে / কতগুলি উদাহরণ আশা করতে হবে)

n=80 (64/16 should be in this list)
n=147 (98/49 should be in this list)
n=500 (294/196 should be in this list) WRONG since 294+196 != 500 Thanks Falko

3
"ভুল উপায়ে", যেমন "বোকা" বা "অদ্ভুত" এর জন্য একটি শব্দ সংজ্ঞা দেওয়ার কথা বিবেচনা করুন। আমি মনে করি পোস্টটি বুঝতে সহজ হবে, কারণ পাঠকরা তাত্ক্ষণিকভাবে শিহরিত করে যে এই শব্দটির একটি সংজ্ঞা থাকতে হবে।
মাইকেল ইস্টার

3
যদি ভগ্নাংশ হ্রাস করার একাধিক উপায় থাকে এবং কেবলমাত্র সেগুলির মধ্যে কিছু ভুল হয়? 1010/10 = 101/1 && 1010/10 /= 110/1
জন ডিভোরাক

1
এর ভেরিয়েন্ট projecteuler.net/problem=33 ?
ব্যবহারকারী 80551

1
তোমার দ্বিতীয় টেস্ট কেস ( n=147) ভুল হল: 49/89 != 4/8
বিটা ক্ষয়

1
যদি ভগ্নাংশ হ্রাস করার একাধিক উপায় থাকে তবে আমরা কী ফলাফল ফলাফলটিতে একাধিকবার অন্তর্ভুক্ত করতে পারি?
জন ডিভোরাক

উত্তর:


3

পাইথন 2 - 183 180

r=range
s=lambda a:[(a[i:j],int(a[:i]+a[j:]))for i in r(len(a))for j in r(i+1,len(a)+(i>0))]
l=sum([[a,n-a]for a in r(n)for p,x in s(`a`)for q,y in s(`n-a`)if(n-a)*x==a*y<p==q],[])

ইনপুট অবশ্যই সংরক্ষণ করতে হবে n, আউটপুট সংরক্ষণ করা হবে l

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

n = 80:

[10, 70, 16, 64, 20, 60, 30, 50, 40, 40, 40, 40, 50, 30, 60, 20, 64, 16, 70, 10]

n = 147:

[49, 98, 98, 49]

n = 490:

[10, 480, 20, 470, 30, 460, 40, 450, 50, 440, 60, 430, 70, 420, 80, 410, 90, 400, 90, 400, 98, 392, 100, 390, 100, 390, 110, 380, 120, 370, 130, 360, 140, 350, 150, 340, 160, 330, 170, 320, 180, 310, 190, 300, 190, 300, 196, 294, 200, 290, 200, 290, 210, 280, 220, 270, 230, 260, 240, 250, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 250, 240, 260, 230, 270, 220, 280, 210, 290, 200, 290, 200, 294, 196, 300, 190, 300, 190, 310, 180, 320, 170, 330, 160, 340, 150, 350, 140, 360, 130, 370, 120, 380, 110, 390, 100, 390, 100, 392, 98, 400, 90, 400, 90, 410, 80, 420, 70, 430, 60, 440, 50, 450, 40, 460, 30, 470, 20, 480, 10]

আউটপুটে ডুপ্লিকেটগুলি নিষিদ্ধ করা উচিত, এটি 10 ​​টি অক্ষর দীর্ঘ দেয়:

r=range
s=lambda a:[(a[i:j],int(a[:i]+a[j:]))for i in r(len(a))for j in r(i+1,len(a)+(i>0))]
l=sum(map(list,{(a,n-a)for a in r(n)for p,x in s(`a`)for q,y in s(`n-a`)if(n-a)*x==a*y<p==q}),[])

3

Haskell,, 207 206 (209?) অক্ষর

import Data.List
x![]=[x];(w:x)!(y:z)|w==y=x!z;_!_=[]
a@(w:x)%b=a!b++[w:e|e<-x%b];a%b=a!b
h=show
f n=[(c,n-c)|c<-[1..n-1],i<-inits$h c,s<-init$tails i,s/=h c,a<-h c%s,b<-h(n-c)%s,read a*(n-c)==read('0':b)*c]

যদি একই অনুপাতটিকে একাধিকবার (400/400 = 40/40 = 4/4) ফেরত দেওয়া অনুমোদিত না হয় তবে f n=nub[...তাদের ফিল্টার আউট ব্যবহার করুন।

জোড়াগুলির একটি তালিকা ফেরত দেয়। দ্বি-এলিমেন্ট জোড়ার তালিকার দাম একই। প্রকৃত ভগ্নাংশের একটি তালিকার জন্য আমদানি Data.Ratioবা সম্পূর্ণ যোগ্যতার প্রয়োজন হবে Data.Ratio.%(এটি %এখানে সংজ্ঞায়িত ফাংশনটির সাথেও সংঘর্ষ হয় )

পরীক্ষার কেস (সহ nub):

Prelude Data.List> f 80
[(10,70),(16,64),(20,60),(30,50),(40,40),(50,30),(60,20),(64,16),(70,10)]
Prelude Data.List> f 147
[(49,98),(98,49)]
Prelude Data.List> f 500
[(10,490),(20,480),(30,470),(40,460),(50,450),(60,440),(70,430),(80,420),(90,410
),(100,400),(110,390),(120,380),(130,370),(140,360),(150,350),(160,340),(170,330
),(180,320),(190,310),(200,300),(210,290),(220,280),(230,270),(240,260),(250,250
),(260,240),(270,230),(280,220),(290,210),(300,200),(310,190),(320,180),(330,170
),(340,160),(350,150),(360,140),(370,130),(380,120),(390,110),(400,100),(410,90)
,(420,80),(430,70),(440,60),(450,50),(460,40),(470,30),(480,20),(490,10)]

নিরবচ্ছিন্ন এবং মন্তব্য করেছে :

import Data.List

-- haystack ! needle - the haystack with the needle removed, wrapped in a single-element list
--                       or an empty array if the haystack does not start with the needle

x ! [] = [x]                        -- case: empty needle = match with the full haystack left
(h:hs) ! (n:ns) | h == n = hs ! ns  -- case: needle and haystack match
_ ! _ = []                          -- case: no match

-- haystack % needle - the haystack with the needle removed 
--                       for all positions of the needle in the haystack

a@(h:hs) % b = a ! b ++ map (h:) (hs%b) -- either remove the needle here, or elsewhere
a % b = a                               -- empty haystack cannot be popped

-- f - the function we are interested in

f total = [ (num, total - num) 
          | num   <- [1 .. total-1],            -- for each numerator in range
            i     <- inits $ show num,          -- for each postfix of the numerator
            sub   <- init $ tails i,            -- for each prefix of the postfix except the last (empty) one
            sub /= show num,                    -- that isn't equal to the numerator
            reNum <- show num % sub,            -- remove the substring from the numerator
            reDiv <- show (total - num) % sub,  -- as well as from the denominator.

                                                -- the resulting ratios must be equal by value:
            (read reNum) ^ (total - num) == (read '0':reDiv) * num]

তুমি কি বদলাতে পারবে ';' নতুন লাইনে (গল্ফ কোডে)? এটি বাইট গণনা পরিবর্তন করে না এবং এটি কোডটি আরও পঠনযোগ্য করে তোলে
গর্বিত হাসেলেলার

পছন্দ করুন গল্ফড কোডটিতে আমি কম লাইন রাখতে চাই। এছাড়াও, লাইন দৈর্ঘ্য এইভাবে আরও সুষম হয়। তুমি কি ভাবি আমার বদলা উচিত?
জন ডিভোরাক

আপনি যা চান তা করুন, তবে আমি চাই যে লাইনগুলি ছড়িয়ে দেওয়া হোক যাতে আমি কোডটি আরও ভালভাবে পড়তে সক্ষম হব (বরং তারপরে অবহেলিত কোডটি অবলম্বন করব)
গর্বিত হাসেলেলার

আপনি কি বর্তমান সংস্করণ দিয়ে ভাল আছেন? আমি শেষ পংক্তিটি ভাগ করতে পারি না, দুর্ভাগ্যক্রমে (ফাঁকা জায়গাগুলি ব্যতীত, যা পাঠযোগ্যতা মেরে ফেলবে)
জন ডিভোরাক

যেমনটি আমি বলেছি, আপনি যা মনে করেন তা করুন
গর্বিত হাসেলেলার

1

পাইথন 2 - 236

n=input()
r=range
f=float
l=len
for a in r(n):
 A=`a`;B=`n-a`
 for i in r(l(A)):
  for j in r(i+1,l(A)+1):
   for u in r(l(B)):
    C=A[:i]+A[j:];D=B[:u]+B[u+j-i:]
    if A[i:j]==B[u:u+j-i]and l(C)*l(D)and f(C)==f(A)/f(B)*f(D):print A,B

1

পাইথন 3 - 302

দ্রষ্টব্য: পার্সিংয়ের অসুবিধার কারণে 0 নম্বরে কোনও ভগ্নাংশ নেই (সুতরাং কোনও সঠিক ভঙ্গিটি সঠিক পদ্ধতি ব্যবহার করে গণনা করা হয় না)।

n=int(input());s=str;r=range
print([[a,b]for a in r(1,n)for b in r(1,a)for i in r(1,n)if i!=a and i!=b and s(i)in s(a)and s(i)in s(b)and s(a).count(s(i))<len(s(a))and s(b).count(s(i))<len(s(b))and not'0'in s(a)and not'0'in s(b)and eval(s(a).replace(s(i),'')+'/'+s(b).replace(s(i),''))==a/b and a+b<=n])

এন = 80 সহ:

[[64, 16]]

এন = 147 সহ

[[64, 16], [65, 26], [95, 19], [98, 49]]

এন = 500 সহ

[[64, 16], [65, 26], [95, 19], [98, 49], [136, 34], [192, 96], [194, 97], [195, 39], [196, 49], [196, 98], [231, 132], [238, 34], [238, 136], [242, 143], [253, 154], [264, 165], [268, 67], [275, 176], [286, 187], [291, 97], [291, 194], [294, 49], [294, 98], [294, 196], [295, 59], [297, 198], [298, 149], [325, 13], [341, 143], [345, 138], [392, 49], [392, 98], [395, 79]]

জন্য n=80এই কপি করে প্রিন্ট [[64, 16], [65, 26]], কিন্তু স্পষ্টত 65 + 26 = 91 > 80
ইনগো বার্ক

ঘুরুন সব ifএকটি একক বড় মধ্যে গুলি ifদিয়ে andসব অবস্থার সংযোগ গুলি? আমি বেশ কয়েকটা অক্ষর সাশ্রয় করি।
সোহম চৌধুরী

@ সোহম হ্যাঁ, ধন্যবাদ, ধন্যবাদ!
বিটা ক্ষয়

আমি যুক্ত করা টেস্টকেসগুলিও কি অন্তর্ভুক্ত করতে পারি? (এবং আপনি কি দেখতে পেয়েছেন যে আমারও কিছু আকর্ষণীয় পরীক্ষার মামলা যুক্ত হওয়া উচিত?)
flawr

2
কোথায় 10/70, 20/60এবং 30/50?
জন ডিভোরাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.