ナラヤナ-ジデック-カペル数


17

入力nを指定して、n番目のNarayana-Zidek-Capell数を生成します。少ないバイトが勝ちます。

f(1)= 1、f(n)は前のfloor(n / 2)ナラヤナ-ジデック-カペル項の合計です。

テストケース:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
プログラミングパズルとコードゴルフへようこそ!これは素晴らしい最初の挑戦です。最終的にはあなた次第ですが、通常、回答を受け入れるまで少なくとも1週間待つことをお勧めします。早い段階で受け入れられた回答があると、他のユーザーにチャレンジが多かれ少なかれ終了したというシグナルを送信する可能性があり、参加を思いとどまらせます。
アレックスA.

回答:


6

ゼリー、11 10バイト

HĊrµṖ߀Sȯ1

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

n引数として取り、結果を出力します。

説明

H              divide input by 2
 Ċ             round up to get first n to recurse
  r            inclusive range from that to n
   µ           (chain separator)
    Ṗ          remove n itself from the range
     ߀        call self recursively on each value in the range
       S       sum results
        ȯ1     if sum was zero, return one

7

ルビー、34 32バイト

これは、Narayana-Zidek-Cappell番号に OEISページの式を使用しています

編集: feersumとNeilのおかげで、演算子の優先順位を使用して括弧を削除しました。

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}

確かに括弧は必要ありませんx%2か?
-feersum

まあ、x%2*少なくとも置くなら。
ニール

@feersumとニールはあなたの両方をありがとう
Sherlock9

以前の質問の編集は、式がx<2?...であることを示唆していました。
ニール

6

パイソン2、48の 42 38 36バイト

OEISページから取得したアルゴリズム。n<3に変更しn<4ても効果はありません。n番目の数を返しますn。ここで、は正の整数です。

a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)

オンラインで試す


5

05AB1E、16バイト

05AB1Eとしての反復ソリューションには機能がありません。

X¸sGDN>;ï£Os‚˜}¬

X¸               # initialize a list with 1
  sG          }  # input-1 number of times do
    D            # duplicate current list
     N>;ï£       # take n/2 elements from the list
          O      # sum those elements
           s‚˜   # add at the start of the list
               ¬ # get the first element and implicitly print

オンラインで試す


5

C、38

OEISアルゴリズムの翻訳。この辺りには十分なCコードがありません!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}

どのように機能しn<3?:(...)ますか?
LegionMammal978

2
これは、中間式が欠落している場合に条件自体に評価されるGCC拡張機能(clangでも機能するようです)です。詳細については、関連するGCCページこのSOの質問を参照してください。
owacoder

4

Python 3、67バイト

def f(n):
 x=1,
 for i in range(n):x+=sum(x[-i//2:]),
 print(x[-1])

引数を介して入力を受け取り、STDOUTに出力する関数。これは、定義の直接の実装です。

使い方

def f(n):               Function with input target term index n
 x=1,                   Initialise term list x as tuple (1)
 for i in range(n):...  For all term indices in [0,n-1]...
 x[-i//2:]              ..yield the previous floor(i/2) terms...
 x+=sum(...)            ...and append their sum to x
 print(x[-1])           Print the last term in x, which is the nth term

Ideoneでお試しください



3

Mathematica、38バイト

If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&

匿名関数。入力としてTakeを受け取り、出力として𝑓(𝑛)を返します。Rubyソリューションに基づいています。


組み込みはありませんか?
非常識な

@Insaneいいえ、組み込み機能はありません。
LegionMammal978

ただ素晴らしい!
非常識な

2

Haskell、34バイト

f 1=1
f n=sum$f<$>[n-div n 2..n-1]

使用例:f 14-> 1308

定義の直接実装。


2

Java、63バイト

int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}

1

Go、63バイト

func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}

Cからの直接的な回答


0

PHP、81バイト

これは再帰のない完全なプログラムです。再帰関数は52バイトで定義できます(それを打つことは可能かもしれません)が、それはsherlock9の答えのかなり退屈なポートです(そしてf(100)以上を要求するとエラーになります)ので、私はこれを立てていますより長く、より興味深いバージョン

<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;

多くの(O [n])通知を引き起こしますが、それで問題ありません。


O(n)通知?え?

通知は、実行を停止しない重要ではないエラータイプであり、運用環境では一般に沈黙します。宣言されていない変数の値または配列内の未定義のオフセットを取得しようとすると、通知が表示されます。このプログラムは、O [n]の未定義のオフセット(およびいくつかの未宣言の変数)の値を取得しようとするため、O [n]の通知を取得します。
user55641

0

R、55バイト

x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]

ループを変更10し、ユーザーが望むインデックスを取得します。forx[9]


54バイト長の再帰バージョンをf=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
次に示し

0

JavaScript、 54 52

f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))

Cの回答に基づきます。

  • parseInt代わりに使用して2バイトを保存しましたMath.floor

0

メープル、46 44バイト

`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)))

使用法:

> f:=n->`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)));
> seq( f(i), i = 1..10 );
  1, 1, 1, 2, 3, 6, 11, 22, 42, 84

0

R、63バイト

f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}

a=02つの中かっこが保存されるため、デフォルトとして追加されます。関数は必要に応じて再帰的に自分自身を呼び出します。

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