একটি ফিবোনাচি যোগফল হিসাবে একটি সংখ্যা লিখুন


9

আসুন আমরা ফিবোনাচি ক্রমটি সংজ্ঞায়িত করি

F(1) = 1

F(2) = 2

F(n) = F(n - 2) + F(n - 1)

সুতরাং আমাদের কাছে অসীম ক্রম রয়েছে 1,2,3,5,8,13,... এটি সুপরিচিত যে কোনও ধনাত্মক পূর্ণসংখ্যা কিছু ফিবোনাকির সংখ্যার যোগ হিসাবে লেখা যায়। একমাত্র সতর্কতা হল এই সংমিশ্রণটি অনন্য হতে পারে না। ফিবোনাচি সংখ্যাগুলির যোগফল হিসাবে একটি সংখ্যা লেখার সর্বদা কমপক্ষে একটি উপায় রয়েছে তবে আরও অনেক বেশি থাকতে পারে।

আপনার চ্যালেঞ্জটি হ'ল একটি সম্পূর্ণ প্রোগ্রাম লিখুন যা স্টিডিন ব্যবহার করে এক থেকে দশ মিলিয়নের মধ্যে একটি ধনাত্মক পূর্ণসংখ্যার মধ্যে নিয়ে যায় এবং তারপরে ইনপুট পর্যন্ত যোগ হওয়া ফিবোনাচি সংখ্যার সম্ভাব্য সংক্ষিপ্তসারগুলি স্টার্টআউট ব্যবহার করে আউটপুট দেয়। সংক্ষেপে, ফিবোনাচি নম্বরগুলি অবশ্যই পুনরাবৃত্তি করতে হবে না এবং এর মধ্যে নম্বরটি অন্তর্ভুক্ত রয়েছে 1। যে কোনও সংক্ষেপে, 1উপস্থিত থাকলে তা অবশ্যই একবার উপস্থিত থাকতে হবে কারণ উপরের ক্রমের আমার সংজ্ঞায় 1কেবল একবার উপস্থিত হবে। কেবলমাত্র পদটির সাথে সংক্ষেপগুলি বৈধ হয় তাই যদি ইনপুট নম্বরটি নিজেই একটি ফিবোনাচি নম্বর হয় তবে সংখ্যাটি নিজেই একটি বৈধ যোগফল এবং মুদ্রিত হওয়া আবশ্যক। যদি একাধিক অঙ্ক হয়, তবে যে কোনও দুটি যোগফলের মধ্যে সহজেই তাদের মধ্যে পার্থক্য করার জন্য একটি ফাঁকা রেখা থাকতে হবে।

এখানে কিছু নমুনা দেওয়া হল।

./myfib 1
1

এই জাতীয় একটি মাত্র আছে এবং এটির কেবলমাত্র পদ রয়েছে তাই এটি মুদ্রিত।

./myfib 2
2

এখানে নোট করুন এটি 1+1বৈধ যোগফল নয় কারণ 1পুনরাবৃত্তি করে।

./myfib 3
1+2

3

দুটি যোগফল এবং সেগুলি উভয়ই ফাঁকা রেখা দিয়ে মাঝখানে মুদ্রিত হয়।

./myfib 10
2+8

2+3+5

./myfib 100
3+8+89

1+2+8+89

3+8+34+55

1+2+3+5+89

1+2+8+34+55

3+8+13+21+55

1+2+3+5+34+55

1+2+8+13+21+55

1+2+3+5+13+21+55

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

শুভ কোডিং!


1
... আমি কেবল এটিকে নিষ্ঠুর করতে যাচ্ছি: পি যদি আমি উত্তর পোস্ট করি তবে এটি ভাল সম্পাদনের আশা করবেন না :)
ডুরকনব

ভাল এটি কোড-গল্ফটি দ্রুততম কোড নয়। :-D
ফিক্সড পয়েন্ট

1
আমি এটি লিখেছি, এবং এটি আসলে দ্রুত চলে: পি
ডুরকনব

নেই বেশ সদৃশ কিন্তু ঘনিষ্ঠভাবে এর সাথে সম্পর্কিত codegolf.stackexchange.com/q/2677/194
পিটার টেলর

1
@ শিওনা যেহেতু আমি নির্দিষ্ট করে নিই না, আপনার পছন্দসইটি বেছে নিন। :-)
ফিক্সড পয়েন্ট

উত্তর:



4

রুবি, 118 114 (অ্যারের আউটপুট) বা 138 134 (সঠিক আউটপুট)

i=gets.to_i
a=[x=y=1]
a+=[y=x+x=y]until y>i
p (1..a.size).flat_map{|n|a.combination(n).select{|o|o.inject(:+)==i}}

নমুনা রান:

c:\a\ruby>fibadd
100
[[3, 8, 89], [1, 2, 8, 89], [3, 8, 34, 55], [1, 2, 3, 5, 89], [1, 2, 8, 34, 55], [3, 8, 13, 21, 55], [1, 2, 3, 5, 34, 55], [1, 2, 8, 13, 21, 55], [1, 2, 3, 5, 13, 21, 55]]

পরিবর্তন getsকরার জন্য $*[0]যদি আপনি কমান্ড লাইন আর্গুমেন্ট (চান >fibadd 100), +1 টি চরিত্র যদিও।

সঠিক আউটপুট সহ:

i=gets.to_i
a=[x=y=1]
a+=[y=x+x=y]until y>i
$><<(1..a.size).flat_map{|n|a.combination(n).select{|o|o.inject(:+)==i}}.map{|o|o*?+}*'

'

নমুনা রান:

c:\a\ruby>fibadd
100
3+8+89

1+2+8+89

3+8+34+55

1+2+3+5+89

1+2+8+34+55

3+8+13+21+55

1+2+3+5+34+55

1+2+8+13+21+55

1+2+3+5+13+21+55
c:\a\ruby>fibadd
1000
13+987

5+8+987

13+377+610

2+3+8+987

5+8+377+610

13+144+233+610

2+3+8+377+610

5+8+144+233+610

13+55+89+233+610

2+3+8+144+233+610

5+8+55+89+233+610

13+21+34+89+233+610

2+3+8+55+89+233+610

5+8+21+34+89+233+610

2+3+8+21+34+89+233+610
c:\a\ruby>obfcaps
12804
2+5+21+233+1597+10946

2+5+8+13+233+1597+10946

2+5+21+89+144+1597+10946

2+5+21+233+610+987+10946

2+5+21+233+1597+4181+6765

2+5+8+13+89+144+1597+10946

2+5+8+13+233+610+987+10946

2+5+8+13+233+1597+4181+6765

2+5+21+34+55+144+1597+10946

2+5+21+89+144+610+987+10946

2+5+21+89+144+1597+4181+6765

2+5+21+233+610+987+4181+6765

2+5+8+13+34+55+144+1597+10946

2+5+8+13+89+144+610+987+10946

2+5+8+13+89+144+1597+4181+6765

2+5+8+13+233+610+987+4181+6765

2+5+21+34+55+144+610+987+10946

2+5+21+34+55+144+1597+4181+6765

2+5+21+89+144+233+377+987+10946

2+5+21+89+144+610+987+4181+6765

2+5+21+233+610+987+1597+2584+6765

2+5+8+13+34+55+144+610+987+10946

2+5+8+13+34+55+144+1597+4181+6765

2+5+8+13+89+144+233+377+987+10946

2+5+8+13+89+144+610+987+4181+6765

2+5+8+13+233+610+987+1597+2584+6765

2+5+21+34+55+144+233+377+987+10946

2+5+21+34+55+144+610+987+4181+6765

2+5+21+89+144+233+377+987+4181+6765

2+5+21+89+144+610+987+1597+2584+6765

2+5+8+13+34+55+144+233+377+987+10946

2+5+8+13+34+55+144+610+987+4181+6765

2+5+8+13+89+144+233+377+987+4181+6765

2+5+8+13+89+144+610+987+1597+2584+6765

2+5+21+34+55+144+233+377+987+4181+6765

2+5+21+34+55+144+610+987+1597+2584+6765

2+5+21+89+144+233+377+987+1597+2584+6765

2+5+8+13+34+55+144+233+377+987+4181+6765

2+5+8+13+34+55+144+610+987+1597+2584+6765

2+5+8+13+89+144+233+377+987+1597+2584+6765

2+5+21+34+55+144+233+377+987+1597+2584+6765

2+5+8+13+34+55+144+233+377+987+1597+2584+6765

এটি সর্বশেষে (12804) প্রায় 3 সেকেন্ড সময় নিয়েছিল!


4

গণিত, 89 85 অক্ষর

85 টি অক্ষরে সংক্ষিপ্ত হয়ে ডেভিড ক্যারাহারকে ধন্যবাদ জানায়।

i=Input[];#~Row~"+"&/@Select[If[#>i,Subsets@{##},#0[#+#2,##]]&[2,1],Tr@#==i&]//Column

গণিতের একটি অন্তর্নির্মিত ফাংশন রয়েছে Fibonacciতবে আমি এটি ব্যবহার করতে চাই না।


খুব কমপ্যাক্ট। খুশী হলাম।
ডাঃ বেলিসারিয়াস

1
76 টি চর যদি আপনি অঙ্কের তালিকা হিসাবে মুদ্রণ করতে আপত্তি করেন না:i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &]
ডেভিডসি

1
84 অক্ষর:i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &] // Column
ডেভিডসি

2

পাইথন 206 181 টি অক্ষর

import itertools as a
i,j,v,y=1,2,[],input()
while i<1000000:v,i,j=v+[i],j,i+j
for t in range(len(v)+1):
 for s in a.combinations(v,t):
  if sum(s)==y:print "+".join(map(str,s))+"\n"

নমুনা রান:

25
1+3+21

1+3+8+13

1000
13+987

5+8+987

13+377+610

2+3+8+987

5+8+377+610

13+144+233+610

2+3+8+377+610

5+8+144+233+610

13+55+89+233+610

2+3+8+144+233+610

5+8+55+89+233+610

13+21+34+89+233+610

2+3+8+55+89+233+610

5+8+21+34+89+233+610

2+3+8+21+34+89+233+610

এই সমস্ত অতিরিক্ত স্পেস থেকে মুক্তি পান ind আপনি ইনডেন্ট কোডের জন্য একটি ট্যাব বা স্পেস অক্ষর ব্যবহার করতে পারেন। সংক্ষিপ্ত হলে সিঙ্গল লাইনে লুপ কোডগুলি লেখার অর্থাত্while i<1000000:v+=[i];i,j=j,i+j
ওয়াসি

কিছু পরামর্শ (আমি কেবল আপনার উত্তরটি চুরি করতে চাইনি এবং আমার সংক্ষিপ্ত সংস্করণটি পোস্ট করতে চাই না) import itertools as z:, কলোনগুলির পরে নতুন লাইনগুলি সরিয়ে ফেলুন, লাইনটি y=input()দিয়ে দিন x,y,vএবং চূড়ান্ত ifবিবৃতি দেওয়ার পরে অতিরিক্ত স্থান সরিয়ে ফেলুন ।
সাইমনটি

আমি কোডগুলিতে আপনার পরামর্শগুলি অন্তর্ভুক্ত করেছি। ধন্যবাদ :)
ব্যাটম্যান

2

স্কালা, 171

def f(h:Int,n:Int):Stream[Int]=h#::f(n,h+n)
val x=readInt;(1 to x).flatMap(y=>f(1,2).takeWhile(_<=x).combinations(y).filter(_.sum==x)).foreach(z=>println(z.mkString("+")))

2

সি #, 376 বাইট

class A{IEnumerable<int>B(int a,int b){yield return a+b;foreach(var c in B(b,a+b))yield return c;}void C(int n){foreach(var j in B(0,1).Take(n).Aggregate(new[]{Enumerable.Empty<int>()}.AsEnumerable(),(a,b)=>a.Concat(a.Select(x=>x.Concat(new[]b})))).Where(s=>s.Sum()==n))Console.WriteLine(string.Join("+",j));}static void Main(){new A().C(int.Parse(Console.ReadLine()));}}

Ungolfed:

class A
{
    IEnumerable<int>B(int a,int b){yield return a+b;foreach(var c in B(b,a+b))yield return c;}
    void C(int n){foreach(var j in B(0,1).Take(n).Aggregate(new[]{Enumerable.Empty<int>()}.AsEnumerable(),(a,b)=>a.Concat(a.Select(x=>x.Concat(new[]{b})))).Where(s=>s.Sum()==n))Console.WriteLine(string.Join("+",j));}
    static void Main(){new A().C(int.Parse(Console.ReadLine()));}
}

পদ্ধতিটি এমন Bফিরিয়ে দেয় IEnumerableযা পুরো (অসীম) ফিবোনাচি সেটকে উপস্থাপন করে। একটি সংখ্যা দেওয়া দ্বিতীয় পদ্ধতিটি nপ্রথম nফিবোনাচি সংখ্যাগুলি (এখানে বিশাল ওভারকিল) দেখায় , সমস্ত সম্ভাব্য সাবসেটগুলি (পাওয়ার সেট) সন্ধান করে এবং তারপরে যথাক্রমে সাবটাইটগুলিতে ফিল্টার করে nএবং তারপরে মুদ্রণ করে।


1

এপিএল (75)

I←⎕⋄{⎕←⎕TC[2],1↓,'+',⍪⍵}¨S/⍨I=+/¨S←/∘F¨↓⍉(N⍴2)⊤⍳2*N←⍴F←{⍵,+/¯2↑⍵}⍣{I<⊃⌽⍺}⍳2

আমার চেয়ে কম প্রতিযোগিতামূলক, বেশিরভাগ আউটপুট বিন্যাসের কারণে।

আউটপুট:

⎕:
      100

 3 + 8 + 89 

 3 + 8 + 34 + 55 

 3 + 8 + 13 + 21 + 55 

 1 + 2 + 8 + 89 

 1 + 2 + 8 + 34 + 55 

 1 + 2 + 8 + 13 + 21 + 55 

 1 + 2 + 3 + 5 + 89 

 1 + 2 + 3 + 5 + 34 + 55 

 1 + 2 + 3 + 5 + 13 + 21 + 55 

ব্যাখ্যা:

  • I←⎕: ইনপুট পড়ুন, স্টোর ইন করুন I
  • ⍳2: তালিকা দিয়ে শুরু 1 2,
  • {⍵,+/¯2↑⍵}: তালিকায় সর্বশেষ দুটি উপাদানের যোগ যোগ করুন,
  • ⍣{I<⊃⌽⍺}: যতক্ষণ Iনা তালিকার শেষ উপাদানটির চেয়ে ছোট।
  • F←: এ দোকান F(এই থেকে Fibonacci সংখ্যা 1থেকে I)।
  • N←⍴F: ফিবোনাচি সংখ্যাগুলির পরিমাণ সংরক্ষণ করুন N
  • ↓⍉(N⍴2)⊤⍳2*Nথেকে নম্বর পেতে 1করতে 2^N, বিট হিসাবে।
  • S←/∘F¨: বিটমাস্ক হিসাবে এই প্রতিটি ব্যবহার করুন F, সঞ্চয় করুন S
  • I=+/¨S: প্রতিটি উপ-তালিকার জন্য S, এটির যোগফল সমান কিনা তা দেখুন I
  • S/⍨: এগুলি থেকে নির্বাচন করুন S। (এখন আমাদের কাছে ফিজোনাচি সংখ্যাগুলির সমস্ত তালিকা রয়েছে যা যোগফল I))
  • {... : এই প্রতিটি জন্য:
    • ,'+',⍪⍵: +প্রতিটি সংখ্যার সামনে একটি যোগ করুন ,
    • 1↓: প্রথম +ফিরে বন্ধ,
    • ⎕TC[2]: একটি অতিরিক্ত নতুন লাইন যুক্ত করুন,
    • ⎕←: এবং আউটপুট।

1

হাস্কেল - 127

অনেক পুনরাবৃত্তির পরে আমি নিম্নলিখিত কোডটি দিয়ে শেষ করেছি:

f=1:scanl(+)2f
main=getLine>>=putStr.a f "".read
a(f:g)s n|n==f=s++show f++"\n\n"|n<f=""|n>f=a g(s++show f++"+")(n-f)++a g s n

প্রতারণা করে এবং প্রতিটি আউটপুট লাইনের সামনে একটি অতিরিক্ত "0+" যুক্ত করে আমি একটি চরিত্রকে বাঁচাতে পারতাম।

আমি অন্য সংস্করণটি ভাগ করতে চাই (দৈর্ঘ্য 143) পূর্ববর্তী সমাধানটি গল্ফ করার চেষ্টা করার সময় আমি সামনে এসেছি। অপারেটর এবং টিপলসগুলিকে আমি এর আগে কখনও এতোদিন ব্যবহার করে নি:

f=1:scanl(+)2f
main=getLine>>=(\x->putStr$f€("",read x))
o%p=o++show p;(f:g)€t@(s,n)|n==f=s%f++"\n\n"|n<f=""|n>f=g€(s%f++"+",n-f)++g€t

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

256
2+3+5+13+34+55+144

2+3+5+13+89+144

2+3+5+13+233

2+8+13+34+55+144

2+8+13+89+144

2+8+13+233

2+21+34+55+144

2+21+89+144

2+21+233

এবং 1000:

1000
2+3+8+21+34+89+233+610

2+3+8+55+89+233+610

2+3+8+144+233+610

2+3+8+377+610

2+3+8+987

5+8+21+34+89+233+610

5+8+55+89+233+610

5+8+144+233+610

5+8+377+610

5+8+987

13+21+34+89+233+610

13+55+89+233+610

13+144+233+610

13+377+610

13+987

কারও কাছে এই স্টাফ থাকার কারণে কিছু দক্ষতার ডেটা:

% echo "12804" | time ./fibsum-golf > /dev/null
./fibsum-golf > /dev/null  0.09s user 0.00s system 96% cpu 0.100 total
% echo "128040" | time ./fibsum-golf > /dev/null
./fibsum-golf > /dev/null  2.60s user 0.01s system 99% cpu 2.609 total

0

05 এবি 1 , 19 বাইট (প্রতিদ্বন্দ্বী)

ÅFævy©O¹Qi®'+ý}})ê»

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

যে কোনও প্রদত্তের জন্য সমস্ত সম্ভাব্য অঙ্কের গণনা করে n। 1000 এর জন্য আউটপুট উদাহরণ:

1+1+3+8+144+233+610
1+1+3+8+21+34+89+233+610
1+1+3+8+377+610
1+1+3+8+55+89+233+610
1+1+3+8+987
13+144+233+610
13+21+34+89+233+610
13+377+610
13+55+89+233+610
13+987
2+3+8+144+233+610
2+3+8+21+34+89+233+610
2+3+8+377+610
2+3+8+55+89+233+610
2+3+8+987
5+8+144+233+610
5+8+21+34+89+233+610
5+8+377+610
5+8+55+89+233+610
5+8+987
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.