ন্যূনতম ফিবোনাচি চ্যালেঞ্জ!


19

চ্যালেঞ্জ

এই কাজের আপনি এন (কম 10 পূর্ণসংখ্যা একটি দেওয়া হবে 6 এই পার্টিশন বলা হয় -), সর্বনিম্ন পথে তোমাদের শুধুমাত্র ফিবানচি সংখ্যার ব্যবহার এন সমষ্টি পারে এটি Zeckendorf উপস্থাপনা

আপনি যে কোনও ফিবোনাচি নম্বরটি একাধিকবার ব্যবহার করতে পারেন এবং যদি একাধিক উপস্থাপনা আউটপুট থাকে তবে।

উদাহরণস্বরূপ যদি ইনপুট 67 হয় তবে একটি সম্ভাব্য আউটপুটটি ফিবোনাচি নম্বরগুলি 1,3,8,55 ব্যবহার করতে পারে যা ন্যূনতম সংখ্যার ফিবোনাচি সংখ্যাও যোগফলের জন্য 67 ব্যবহার করতে পারে ।

ইনপুট এনটি একটি একক লাইনে দেওয়া হয়, ইনপুটগুলি ইওএফ দ্বারা সমাপ্ত হয়।

উদাহরণ

বিন্যাসে দেওয়া হয়েছে input: output

0: 0
47: 34+13
3788: 2584+987+144+55+13+5
1646: 1597+34+13+2
25347: 17711+6765+610+233+21+5+2
677: 610+55+8+3+1
343: 233+89+21
3434: 2584+610+233+5+2

সীমাবদ্ধতাসমূহ

  • ইনপুট সংখ্যা 10 6 মান অতিক্রম করবে না ।
  • আপনার প্রোগ্রামটি সমস্ত ইনপুটগুলির জন্য 5 সেকেন্ডের বেশি চলবে না।
  • আপনি আপনার পছন্দের যে কোনও ভাষা ব্যবহার করতে পারেন।
  • সবচেয়ে কম সমাধানে জয়!

"আপনি কোনও ফিবোনাচি নাম্বার দিতে পারেন ..." হ্যা? "ইনপুটগুলির সংখ্যা 10 ^ 6 টির বেশি হবে না।" সুতরাং আমাদের একসাথে 10 ^ 6 এর বেশি সংখ্যার যোগ করার প্রয়োজন হবে না? আপনার অর্থ কী ইনপুটগুলির যোগফল 10 ^ 6 ছাড়িয়ে যাবে না?
মেল্লামব্যাক

7
স্পোলার্স: 1) লোভী অ্যালগরিদম (ইনপুট শূন্য না হওয়া পর্যন্ত বৃহত্তম ফিবোনাচি সংখ্যাটি বিয়োগ করে) অনুকূল সমাধান তৈরি করে। 2) একটি অনুকূল সমাধানের জন্য দুবার একটি ফাইবোনাচি নম্বর ব্যবহার করা উচিত নয় (যা 1 থেকে অনুসরণ করা হয়)। 3) এন <= 1000000 এর জন্য একটি অনুকূল সমাধানের 14 টির বেশি শর্ত থাকবে না।
জোয়ে অ্যাডামস

6
@ জো: আরও সাধারণভাবে, লোভী অ্যালগরিদম ধীরে ধীরে পৃথক ফিবোনাচি সংখ্যার মতো ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ফিবোনাচি সংখ্যা ব্যবহার করা হয় না (এটি জেকেন্ডারফের উপপাদ্য বলা হয়) ব্যবহার করে।
ন্যাব

1
স্পিলার 4: 29 0 1 থেকে শুরু হওয়া ফিবোনাচি সিকোয়েন্সের শর্তগুলি যথেষ্ট।
পিটার টেলর

@ ন্যাব: গণিতের অংশটি ব্যাখ্যা করার জন্য ধন্যবাদ
কুইসোটিক

উত্তর:


16

মোটরোলা 68000 সমাবেশ - 34 বাইট

(জিএনইউ এসেম্বলারের সিনট্যাক্স)

| short min_fib_partition(long N asm("%d2"), long *out asm("%a0"))
min_fib_partition:
    | Generate Fibonacci numbers on the stack (-1, 1, 0, 1, 1, 2, 3, ..., 1134903170).
    moveq #-1, %d0          | A = -1
    moveq #1, %d1           | B = 1
generate_loop:
    move.l %d0, -(%sp)      | Push A to the stack.
    exg.l %d0, %d1          | A' = B
    add.l %d0, %d1          | B' = A + B
    bvc.s generate_loop     | Stop when signed long overflows.

    | Go back up the stack, partitioning N using the greedy algorithm.
    moveq #0, %d0           | Initialize return value (number of terms).
subtract_loop:
    move.l (%sp)+, %d1      | Pop a Fibonacci number F off the stack.
    cmp.l %d1, %d2          | If N < F, continue to smaller Fibonacci number.
    blt.s subtract_loop
    addq.w #1, %d0          | Increment the term count.
    move.l %d1, (%a0)+      | Append F to the output array.
    sub.l %d1, %d2          | N -= F
    bne.s subtract_loop     | Continue if N has not yet reached zero.

    | Clear the stack by searching for that -1.
clear_stack_loop:
    tst.l (%sp)+
    bge clear_stack_loop

done:
    rts

36 → 34: ওভারফ্লো বদলে কাউন্টিং দ্বারা তৈরি ফিবানচি জেনারেটরের স্টপ, এবং স্থির 0ক্ষেত্রে তাই এটি আউটপুট [0]বদলে []। যাইহোক, Nএখন একটি নেতিবাচক ক্র্যাশ পাস ।

শীর্ষে মন্তব্যটি হ'ল এই ফাংশনের সি প্রোটোটাইপ, কোন পরামিতিগুলি কোথায় যায় তা সনাক্ত করার জন্য একটি ভাষা বর্ধন ব্যবহার করে (ডিফল্টরূপে, তারা স্ট্যাকের দিকে যায়)।

আমার টিআই-89 , এর 10MHz প্রসেসরের সাথে, 1 - 1,000,000 এ এই ফাংশনটি চালাতে 5 মিনিট সময় নেয়।

যদিও গল্ফস্ক্রিপ্ট সমাধানের তুলনায় মেশিন কোডটি বর্তমানে (কম) কম বাইট, এটি সম্ভবত সংক্ষিপ্ততম সমাধান হিসাবে গ্রহণ করা অন্যায় হবে কারণ:

আপনার যদি টিআই-89/92 / ভি 200 থাকে তবে আপনি এখানে পুরো প্রকল্পটি ডাউনলোড করতে পারেন (পুরানো):

https://rapidshare.com/files/154945328/minfib.zip

আপনাকে প্রকৃত ফাইল দেওয়ার জন্য র‌্যাপিডশেয়ারকে ভাগ্যবান শুভকামনা। এই বড় ফাইলগুলির জন্য কি কেউ ভাল হোস্ট সম্পর্কে জানেন? 8940 বাইট একটি ভয়ঙ্কর প্রচুর।


আপনি তালিকার একটি চতুর্থ পয়েন্ট যুক্ত করতে পারেন: সমাধানটি সঠিক ফর্ম্যাটে আউটপুট দেয় না: পি আমি একা স্ট্রিং লিটারালগুলিতে 7 টি অক্ষর ব্যবহার করছি। বিটিডাব্লু আপনি কি ইনপুট 0 এর জন্য [0] তালিকাটি ফিরিয়ে দিচ্ছেন? আমার কাছে মনে হচ্ছে আপনি খালি তালিকাটি ফিরিয়ে দিয়েছেন। এটি বিরক্তিকর একটি বিশেষ কেস।
পিটার টেলর

@ পিটার টেইলর: আপনি ঠিক বলেছেন, আমি এটি মিস করেছি। আমি পদ এবং শর্ত গণনা মিশ্রিত। আমি শীঘ্রই একটি ঠিক পোস্ট করব।
জোয়ে অ্যাডামস

5

জাভাস্ক্রিপ্ট (142)

একসাথে কেবলমাত্র একক ইনপুট পরিচালনা করে। কারণ জাভাস্ক্রিপ্টের জন্য মাল্টি-লাইন ইনপুট অকেজো।

k=n=prompt(f=[a=b=1])|0;while((b=a+(a=b))<n)f.push(b);for(i=f.length,g=[];i--;)if(f[i]<=k)g.push(f[i]),k-=f[i];alert(n+': '+(n?g.join('+'):0))

http://jsfiddle.net/EqMXQ/


5

সি, 244 টি অক্ষর

#define P printf
int f[30];int main(){f[28]=f[29]=1;int i=28;for(;i>0;--i)f[i-1]=f[i+1]+f[i];int x;while(scanf("%i",&x)!=-1){P(x?"%i: ":"0: 0\n",x);if(x>0){int i=0,a=0;while(x>0){while(f[i]>x)++i;if(a++)P("+");P("%i",f[i]);x-=f[i];}P("\n");}}}

সাদা স্থান সহ:

#define P printf
int f[30];
int main(){
    f[28] = f[29] = 1;
    int i = 28;
    for(; i > 0; --i) f[i-1] = f[i+1] + f[i];
    int x;
    while(scanf("%i",&x) != -1) {
        P(x ? "%i: " : "0: 0\n",x);
        if(x > 0) {
            int i = 0, a = 0;
            while(x > 0) {
                while(f[i] > x) ++i;
                if(a++) P("+");
                P("%i",f[i]);
                x -= f[i];
            }
            P("\n");
        }
    }
}

এই প্রোগ্রামটি স্ট্যান্ডার্ড আউটপুটের বাইরে নম্বরগুলি পড়বে এবং স্ট্যান্ডার্ড আউটপুটে লিখবে।


5

গল্ফস্ক্রিপ্ট, 43 টি অক্ষর

~]{:|': '[{0 1{|>!}{.@+}/;|1$-:|}do]'+'*n}%

আমি মনে করি এটি আরও প্রচেষ্টা সহ 3 থেকে 5 অক্ষর দ্বারা সম্ভবত হ্রাস করা যেতে পারে। উদাহরণস্বরূপ, তারপরে অ্যারে ফেলে দেওয়া অপব্যয় বোধ করে।


3

F # - 282 252 241 টি অক্ষর

let mutable d=int(stdin.ReadLine())
let q=d
let rec f x=if x<2 then 1 else f(x-2)+f(x-1)
let s x=
 d<-d-x
 x
printf"%d: %s"q (Core.string.Join("+",[for i in List.filter(fun x->x<d)[for i in 28..-1..0->f i]do if d-i>=0 then yield s i]))

3

পাইথন - 183 অক্ষর

কোডটির বেশিরভাগ অংশ একাধিক ইনপুট পরিচালনা করছে :(

f=lambda a,b,n:b>n and a or f(b,a+b,n)
g=lambda n:n>0and"%d+%s"%(f(0,1,n),g(n-f(0,1,n)))or""
try:
 while 1:
  n=input()
  print "%d: %s"%(n,n<1and"0"or g(n).strip("+"))
except:0

আপনি n=input()আগের লাইনের শেষে রাখতে পারেন ?
mbomb007

আমারও তাই মনে হচ্ছে. : \
st0le

আপনি print
mbomb007

2

গণিত 88

n = RandomInteger[10000, 10];

Print[k=#,For[i=99;l={},k>0,If[#<=k,k-=#;l~AppendTo~#]&@Fibonacci@i--];":"l~Row~"+"]&/@n

আউটপুট উদাহরণ

3999: 2584+987+377+34+13+3+1
9226: 6765+1597+610+233+21
7225: 6765+377+55+21+5+2
9641: 6765+2584+233+55+3+1
6306: 4181+1597+377+144+5+2
4507: 4181+233+89+3+1
8848: 6765+1597+377+89+13+5+2
6263: 4181+1597+377+89+13+5+1
2034: 1597+377+55+5
6937: 6765+144+21+5+2


1

স্কালা - 353 টি অক্ষর (একাধিক ইনপুট পরিচালনা করার জন্য 100 অক্ষর)

def h(m:Int){lazy val f={def g(a:Int,b:Int):Stream[Int]=a #:: g(b,a+b);g(0,1);};if(m==0)println(m+": "+m)else{var s=0;var t= f.takeWhile(_ <= m);var w="";while(s!= m){s+=t.last;w+=t.last+"+";t=t.takeWhile(_<=m-s);};println(m+": "+w.take(w.length-1))}}
Iterator.continually(Console.readLine).takeWhile(_ != "").foreach(line => h(Integer.parseInt(line)))

Iterator.continually(Console.readLine).takeWhile(_ != "").foreach(line => h(Integer.parseInt(line)))io.Source.stdin.getLines.foreach(l=>h(Integer.parseInt(l)))40-ইশ অক্ষর সংরক্ষণ করতে সংক্ষিপ্ত করা যেতে পারে ।
গ্যারেথ

1

পাইথন 3 (170 টি অক্ষর)

while 1:
 s=input()
 if not s:break
 s=n=int(s);f=[1];t=[]
 while f[-1]<n:f+=[sum(f[-2:])]
 for i in f[::-1]:
  if s>=i:s-=i;t+=[i]
 print(n,'=','+'.join(map(str,t))or 0)

মাল্টলাইন ইনপুট, খালি লাইনে থামুন


1

সি, 151 টি অক্ষর

main() {int i=1,n,f[30]={1,1};for(;i++<30;)f[i]=f[i-1]+f[i-2];while(scanf("%d",&n))for(i=30;;--i)if(f[i]<=n){printf("%d\n",f[i]);if(!(n-=f[i]))break;}}

পাঠযোগ্য সংস্করণ:

main() {
    int i=1,n,f[30]={1,1};
    for(;i++<30;)f[i]=f[i-1]+f[i-2];
    while(scanf("%d",&n))
        for(i=30;;--i)
            if(f[i]<=n) {
                printf("%d\n",f[i]);
                if (!(n-=f[i])) break;
            }
}

1

আর, 170

x=scan();Filter(function(i)cat(unlist(Map(function(d)if(i>=d&&i){i<<-i-d;d},rev(lapply(Reduce(function(f,x)c(f[2],sum(f)),1:94,c(0,1),F,T),head,n=1)))),sep='+',fill=T),x)

একাধিক ইনপুট এবং বিড়ালের ফলাফল STDOUT এ পরিচালনা করে

> x=scan();Filter(function(i)cat(unlist(Map(function(d)if(i>=d&&i){i<<-i-d;d},rev(lapply(Reduce(function(f,x)c(f[2],sum(f)),1:94,c(0,1),F,T),head,n=1)))),sep='+',fill=T),x)
1: 100
2: 200
3: 300
4: 
Read 3 items
89+8+3
144+55+1
233+55+8+3+1
numeric(0)
>

1

আর (460 অক্ষর)

আর ব্যবহার করে আর একটি সংস্করণ।
ফাইল "ইনপুট" থেকে ফাইল পড়া "আউটপুট"

d=as.list(as.integer(scan("input","",sep="\n")));n=36;f=rep(1,n);for(i in 3:n){f[i]=f[i-2]+f[i-1]};d2=lapply(d,function(x){a=vector("integer");i=1;while(x>0){id=which(f>=x)[1];if(x==f[id]){x=x-f[id];a[i]=f[id]}else{x=x-f[id-1];a[i]=f[id-1]}i=i+1}a});d=mapply(c,d,d2,SIMPLIFY=0);for(i in 1:length(d)){t=d[[i]];l=length(t);if(l==1){d[[i]]=paste(t[1],t[1],sep=": ")}else{d[[i]]=paste(t[1],": ",paste(t[2:l],collapse="+"),sep="")}}lapply(d,write,"output",append=1)

"ইনপুট" উদাহরণ

0
47
3788
1646
25347
677
343
3434

"আউটপুট" উদাহরণ

0: 0
47: 34+13
3788: 2584+987+144+55+13+5
1646: 1597+34+13+2
25347: 17711+6765+610+233+21+5+2
677: 610+55+8+3+1
343: 233+89+21
3434: 2584+610+233+5+2

আরও পঠনযোগ্য সংস্করণ:

dt <- as.list(as.integer(scan(file = "input", what = "", sep = "\n")))
n <- 36
fib <- rep(1, n)
for(i in 3:n){fib[i] <- fib[i-2] + fib[i-1]}
dt2 <- lapply(dt, function(x){answ <- vector(mode = "integer")
                               i <- 1
                               while(x > 0){
                                   idx <- which(fib>=x)[1]
                                   if(x == fib[idx]){
                                       x <- x - fib[idx]
                                       answ[i] <- fib[idx]
                                   } 
                                   else {
                                       x <- x - fib[idx-1]
                                       answ[i] <- fib[idx-1]
                                   }
                                   i <- i + 1
                               }
                               answ})
dt <- mapply(FUN = c, dt, dt2, SIMPLIFY = FALSE)
for(i in 1:length(dt)){
    t1 <- dt[[i]]
    t1.len <- length(t1)
    if(t1.len == 1){
        dt[[i]] <- paste(t1[1], t1[1], sep=": ")
    } else {
        dt[[i]] <- paste(t1[1], ": ", paste(t1[2:t1.len], collapse = "+"), sep="")
    }
}
lapply(dt, write, "output", append=TRUE)

0

ডি (১৯6 টি চর)

সাথে চালাও rdmd --eval=…। এটি সুবিধামতভাবে এর বয়লারপ্লেটগুলি লুকায় import x, y, z;এবং void main() {…}:

int f(int i){return i-->1?f(i--)+f(i):i+2;}int n;foreach(x;std.stdio.stdin.byLine.map!(to!int))writeln(x,": ",x?n=x,reduce!((r,i)=>f(i)<=n?n-=f(i),r~="+"~f(i).text:r)("",29.iota.retro)[1..$]:"0")

0

জাভা ব্যবহার করা

package org.mindcraft;

import java.util.Scanner;

public class Fibbo {
    public static void main(String[] args) {
    String number = null;
    int tmp, sum;
    int i = 1, j = 1;
    Scanner in = new Scanner(System.in);
    number = in.nextLine();
    String[] arr = number.split(" ");
    for (int it = 0; it < arr.length; it++) {
        tmp = Integer.parseInt(arr[it]);
        String value = tmp+" : ";
        while (tmp > 0) {
            i = 1;
            j = 1;
            for (int k = 0; k < 10000; k++) {
                sum = i + j;
                if (sum > tmp) {
                    //if (value == null) {
                    char ch=value.charAt(value.length()-2);
                    if(ch==':')
                    {
                        value = value+" "+ j + "";
                    } else {
                        value = value + " + " + j;
                    }

                    tmp = tmp - j;
                    break;
                }
                i = j;
                j = sum;
            }
        }
        System.out.println(value);
    }
}
}

এটি কোড গল্ফ, তাই আপনার উত্তরটি গল্ফ নিশ্চিত করে নিন।
কেএসএফটি

1
পিপিসিজিতে আপনাকে স্বাগতম! কেএসএফটি যেমন বলেছে, এটি একটি কোড-গল্ফ চ্যালেঞ্জ। যতটা সম্ভব কোডের কয়েকটি বাইটে এই প্রশ্নের উত্তর দেওয়ার জন্য কিছু প্রচেষ্টা দেখান। খুব কমপক্ষে, আপনি অপ্রয়োজনীয় সাদা স্থান সরিয়ে ফেলতে এবং একক-বর্ণের শ্রেণি / পদ্ধতি / পরিবর্তনশীল নামগুলি ব্যবহার করতে পারেন। এটি করার পরে, দয়া করে আপনার উত্তরে বাইট গণনাটিও অন্তর্ভুক্ত করুন।
মার্টিন এন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.