फाइबोनैचि सम के रूप में एक संख्या लिखें


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
पी अगर मैं एक जवाब पोस्ट अच्छा प्रदर्शन करने की यह उम्मीद, नहीं :): ... मैं सिर्फ इस bruteforce लिए जा रहा हूँ
दरवाज़े

वैसे यह कोड-गोल्फ नहीं सबसे तेज-कोड है। :
फिक्स्ड प्वाइंट

1
पी: मैं इसे लिखा था, और यह वास्तव में तेजी से चलाता है
दरवाज़े

काफी डुप्लिकेट नहीं है, लेकिन कोडगॉल्फ.स्टैकएक्सचेंज.com
पीटर टेलर

1
@ श्योना जब से मैंने निर्दिष्ट नहीं किया, अपने पसंदीदा को चुनें। :-)
फिक्स्ड प्वाइंट

जवाबों:


9

GolfScript, 54 वर्ण

~1.{3$)<}{.@+}/<[[]]{{+}+1$%+}@/\{~)+{+}*!}+,{'+'*n.}/

इसे ऑनलाइन टेस्ट करें या उदाहरण देखें:

> 54
2+5+13+34

> 55
1+2+5+13+34

3+5+13+34

8+13+34

21+34

55

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

गणितज्ञ, atic 89५ वर्ण

डेविड कारेरर को धन्यवाद देने के लिए 85 चार्ट को छोटा किया।

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

Mathematica में एक अंतर्निहित फ़ंक्शन होता है 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

उन सभी अतिरिक्त स्थानों से छुटकारा पाएं। आप एक टैब या स्पेस चार्ट का उपयोग इंडेंट कोड के लिए कर सकते हैं। जब संभव हो तो छोटी लाइन में लूप कोड लिखना भी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(इन से फाइबोनैचि संख्या रहे हैं 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
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

05AB1E , 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.