Nボナッチ数列を出力します


54

これはあまり広く知られていませんが、フィボナッチ数列、別名

1, 1, 2, 3, 5, 8, 13, 21, 34...

実際にはDuonacciシーケンスと呼ばれます。これは、次の番号を取得するには、前の2つの番号を合計するためです。トリボナッチ数列もあり、

1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355, 653, 1201...

次の数字は前の3つの数字の合計だからです。そして、Quadronacciシーケンス

1, 1, 1, 1, 4, 7, 13, 25, 49, 94, 181, 349, 673...

そして、みんなのお気に入り、ペンタナッチシーケンス:

1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129...

そして、ヘキサナッチシーケンス、セプタナッチシーケンス、オクトナッチシーケンスなど、N-ボナッチシーケンスまで続きます。

Nボナッチ数列は、常にN 1で連続して始まります。

挑戦

2つの数値NXを取り、最初のX N-Bonacci数値を出力する関数またはプログラムを作成する必要があります。Nは0より大きい整数であり、N-Bonacciの数値が言語のデフォルトの数値タイプを超えることはないと想定できます。出力は人間が読める形式であればどのような形式でもかまいません。また、妥当な方法で入力を取得できます。(コマンドライン引数、関数引数、STDINなど)

いつものように、これはCode-golfなので、標準の抜け穴が適用され、バイト単位の最短回答が勝ちます!

サンプルIO

#n,  x,     output
 3,  8  --> 1, 1, 1, 3, 5, 9, 17, 31
 7,  13 --> 1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193
 1,  20 --> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 30, 4  --> 1, 1, 1, 1       //Since the first 30 are all 1's
 5,  11 --> 1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129

1
男、私はしばらく前にこのアイデアを持っていたが、それを書き上げることはできなかった。
モーガンスラップ

9
私の投票ボタン==あなたのアバター
-ETHproductions

1, 1, 2, 4, 73番目のポジションのように、3 ボナッチはありません0 + 1 + 1か?...そして、他の人との一体ですか?

1
@umbrellaいいえ、トリボナッチは3の1で始まります。この点を明確にするために私の編集を参照してください。
DJMcMayhem

回答:


23

Boolfuck、6バイト

,,[;+]

N-Bonacci番号は、お使いの言語のデフォルトの番号タイプを超えることはないと想定できます。

Boolfuckのデフォルトの数値タイプは少しです。これが入力番号NおよびXにも拡張され、N> 0の場合、可能な入力は10(何も出力しない)と11(1を出力する)の2つだけであると仮定します。

,現在のメモリ位置にビットを読み込みます。Nは1でなければならないため無視されます。Xが0の場合、ループ本体(で囲まれた[])はスキップされます。Xが1の場合、出力されてから0に反転されるため、ループは繰り返されません。


4
まさにこのような標準的な抜け穴はありませんか?
スタンストラム

1
@StanStrumこの回答の前後から?
user253751

2
それが前に来たと思う、それをチェックさせてください... Meta Link ; 最初の改訂は2016年1月31日13時44分です。すごい!私は2日間休みました。頑固であるために、この最後の編集は2016年1月31日16:06でした。SOOOOOOええ、それは私の本の中でいいのよ
スタン・ストラム


8

Pyth、13

<Qu+Gs>QGEm1Q

テストスイート

n最初に、入力改行を区切ります。

説明:

<Qu+Gs>QGEm1Q  ##  implicit: Q = eval(input)
  u      Em1Q  ##  read a line of input, and reduce that many times starting with
               ##  Q 1s in a list, with a lambda G,H
               ##  where G is the old value and H is the new one
   +G          ##  append to the old value
     s>QG      ##  the sum of the last Q values of the old value
<Q             ##  discard the last Q values of this list

1
うわー、それは速かった。あなたがこれを投稿する前にブラウザを閉じる時間はほとんどありませんでした!
DJMcMayhem

5

Haskell、56バイト

g l=sum l:g(sum l:init l)
n#x|i<-1<$[1..n]=take x$i++g i

使用例:3 # 8-> [1,1,1,3,5,9,17,31]

使い方

i<-1<$[1..n]           -- bind i to n copies of 1
take x                 -- take the first x elements of
       i++g i          -- the list starting with i followed by (g i), which is
sum l:                 -- the sum of it's argument followed by
      g(sum l:init l)  -- a recursive call to itself with the the first element
                       -- of the argument list replaced by the sum

tail l代わりにすべきではないinit l
誇りに思ってhaskeller

@proudhaskeller:関係ありません。最後のn要素はリストに保持します。最初のリストは1s のみで構成されているため、末尾から削除して先頭に追加する場合と、その逆の場合、つまり先頭から削除して末尾に追加する場合に違いはありません。
nimi

わかりました。それは交換する気の利いた方法だ++[]:
誇りに思ってhaskeller

@proudhaskeller:はい、正確に!
nimi

5

Python 2、55バイト

def f(x,n):l=[1]*n;exec"print l[0];l=l[1:]+[sum(l)];"*x

nリスト内のシーケンスの長さウィンドウを追跡しl、合計を追加して最初の要素を削除することにより更新します。反復の各反復で最初の要素を出力しxます。

すべての要素を保存し、最後のn値を合計する異なるアプローチは、同じ長さを与えました(55)。

def f(x,n):l=[1]*n;exec"l+=sum(l[-n:]),;"*x;print l[:x]

5

Javascript ES6 / ES2015、 107 97 85 80バイト

いくつかのバイトを保存してくれた@ user81655、@ Neil、@ ETHproductionsに感謝


(i,n)=>eval("for(l=Array(i).fill(1);n-->i;)l.push(eval(l.slice(-i).join`+`));l")

オンラインで試す


テストケース:

console.log(f(3,  8))// 1, 1, 1, 3, 5, 9, 17, 31
console.log(f(7,  13))// 1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193
console.log(f(5,  11))// 1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129

1
いいね ゴルフのヒントのカップルは:for常により優れているwhilex.split('')- > [...x]~~a- > +an-=1- > n--、あなたは全体の機能本体を囲む場合はeval、あなたが記述する必要はありませんreturn。また、[...'1'.repeat(i)]is よりも短くArray(i).fill(1)~~from aおよびを削除できますb。そして、あなたは削除することができますf=
user81655

2
これは私のヒント(85バイト)でどのように見えるか(i,n)=>eval("for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));l")です:。ステートメントの順序を変更し、n--into n-iを結合lして引数から削除し、数バイトを節約しました。
user81655

1
@ user81655 eval節約できません。(i,n)=>{for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));return l}まだ85バイトです。
ニール

@Neilは86バイトのように見えます
...-user81655

3
l.slice(-i).reduce((a,b)=>a+b)=>eval(l.slice(-i).join`+`)
ETHproductions

4

ES6、66バイト

(i,n)=>[...Array(n)].map((_,j,a)=>a[j]=j<i?1:j-i?s+=s-a[j+~i]:s=i)

悲しいmapことに、コールバックで結果の配列にアクセスすることはできません。


1
パラメータをカリー化してバイトを保存します。
シャギー

4

ゼリー、12バイト

ḣ³S;
b1Ç⁴¡Uḣ

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

使い方

b1Ç⁴¡Uḣ  Main link. Left input: n. Right input: x.

b1       Convert n to base 1.
    ¡    Call...
  Ç        the helper link...
   ⁴       x times.
     U   Reverse the resulting array.
      ḣ  Take its first x elements.


ḣ³S;     Helper link. Argument: A (list)

ḣ³       Take the first n elements of A.
  S      Compute their sum.
   ;     Prepend the sum to A.

3

C ++ 11、360バイト

こんにちは、私はこの質問が好きです。私はc ++がこの競争に勝つために非常に難しい言語であることを知っています。しかし、私はなんとか1セント硬貨を投げます。

#include<vector>
#include<numeric>
#include<iostream>
using namespace std;typedef vector<int>v;void p(v& i) {for(auto&v:i)cout<<v<<" ";cout<<endl;}v b(int s,int n){v r(n<s?n:s,1);r.reserve(n);for(auto i=r.begin();r.size()<n;i++){r.push_back(accumulate(i,i+s,0));}return r;}int main(int c, char** a){if(c<3)return 1;v s=b(atoi(a[1]),atoi(a[2]));p(s);return 0;}

上記のコードの読みやすい説明としてこれを残します。

#include <vector>
#include <numeric>
#include <iostream>

using namespace std;
typedef vector<int> vi;

void p(const vi& in) {
    for (auto& v : in )
        cout << v << " ";
    cout << endl;
}

vi bonacci(int se, int n) {
    vi s(n < se? n : se, 1);
    s.reserve(n);
    for (auto it = s.begin(); s.size() < n; it++){
        s.push_back(accumulate(it, it + se, 0));
    }
    return s;
}

int main (int c, char** v) {
    if (c < 3) return 1;
    vi s = bonacci(atoi(v[1]), atoi(v[2]));
    p(s);
    return 0;
}

プログラミングパズルとコードゴルフへようこそ。これは良い答えですが、多くの空白、および1文字より長い変数名と関数名があることに気づきました。現状では、これはコードの読みやすいバージョンですが、ゴルフバージョンを追加する必要があります。あなたがするとき、私はあなたに賛成票を差し上げますが、それがゴルフされるまで私はしません。
wizzwizz4

@ wizzwizz4こんにちは、上記のコードのゴルフバージョンを追加しました。私は、自分がどのようにそれをしたかを人々に見せるために、未使用のコードを残しました。それに、viを返す関数bonacciを読むのが好きです。これは、まだvibonacciのように聞こえます。標準機能ではプログラムのエントリポイントとしてint main(int、char **)を使用することが義務付けられているため、main関数を短くしないでください。さらに、すべての変数は最大1文字の長さで、重要でない空白はすべて削除されると思います。
-hetepeperfan

3
これはコードではなく、「標準に準拠」です。これはcode-golfです。言語を操作し、活用します。変数がintsの場合は、を削除しintます。関数が呼び出された場合はfoo、それらを呼び出しますf。残忍です; 標準を無視し、コンパイラを悪用します。それがゴルフのやり方です。
wizzwizz4

パンズと素敵なコードは、未使用のコードにのみ属します。ただし、それらを自由に保管してください。実際には、それをお勧めします。しかし、コードをゴルフするときは、コンパイラーにとって本当に本当に意味のあることです。どんなに小さくても、できるだけ小さくしてください。(ああ、これが私が約束した+1です!)
wizzwizz4

@ wizzwizz4「int」の削除は有効ですか?暗黙のintは実行されないと思った。
DJMcMayhem

3

Haskell、47バイト

q(h:t)=h:q(t++[h+sum t])
n?x=take x$q$1<$[1..n]

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

<$ このチャレンジが投稿された後にPreludeに導入された可能性があります。


Haskell、53バ​​イト

n%i|i>n=sum$map(n%)[i-n..i-1]|0<1=1
n?x=map(n%)[1..x]

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

?ように使用されるバイナリ関数を定義し3?8 == [1,1,1,3,5,9,17,31]ます。

補助関数%は、前の値を合計することによりin-bonacciシーケンスのth要素を再帰的に見つけnます。次に、関数?はの最初のx値を集計します%


古い答えですが、「補助機能%」を意味しますか?
コナーオブライエン

警備員を切り替えるとなりますi<=ni>n
Ørjanヨハンセン

@ØrjanJohansen編集中も、メソッド全体を振り返ると悪いように思えますが、ゴルフ全体をやり直すかもしれません。
xnor

2

APL、21

{⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1}

これは、nを左引数、xを右引数としてとる関数です。

説明:

{⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1}
                   ⍺/1  ⍝ begin state: X ones    
                  +     ⍝ identity function (to separate it from the ⍵)
    ⍺{         }⍣⍵     ⍝ apply this function N times to it with X as left argument
      ⍵,               ⍝ result of the previous iteration, followed by...
        +/              ⍝ the sum of
          ⍺↑            ⍝ the first X of
            ⌽          ⍝ the reverse of
             ⍵         ⍝ the previous iteration
 ⍵↑                    ⍝ take the first X numbers of the result

テストケース:

      ↑⍕¨ {⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1} /¨ (3 8)(7 13)(1 20)(30 4)(5 11)
 1 1 1 3 5 9 17 31                       
 1 1 1 1 1 1 1 7 13 25 49 97 193         
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
 1 1 1 1                                 
 1 1 1 1 1 5 9 17 33 65 129              

2

Python 3、59

FryAmTheEggmanのおかげで20バイト節約されました。

素晴らしい解決策ではありませんが、今のところは機能します。

def r(n,x):f=[1]*n;exec('f+=[sum(f[-n:])];'*x);return f[:x]

また、テストケースは次のとおりです。

assert r(3, 8) == [1, 1, 1, 3, 5, 9, 17, 31]
assert r(7, 13) == [1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193]
assert r(30, 4) == [1, 1, 1, 1]

2

Java、82 + 58 = 140バイト

i番目の n-ボナッチ数(82バイト)を見つける関数:

int f(int i,int n){if(i<=n)return 1;int s=0,q=0;while(q++<n)s+=f(i-q,n);return s;}

最初のk n-ボナッチ数(58バイト)を出力する関数:

(k,n)->{for(int i=0;i<k;i++){System.out.println(f(i,n));}}



1

ジュリア、78バイト

f(n,x)=(z=ones(Int,n);while endof(z)<x push!(z,sum(z[end-n+1:end]))end;z[1:x])

これは、2つの整数を受け入れ、整数配列を返す関数です。アプローチは簡単です:lengthの配列を生成し、配列がlengthになるまでn前のn要素の合計を追加して配列を拡大しxます。

ゴルフをしていない:

function f(n, x)
    z = ones(Int, n)
    while endof(z) < x
        push!(z, sum(z[end-n+1:end]))
    end
    return z[1:x]
end

1

MATL、22 26バイト

1tiXIX"i:XK"tPI:)sh]K)

これは、言語/コンパイラの現在のリリース(10.2.1)を使用します。

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

いくつかの余分なバイト:-( G関数のバグのため(入力を貼り付け、次のリリースで修正されました)

説明

1tiXIX"      % input N. Copy to clipboard I. Build row array of N ones
i:XK         % input X. Build row array [1,2,...X]. Copy to clipboard I
"            % for loop: repeat X times. Consumes array [1,2,...X]
  t          % duplicate (initially array of N ones)
  PI:)       % flip array and take first N elements
  sh         % compute sum and append to array
]            % end
K)           % take the first X elements of array. Implicitly display

1

Perl 6、38バイト

->\N,\X{({@_[*-N..*].sum||1}...*)[^X]} # 38 bytes
-> \N, \X {
  (

    {

      @_[
        *-N .. * # previous N values
      ].sum      # added together

      ||     # if that produces 0 or an error
      1      # return 1

    } ... *  # produce an infinite list of such values

  )[^X]      # return the first X values produced
}

使用法:

# give it a lexical name
my &n-bonacci = >\N,\X{…}

for ( (3,8), (7,13), (1,20), (30,4), (5,11), ) {
  say n-bonacci |@_
}
(1 1 1 3 5 9 17 31)
(1 1 1 1 1 1 1 7 13 25 49 97 193)
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
(1 1 1 1)
(1 1 1 1 1 5 9 17 33 65 129)

1

C、132バイト

再帰的アプローチは数バイト短くなります。

k,n;f(i,s,j){for(j=s=0;j<i&j++<n;)s+=f(i-j);return i<n?1:s;}main(_,v)int**v;{for(n=atoi(v[1]);k++<atoi(v[2]);)printf("%d ",f(k-1));}

非ゴルフ

k,n; /* loop index, n */

f(i,s,j) /* recursive function */
{
    for(j=s=0;j<i && j++<n;) /* sum previous n n-bonacci values */
        s+=f(i-j);
    return i<n?1:s; /* return either sum or n, depending on what index we're at */
}

main(_,v) int **v;
{
    for(n=atoi(v[1]);k++<atoi(v[2]);) /* print out n-bonacci numbers */
        printf("%d ", f(k-1));
}

1

、9バイト

↑§¡ȯΣ↑_B1

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

始まるBase- 1の表現N(単にリストNのもの)と¡teratively和(Σ)(最後↑_Nの要素とリストに結果を追加します。最後に、このリストの最初のX番号を取得して()返します。





0

Perl 6の、52〜72の 47〜67のバイト

sub a($n,$x){EVAL("1,"x$n~"+*"x$n~"...*")[^$x]}

MONKEY-SEE-NO-EVAL次のエラーのため、モジュールが必要です。

=== SORRY!===コンパイル中のエラー-e
EVALは非常に危険な関数です!!! (MONKEY-SEE-NO-EVALを使用してオーバーライドしますが、
データにインジェクション攻撃が含まれていないことが確実な場合のみ)
-e:1

$ perl6 -MMONKEY-SEE-NO-EVAL -e'a(3,8).say;sub a($n,$x){EVAL("1,"x$n~"+*"x$n~"...*")[^$x]}'
(1 1 1 3 5 9 17 31)

厳密モードなどをオフにする方法を知っている人はいますか?
andlrc

クリスマス2015以前のPerl 6リリースを使用する場合、monkey-see-no-evalを強制しません。
バットマン


0

Jq 1.5、67バイト

def C:if length>X then.[:X]else.+=[.[-N:]|add]|C end;[range(N)|1]|C

NとXが提供する入力を想定

def N: 5;
def X: 11;

拡大

def C:                        # . is current array
    if length>X               # stop when array is as long as X
    then .[:X]                # return first X elements
    else .+=[.[-N:]|add] | C  # recursively add sum of last N elements to array
    end
;
  [range(N)|1]                # initial state
| C

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


0

J、31バイト

]{.(],[:+/[{.])^:(-@[`]`(1#~[))

ゴルフをしていない:

] {. (] , [: +/ [ {. ])^:(-@[`]`(1 #~ [))

説明

動名詞形式のpower動詞の楽しい時間:

(-@[`]`(1 #~ [)) NB. gerund pre-processing

詳細な内訳:

  • ] {. ...<right arg>作業を行うすべてのこのようなものから最初の要素を取ります...
  • <left> ^: <right>動詞適用<left>繰り返し<right>回... <right>途中動名詞でで指定されている(-@[] (1 #~ [)、すなわち、]すなわち、機能自体に渡された右の引数を。それで何<left>ですか?...
  • (] , [: +/ [ {. ])このフレーズ全体の左の引数は、最初の動名詞、つまりによって最初に変換され-@[ます。これは、この句の左引数が関数全体の左引数のであることを意味します。これは、フレーズ[ {. ]が構築中のリターンリストから最後の要素を取得するために必要です。これらは合計されます+/。そして、最終的に同じ戻りリストに追加されます:] ,
  • では、戻りリストはどのように初期化されますか?これが、3番目の前処理gerundが達成することです (1 #~ [)

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


0

Mathematica、59バイト

((f@#=1)&/@Range@#;f@n_:=Tr[f[n-#]&/@Range@#];f/@Range@#2)&

おそらくClear@f関数呼び出し間でやりたいでしょう。引数はn,x、テストケースと同様にです。



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