カウンターフィボナッチ数列


13

与えられた3つの数字は、mはN及びPは、タスクは、長さのリスト/配列印刷することでpは始まるMNの後に、各要素pはそれより2数の差を表し、MN(反フィボナッチ数列

このチャレンジでは、関数を使用して、結果またはプログラム全体を返すか印刷することができます。

入力

言語がサポートしているものは何でも、改行/スペース/コンマで区切られた3つの整数mn、およびpですが、入力形式を指定する必要があります。コードの挿入は許可されていません。

出力

Counter-Fibonacciシーケンスに含まれる数値。次の形式のいずれか(この例:)m = 50, n = 40, p = 6

  • 50,40,10,30,-20,50 (またはコンマの後のスペースを使用)
  • [50,40,10,30,-20,50] (またはコンマの後のスペースを使用)
  • 50 40 10 30 -20 50(または\nスペースの代わりに(改行)を使用)
  • {50,40,10,30,-20,50} (またはコンマの代わりにスペースを使用)

Input => Output

50,40,10 => 50,40,10,30,-20,50,-70,120,-190,310
-100,-90,7 => -100,-90,-10,-80,70,-150,220
250,10,8 => 250,10,240,-230,470,-700,1170,-1870

ルール

  • pが1より大きいことが保証されます
  • 可能であれば、プログラムをテストする方法を提供する必要があります
  • 上記のように、この抜け穴は禁止されており、コードの挿入は許可されていないことに注意してください

スコアリングとリーダーボード

これははできるだけ短くする必要があります。この課題は言語による最短回答を見つけることを目的としているため、回答は受け入れられません


ETHproductionsによる関連質問:月曜日のミニゴルフ#1:逆フィボナッチソルバー


関連する可能性のある重複。基本的にはこれと同じチャレンジですが、シーケンス内の特定のスポットから逆順で出力します。
-ETHproductions

@ETHproductionsはだまされやすい人と考えられるかもしれないが、これはあるビット各言語での最短のソリューションを参照しようとしている、異なる
氏Xcoder

ええ、当時は言語の不平等についてそれほど心配していませんでした;-)それは大きな違いを生むとは思いません。ここでの主な違いは、その課題を解決するために使用したアルゴリズムの最初のステップを
ほとんど省く

@ETHproductionsには確かに小さな違いがあります。このチャレンジを削除したい場合は、完全にやります。
ミスターXcoder

個人的には大丈夫だと思います。余談ですが、末尾のセパレータを使用できますか?
-ETHproductions

回答:


9

Haskell、29バイト

a#b=a:b#(a-b)
(.(#)).(.).take

長さpは最初のパラメーターです。使用例:( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]オンラインでお試しください!

リストをp要素に短縮すると、リストを作成するよりも多くのバイトがかかります。


6

ゼリー、6バイト

_@С+Ṗ

オンラインでお試しください!

使い方

_@С+Ṗ  Main link. Left argument: m. Right argument: n. Third argument: p

    +   Yield (m + n), the term that comes before m.
  С    Execute the link to the left p times, starting with left argument m and
        right argument (m + n). After each execution, replace the right argument
        with the left one and the left argument with the previous return value.
        Yield all intermediate values of the left argument, starting with m.
_@          Subtract the left argument from the right one.
        This yields the first (p + 1) terms of the sequence, starting with m.
    Ṗ   Pop; discard the last term.


5

JavaScript(ES6)、33バイト

f=(m,n,p)=>p?m+[,f(n,m-n,p-1)]:[]

文字列を1,2,3,使用せずに、フォーマットの文字列を返します!

テストスニペット


5

Perl 6、25バイト

{($^m,$^n,*-*...*)[^$^p]}

それを試してみてください

拡張:

{  # bare block lambda with placeholder parameters 「$m」 「$n」 「$p」
  (
    $^m, $^n,  # declare first two params, and use them

    * - *      # WhateverCode lambda which subtracts two values

    ...        # keep using that to generate values

    *          # never stop (instance of type Whatever)

  )[ ^ $^p ]   # declare last param, and use it to grab the wanted values
               # 「^ $^p」 is short form of range op
               # 「0 ..^ $^p」 which excludes the 「$p」
}

5

CJam、15バイト

q~2-{1$1$-}*]S*

CJamは許可されている出力形式の1つを自然に使用しないため、余分な1バイト> _ <

オンラインでお試しください!

説明

q~               e# Read and eval the input
  2-             e# Subtract 2 from p (to account for m and n being in the list)
    {            e# Run this block p-2 times:
     1$1$-       e#   Copy the top values and subtract
          }*     e# (end of block)
            ]    e# Wrap the stack in an array
             S*  e# Join with spaces


3

ロダ、38バイト

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}

オンラインでお試しください!

説明:

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}
f i,a,b{                             } /* Function declaration */
        seq 1,i                        /* Push numbers 1..i to the stream */
               |{|_|               }_  /* For each number in the stream: */
                    [a];               /*   Push the current value of a */
                        b=a-b;         /*   Set b = the next number */
                              a=a-b    /*   Set a = the previous value of b */

3

Haskell、33バイト

(m!n)0=[]
(m!n)p=m:(n!(m-n))(p-1)

を使用して呼び出し(m!n)pます。定義作品!を取り込む中置関数としてm及びn及びとる関数戻りp、所望の結果を返しています。


いいね!関数を中置することは考えていなかったので、haskellでの最善の試みは34 ;でした。
AlexJ136

2

ルビー、31バイト

->m,n,p{p.times{m,n=n,(p m)-n}}

簡単なソリューション


2

PHP、76バイト

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c---2;)$r[]=-end($r)+prev($r);print_r($r);

PHP、84バイト

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c>$d=count($r);)$r[]=$r[$d-2]-end($r);print_r($r);


1

Mathematica、26バイト

{-1,1}~LinearRecurrence~##

Lovin 'ビルトイン。フォームの入力を受け取ります{{m, n}, p}LinearRecurrenceは、以前の要素の線形結合の係数を知り、新しい要素を生成するために使用することを望んでいます{-1,1}。この場合はです。


1

QBIC35 33バイト

:::?'a;b;`[c-2|e=a-b?e';`┘a=b┘b=e

最初のPRINTコードを1つのコードリテラルに配置して、2バイトを節約しました。

説明(35バイトバージョン):

:::         Get parameters a, b, c from the cmd-line
  ';`       This suppresses a newline when printing
?a   b';`   PRINT a and b
[c-2|       FOR x=1; x<=(c-2); x++
  e=a-b       calculate the next term of the sequence
  ?e';`       Print it, suppressing newline
  ┘a=b        ┘ denotes a syntactic linebreak; shove the numbers one over
  ┘b=e        dito
            FOR-loop is auto-closed

これをテストするためのオンライン通訳のアイデアはありますか?
ミスターXcoder

@ Mr.Xcoderにはまだオンライン通訳がありません。ごめんなさい。インタプリタへのリンクを追加しました。これは、QBasicを実行し、QBICを実行するDOSBOXプロジェクトです。
-steenbergh

1
説明は、通訳の@steenberghよりも価値があります。返信してくれてありがとう!
ミスターXcoder

1

C、128バイト

m,n,p,z;main(c,v)char**v;{m=atoi(v[1]);n=atoi(v[2]);p=atoi(v[3])-2;printf("%d,%d",m,n);while(p--)z=m,m=n,n=z-m,printf(",%d",n);}

このプログラムは3つの引数を解析しmnそしてpコマンドラインから、および指定された出力を出力します。

最新のCコンパイラでは、基本的なインポートを省略することができるため、sを使用printfしても使用しatoiなくてもかまいません#include

グローバル変数はint、型なしで宣言された場合のデフォルトです-これにより、多くのスペースを節約できます。


1

Java、66バイト

ラムダは、多くの余分なバイトを必要とする再帰を非常に 迂回的に適用するため、ゴルフへの非効率的なアプローチです。

ゴルフ済み:

String f(int m,int n,int p){return""+m+(p>1?","+f(n,m-n,p-1):"");}

ゴルフをしていない:

public class CounterFibonacciSequences {

  private static final int[][] INPUTS = new int[][] { //
      { 50, 40, 10 }, //
      { -100, -90, 7 }, //
      { 250, 10, 8 } };

  private static final String[] OUTPUTS = new String[] { //
      "50,40,10,30,-20,50,-70,120,-190,310", //
      "-100,-90,-10,-80,70,-150,220", //
      "250,10,240,-230,470,-700,1170,-1870" };

  public static void main(String[] args) {
    for (int i = 0; i < INPUTS.length; ++i) {
      final int m = INPUTS[i][0];
      final int n = INPUTS[i][1];
      final int p = INPUTS[i][2];
      System.out.println("M: " + m);
      System.out.println("N: " + n);
      System.out.println("P: " + p);
      System.out.println("Expected: " + OUTPUTS[i]);
      System.out.println("Actual:   " + new CounterFibonacciSequences().f(m, n, p));
      System.out.println();
    }
  }

  String f(int m, int n, int p) {
    return "" + m + (p > 1 ? "," + f(n, m - n, p - 1) : "");
  }
}

1

AHK、68バイト

m=%1%
n=%2%
3-=2
Send %m%`n%n%`n
Loop,%3%
{
n:=m-n
m-=n
Send %n%`n
}

「渡された引数を(使用することができるという方法/知らないのは本当に疲れて%1%%2%任意の数学関数に直接、...)


1

パイソン293の 90バイト

u,t=int,input;m,n,p=u(t()),u(t()),u(t());l=[m,n]
for i in range(p-2):l.append(l[-2]-l[-1])

オンラインでお試しください!

@ Mr.Xcoderのおかげで3バイト節約

入力として数字を受け取り、それらを正しくフォーマットし、forループを使用して、入力された数字に基づいてリストを生成します。


あなたは、1つのバイトを保存するには、その範囲内のコンマの後にスペースを削除することができます
ミスターXcoder

あなたはint型とinput.splitであなたの入力をマップする場合、それが短くなる場合があります
ミスターXcoder

@ Mr.Xcoder私は分割を試みましたが、結局長くなりました。
同志スパークルポニー

はい、テストできませんでした。とにかく良いです。
ミスターXcoder

そして、範囲は、最初の引数は必要ありません
氏Xcoder

0

スイフト-85バイト

func y(x:Int,y:Int,z:Int){var m=x,n=y,p=z,c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

使用法: y(x:50,y:40,x:6)

スイフト-84バイト

func z(l:[Int]){var m=l[0],n=l[1],p=l[2],c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

使用法: z(l: [50,40,6])


出力:

50
40
10
30
-20
50

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.