ফ্রেডম্যান নম্বর তৈরি করুন


9

একটি ফ্রেডম্যান নম্বর এমন একটি সংখ্যা যা সমস্ত অঙ্কগুলিতে বেসিক গাণিতিক ক্রিয়াকলাপগুলি (^, /, *, +, -) প্রয়োগ করে প্রকাশ করা যায়। অপারেশনগুলিকে প্রতিটি পৃথক অঙ্কের জন্য প্রয়োগ করা দরকার না, তবে সমস্ত অঙ্ক অবশ্যই জড়িত থাকতে হবে। অর্থাৎ, 121 = 11 ^ 2 -> সমস্ত অঙ্ক জড়িত, তবে 1 ও 1 একসাথে 11 তৈরি করা হয়েছে 11

প্রথম বন্ধনী ব্যবহারের অনুমতি দেওয়া হয়েছে, তবে তুচ্ছ সমাধান x= (x)বৈধ সমাধান নয়। বৈধ নয় x= +x,।

উদাহরণ

  • 25 = 5 ^ 2
  • 121 = 11 ^ 2
  • 343 = (3 + 4) ^ 3
  • 2048 = (8 ^ 4) / 2 + 0

এমন একটি প্রোগ্রাম লিখুন যা ইতিবাচক দুটি পূর্ণসংখ্যা নেবে এবং সেই পরিসরে ফ্রেডম্যান সংখ্যার সংখ্যা (অন্তর্ভুক্ত) এবং পরবর্তী লাইনে প্রকাশের সাথে সংখ্যা মুদ্রণ করবে।

ইনপুট -

n m    | n, m integers, n>=0, m>n

আউটপুট -

count    | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.

29 জুলাই 00:00 এএম রবিবার পোস্ট করা সংক্ষিপ্ত কোডটি GMT বিজয়ী হবে।


2
আপনি কিছু উদাহরণ ফ্রেডম্যান নম্বর যুক্ত করতে পারেন এবং কীভাবে /কাজ করে তা ব্যাখ্যা করতে পারেন ? উদাহরণস্বরূপ কি 1/3?
JPvdMerwe

সংখ্যাটি সমস্ত সংখ্যায় অপারেশন প্রয়োগ করে প্রকাশ করা হয়। যেমন 25 = 5 ^ 2, 126 = 6 * 21, 343 = (3 + 4) ^ 3 এবং আরও
এলসার

আপনি কি একাকার বিয়োগের অনুমতি দিচ্ছেন? যেমন -5?
JPvdMerwe

@JPvdMerwe ইনপুট স্পেসিফিকেশন পরীক্ষা করে দেখুন, আপনার এটি করার দরকার হবে না, তবে আপনি যদি চান, নিজেকে ছিটকে যান। যদিও unary প্লাস অনুমোদিত হয় না। অর্থাত্ +5 কোনও বৈধ সমাধান নয়
এলসার

1
বিভাগ সম্পর্কে JPvdMerwe এর প্রশ্নের উত্তর আপনি দেন নি। এটা ঠিক হতে হবে? মধ্যবর্তী ফলাফল অ-অবিচ্ছেদ্য হতে পারে?
পিটার টেলর

উত্তর:


3

রুবি, 456 438 408 390 370 349 344 334 [স্থির]

g={}
f=->a,b{a.permutation(b).to_a.uniq.flatten.each_slice b}
F,T=$*
([F.to_i,10].max..T.to_i).map{|c|f[a="#{c}".split(''),v=a.size].map{|m|f[[?+,?-,?*,?/,'','**'],v-1].map{|w|(d=(s=m.zip(w)*'').size)==v&&next
0.upto(d){|y|y.upto(d+1){|u|begin(r=eval t="#{s}".insert(y,?().insert(u,?)))==c&&g[r]=t
rescue Exception
end}}}}}
p g.size,g

আউটপুট:

% ruby ./friedman-numbers.rb 1 300
9
{25=>"(5)**2", 121=>"(11)**2", 125=>"5**(2+1)", 126=>"(6)*21", 127=>"(2)**7-1", 128=>"2**(8-1)", 153=>"(3)*51", 216=>"6**(1+2)", 289=>"(9+8)**2"}

এছাড়াও এটি বৃহত সংখ্যার জন্য তুলনামূলক দ্রুত কাজ করে:

% time ruby friedman-numbers.rb 3863 3864   
1
{3864=>"(6**4-8)*3"}
ruby friedman-numbers.rb 3863 3864  14.05s user 0.17s system 99% cpu 14.224 total

1
আমি ইনপুট দিয়ে এটি দৌড়ে 5 40এবং ফলাফল করেছেন: [11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]25সেখানে কোনও চিহ্ন নেই এবং আমি মনে করি সঠিক সমাধানটি (উদাহরণস্বরূপ 21) 2*1নয়,21**1
ক্রিশ্চিয়ান লুপাস্কু

@ w0lf আপনাকে ধন্যবাদ! আমি মনে করি এটি ঠিক করেছি
ডিফ্ল্ট করুন

হ্যাঁ, এটি এখন দুর্দান্ত কাজ করে।
ক্রিশ্চিয়ান লুপাস্কু

@ w0lf প্রয়োজন অনুসারে আউটপুট ফর্ম্যাট করতে প্রচুর অক্ষর যুক্ত করেছে
ডিফ্ল্ট করুন

আপনি প্রতিস্থাপন 2 অক্ষর অর্জন করতে '+-*/'.chars.to_a+['','**']সঙ্গে["+","-","*","/","","**"]
ক্রিস্টিয়ান Lupascu

4

পাইথন 2.7 - 380 378 372 371 367 363 357 354 352 348 336 চর

কেবল একটি সাধারণ উদ্দীপনা অনুসন্ধান।

from itertools import*
s=lambda x:[x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
 try:return eval(e.replace("^","**"))
 except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v]

উদাহরণ রান:

1
300
9
128 (2^(8-1))
289 ((9+8)^2)
216 (6^(1+2))
121 (11^2)
153 (3*51)
25 (5^2)
125 (5^(2+1))
126 (6*21)
127 ((2^7)-1)

ব্যাখ্যা:

s(x) হ'ল এমন একটি ফাংশন যা অঙ্কগুলির ক্রমযুক্ত স্ট্রিং নেয় এবং সেই সংখ্যাটি ব্যবহার করে সমস্ত ক্রমকে সেই ক্রমে প্রদান করে returns

[x]['1'>x>'0':] এক্স '0' হয় বা '0' দিয়ে শুরু না হওয়া অঙ্কগুলির অনুক্রমের একটি তালিকা বিশিষ্ট করে; অন্যথায়, এটি একটি খালি তালিকায় মূল্যায়ন করে। মূলত এটি সেই ক্ষেত্রে পরিচালনা করে যেখানে আমি সমস্ত সংখ্যার সাথে একসাথে যোগদান করি।

['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))] মূলত x দুটি অংশে পার্টিশন x (উভয়ই শূন্য-দৈর্ঘ্যের নয়), প্রতিটি অংশে s () কল করে এবং ফলাফল () ব্যবহার করে তাদের মধ্যে কিছু অপারেটরের সাথে সমস্ত ফলাফলের সাথে যোগ দেয়।

E(e) মূলত একটি নিরাপদ al এটি ই এর মানটি ই ই বৈধ এবং অন্যথায় অন্য কোনও নয়।

A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}

মূলত এই কোডটি পরিসরের সমস্ত সংখ্যা চেষ্টা করে, তাদের সংখ্যা নির্ধারণ করে এবং প্রতিটি অভিব্যক্তি পরীক্ষা করে যে সেই অনুমানের জন্য উত্পন্ন হয়, x '0' দিয়ে শুরু না হলে প্রথম এক্সপ্রেশন উপেক্ষা করে, কারণ যদি x দিয়ে শুরু না হয় 0 'এর পরে প্রথম এক্সপ্রেশনটি কেবল x হবে।

বিকল্প সংস্করণ - 397 অক্ষর

আপনি যদি ভগ্নাংশ ব্যবহার করতে চান তবে আমার কোডটি এখানে:

from fractions import*
from itertools import*
s=lambda x:["Fraction(%s)"%x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
 try:return eval(e.replace("^","**"))
 except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v].replace("Fraction","")

আমি মনে করি না যে if len(x)<2ফাংশনে কখনও সত্য হবে s। এছাড়াও, আপনি 4 টি অক্ষর সংরক্ষণ করতে আপনার formatসাথে প্রতিস্থাপন করতে পারেন "a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
beary605

@ beary605: এটি কখনও কখনও সত্য হয়, যখন i = লেন (এক্স) -1 হয়, তারপরে পরবর্তী কলটি একটি একক চর পাবেন। দ্বিতীয় পয়েন্ট হিসাবে, ধন্যবাদ! :)
JPvdMerwe

হু ... except:0স্মার্ট .. খুব স্মার্ট। আমি মনে রাখব
ইভ_জেনাস

দয়া করে কিছু চিত্রণমূলক আউটপুট অন্তর্ভুক্ত করুন।
ডেভিডসি

1
নাহ, এখনও চলছে। আমাকে এখনই আমার পিসি সরিয়ে ফেলতে হবে, তবে আমি এটি কয়েক দিনের জন্য চালিয়ে দেব এবং দেখি এটি শেষ হয় কিনা।
JPvdMerwe

3

পাইথন 3 (436) (434) (443)

এটা কঠিন ছিল. আমি যদি আউটপুটটিকে আরও স্থানীয় করে তুলি তবে আমি কিছু অক্ষর বাঁচাতে পারি।

from itertools import*
r={};k=product;m=map
q=lambda n,h=1:["("+i+c+j+")"for(i,j),c in k(chain(*[k(*m(q,f))for f in sum(([(x[:q],x[q:])for q in range(1,len(x))]for x in m("".join,permutations(n))),[])]),list("+-*/^")+[""]*h)]if 1<len(n)else[n]*h
a,b=m(int,m(input,"nm"))
for i,j in chain(*[k(q(str(n),0),[n])for n in range(a,b+1)]):
    try:exec("if eval(%r)==j:r[j]=i"%i.replace("^","**"))
    except:0
print(len(r))
for j,i in r.items():print(i,j)

আউটপুট

n100
m200
6
(2^(8-1)) 128
(3*(51)) 153
((11)^2) 121
(5^(1+2)) 125
(6*(21)) 126
((2^7)-1) 127

1
সুতরাং আপনার অনেক চালাক কৌশল রয়েছে; তবে, আমার উল্লেখ করা উচিত যে আপনি 1 থেকে 9 সঠিকভাবে পরিচালনা করছেন না এবং আপনার ইনপুটটি অন্তর্ভুক্ত নয়। আপনি পরে জায়গা সরিয়ে যদিও 2 অক্ষর অপসারণ করতে পারেন "("+i+c+j+")"এবং প্রতিস্থাপন len(n)>1দ্বারা 1<len(n)এরপরে আপনি যে এক্সপ্রেশনের পরে স্থান অপসারণ করতে পারেন।
JPvdMerwe

ফেয়ার। সমস্ত স্থির করে, +7 টি অক্ষর
ইভ_জেনাস

আপনি for j in r:print(r[j],j)7 টি অক্ষর সংরক্ষণ করে শেষ লাইনটি প্রতিস্থাপন করতে পারেন ।
JPvdMerwe

1

গণিত 456 416 402 404 400 396 অক্ষর

<< Combinatorica`; l = Length; p = Permutations; f = Flatten; c = Cases;
u[d_, o_, s_] := 
 Fold[#2[[1]] @@ If[s == 1, {#1, #2[[-1]]}, {#2[[-1]], #1}] &, 
 d[[1]], Thread@{o, Rest@d}];
q[t_, r_] := {u[t, #, r], u[HoldForm /@ t, #, r]} & /@ 
p[{Plus, Subtract, Times, Divide, Power}, {l@t - 1}];
v[m_, n_] := (t = Table[Union@
  c[f[{#~q~1, #~q~0} & /@ 
     f[p /@ c[
        FromDigits /@ # & /@ 
         f[SetPartitions /@ p@IntegerDigits@j, 1], x_ /; l@x > 1],
       1], 2], {j, _}], {j, m, n}]~f~1; {l@t}~Join~t)

উদাহরণ :

v[1,300]//TableForm

আউটপুট :

ফ্রাইডম্যান আউটপুট

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