1、2、4、8、16、…33?


24

チャレンジ

n'th要素または最初のn要素のいずれかを、よく知られた番号の順序で出力する関数/プログラムを作成します。

         1, 2, 4, 8, 16 ...

ああ、待って...最初の数個の数字を忘れてしまった:

1, 1, 1, 1, 2, 4, 8, 16 ...

さて、良い測定のためにいくつか追加します。

1, 1, 1, 1, 2, 4, 8, 16, 33, 69, 146, 312, 673, 1463, 3202, 7050, 15605, 34705 ...

数値は、(ゼロインデックス付き)式で与えられる一般化されたカタロニア語の数値です。

a(n+1)=a(n)+k=2n1a(k)a(n1k)

どこで

a(0)=a(1)=a(2)=a(3)=1

これはOEIS A004149です。

シーケンスのインデックスをゼロにするか、1にするかを選択できます。シーケンスはもちろん同じでなければならないので、インデックスが1つある場合は数式を書き換える必要があります。


ここで間違っている場合は修正しますが、1インデックスの数式の変更はに変更a(n-1-k)することですa(n-k)、正しいですか?
サムナー18

回答:


22

Python、51バイト

f=lambda n,k=2:n<3or k<n and f(k)*f(n-k-2)+f(n,k+1)

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

数式を少し単純化します:

a(n)=k=2n1a(k)a(n2k)

a(1)=a(0)=a(1)=a(2)=1


8
100kおめでとうございます!!
Stewie Griffin

私もこのソリューションに独自に到着したので、それへの道は少しでこぼこしていると言わなければなりません...
Erik the Outgolfer

10

Perl 6、44バイト

{1,1,1,1,{sum @_[2..*]Z*@_[@_-4...0,0]}...*}

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

値の遅延無限シーケンスを返す匿名コードブロック。これは、説明したようにシーケンスを実装します。4番目の要素から始まりリストの逆に1最後の要素を追加して、2番目の要素の後のすべての要素をzipで圧縮するショートカットです。

説明:

{                                          }  # Anonymous code block
                                       ...*   # Create an infinite sequence
 1,1,1,1,                                     # Starting with four 1s
         {                            }       # Where each new element is:
          sum                                   # The sum of
              @_[2..*]                          # The second element onwards
                      Z*                        # Zip multiplied with
                        @_[@_-4...0  ]          # The fourth last element backwards
                                   ,0           # And 1

10

05AB1E14 13 11バイト

$ƒˆ¯Âø¨¨¨PO

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

0番目のインデックスが付けられたn番目の要素を出力します。

$                # push 1 and the input
 ƒ               # repeat (input+1) times
  ˆ              #  add the top of the stack (initially 1) to the global array
   ¯             #  push the global array
    Â            #  and a reversed copy of it
     ø           #  zip the two together, giving a list of pairs
      ¨¨¨        #  drop the last 3 pairs
         P       #  take the product of each pair (or 1 if the list is empty)
          O      #  take the sum of those products
                 #  after the last iteration, this is implicitly output;
                 #  otherwise, it's added to the global array by the next iteration




6

05AB1E17 13 バイト

4Å1λ£₁λ¨Â¦¦s¦¦*O+

既存の05AB1Eの回答よりも短くはありませんが、新しい05AB1Eバージョンの再帰機能を自分の練習として試してみたいと思いました。おそらく数バイトでゴルフをすることができます。編集:そして、それは確かに、再帰のバージョンを確認することができます@Grimyある以下の05AB1Eの答えは、13 バイト

n

n£è
£

説明:


a(n)=a(n1)+k=2n1(a(k)a(n1k))

a(0)=a(1)=a(2)=a(3)=1

   λ               # Create a recursive environment,
    £              # to output the first (implicit) input amount of results after we're done
4Å1                # Start this recursive list with [1,1,1,1], thus a(0)=a(1)=a(2)=a(3)=1
                   # Within the recursive environment, do the following:
      λ            #  Push the list of values in the range [a(0),a(n)]
       ¨           #  Remove the last one to make the range [a(0),a(n-1)]
        Â          #  Bifurcate this list (short for Duplicate & Reverse copy)
         ¦¦        #  Remove the first two items of the reversed list,
                   #  so we'll have a list with the values in the range [a(n-3),a(0)]
           s       #  Swap to get the [a(0),a(n-1)] list again
            ¦¦     #  Remove the first two items of this list as well,
                   #  so we'll have a list with the values in the range [a(2),a(n-1)]
              *    #  Multiply the values at the same indices in both lists,
                   #  so we'll have a list with the values [a(n-3)*a(2),...,a(0)*a(n-1)]
               O   #  Take the sum of this list
               +  #  And add it to the a(n-1)'th value
                   # (afterwards the resulting list is output implicitly)

@Grimyの 13 バイトバージョン(まだ答えていない場合は必ず答えてください!):

1λ£λ1šÂ¨¨¨øPO

n


1λèλ1šÂ¨¨¨øPO
λλ1šÂ¨¨¨øPOa(0)=1

説明:


a(n)=k=2n1(a(k)a(n2k))

a(1)=a(0)=a(1)=a(2)=1

 λ             # Create a recursive environment,
  £            # to output the first (implicit) input amount of results after we're done
1              # Start this recursive list with 1, thus a(0)=1
               # Within the recursive environment, do the following:
   λ           #  Push the list of values in the range [a(0),a(n)]
    1š         #  Prepend 1 in front of this list
      Â        #  Bifurcate the list (short for Duplicate & Reverse copy)
       ¨¨¨     #  Remove (up to) the last three value in this reversed list
          ø    #  Create pairs with the list we bifurcated earlier
               #  (which will automatically remove any trailing items of the longer list)
           P   #  Get the product of each pair (which will result in 1 for an empty list)
            O  #  And sum the entire list
               # (afterwards the resulting list is output implicitly)

1
これは、tioで40秒でa(1200)を解くことができ、100以外の数値nで他の再帰的アプローチがタイムアウトになるのは興味深いことです...
Stewie Griffin

1
また、再帰バージョンも作成しました(公開しませんでした)。それはです最初のn個の用語の13バイト、または無限のリストは11バイト。特別なケースa(n-1)は多くのバイトを必要とし、必要ありません(たとえばxnorの式を参照)。
グリムミー

@Grimy私の答えにあなたの再帰的な解決策を加えても構いませんか(もちろんあなたの功績です)。元の回答も残します。しかし、元の式とxnorのバイト節約式の違いを見るのは素晴らしいことです。:)
ケビン・クルーッセン

1
確かに、それは大丈夫です!
グリムミー

@StewieGriffinええ、これらの再帰的な無限関数の速度にも感銘を受けました。たぶん、エリクサーの強みの1つであり、組み込みの遅延読み込みによるものです。0.65秒計算n=100されますが、遅延読み込みを無効にすると、代わりに60秒後にタイムアウトになりn=25ます。
ケビンクルーッセン





2

Japt19 17 16 バイト

n1番目の用語を1インデックスで出力します。

@Zí*Zz2)Ťx}g4Æ1

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

@Zí*Zz2)Ťx}g4Æ1     :Implicit input of integer U
@                    :Function taking an array as an argument via parameter Z
 Zí                  :  Interleave Z with
    Zz2              :  Z rotated clockwise by 180 degrees (simply reversing would be a bye shorter but would modify the original array)
   *                 :  Reduce each pair by multiplcation
       )             :  End interleave
        Å            :  Slice off the first element
         ¤           :  Slice off the first 2 elements
          x          :  Reduce by addition
           }         :End function
            g        :Pass the following as Z, push the result back to it and repeat until it has length U
             4Æ1     :Map the range [0,4) to 1s
                     :Implicit output of the last element


1

Forth(gforth)99 81バイト

: f recursive dup 4 > if 0 over 3 do over 1- i - f i f * + loop else 1 then nip ;

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

出力はn番目の用語で、入力は1インデックス付きです

編集:xnorの式に切り替えて17バイトを保存しました。1-indexedを使用して別の1バイトを保存しました

コードの説明

: f                     \ start a new word definition
  recursive             \ mark that this word will be recursive
  dup 4 >               \ duplicate the input and check if it is greater than 4
  if                    \ if it is:
    0 over              \ create an accumulator and copy n to top of stack
    3 do                \ start counted loop from 3 to n-1
      over 1- i - f     \ recursively calculate f(n-1-i)
      i f               \ recursively calculate f(i)
      * +               \ multiply results and add to accumulator
    loop                \ end the counted loop        
  else                  \ otherwise, if n < 5
    1                   \ put 1 on the stack
  then                  \ end the if block
  nip                   \ drop n from the stack
;                       \ end the word definition

1

、26バイト

F⁵⊞υ¹FN⊞υΣ✂E⮌υ×κ§υλ³→I§υ±⁴

オンラインでお試しください!リンクは、コードの詳細バージョンです。内部的に1インデックスを使用して計算しますが、0インデックスのn番目の数値を出力します。説明:

F⁵⊞υ¹

で始まりa[0] = a[1] = a[2] = a[3] = a[4] = 1ます。はい、これは1から始まりますが、追加のゼロ値があります。それはあなたのためのコードゴルフです。

FN

追加のn用語を計算します。これはやり過ぎですが、次の場合に目的の用語を見つけやすくなりn<5ます。

⊞υΣ✂E⮌υ×κ§υλ³

各用語について、次の用語を、これまでの用語の合計に、これまでの用語の逆数を掛けて、3つの用語を除外して計算します。

これは、Charcoalを2引数形式の構文解析にtrick Sliceすために使用されるノーオペレーションです。

I§υ±⁴

最後の4番目の用語を出力します。


1

Pyth、30バイト

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<J

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

n

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<JQ # Full program, last Q = input (implicitly added)
J*4]1                  # J = 4 * [1] (=[1,1,1,1])
VQ                     # for N in range(Q):
  =+J                  #  J +=
     +eJ               #   J[-1] + 
        s              #    sum(                           )
           *M          #     map(__operator_mul,          )
             .t      0 #      transpose(          , pad=0)
               ,       #       [       ,         ]
                PJ     #         J[:-1] 
                  _PJ  #                 J[1::-1]
<JQ                    # J[::Q]

<@n



1

オクターブ、73バイト

g=(1:4).^0;for(i=3:(n=input('')))g(i+2)=g(4:i+1)*g(i-(2:i-1))';end;g(end)

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

Stewie Griffinのおかげで-2バイト。繰り返しになりますが、命令型アプローチは関数型再帰アプローチよりも優先されます。その1つを以下に示します。

オクターブ、75バイト

f(f=@(a)@(n){@()sum(arrayfun(@(k)a(a)(k)*a(a)(n-2-k),2:n-1)),1}{2-(n>3)}())

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

Captchaは、これを投稿するときに私が人間であることを確認したかったのです。正直に言うと、私はよくわからない


ループアプローチを短縮する明白な方法は見当たりません...それはかなりよく見えます!また、Octaveでゼロベースのインデックスが表示されることはあまりありません:)
Stewie Griffin

@StewieGriffin再帰にはいくつかのオフセットがあるため、インデックスを0にするか1つにするか問題ではありませ。2インデックスを作成した場合、いくつかのバイトを削ることができると思いますが、それは不正行為のように思えました。とにかく、あなたの直感は正しかった-どういうわけか、これは匿名の再帰的な方法で確かに短くなった。主な利点は、に対して1を返すだけなので、4つの初期値の作成を非常にうまく処理できることだと思いますn<4
Sanchises

1
@StewieGriffinもちろん、古き良き行列の乗算。よくやった!
Sanchises


0

C / C ++70 69 67バイト

ジョナサンのおかげで-1バイト。

int a(int n){int k=2,s=0;while(++k<n)s+=a(k)*a(n+~k);return s?s:1;}

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


することa(n-1-k)ができますa(n+~k)か?
ジョナサンフレッチ

@JonathanFrech a(++k)*a(n-k)は動作する可能性が高く、からさらに2バイトをドロップしますfor。しかし、私は未定義の行動を嗅いでいます。
ポルフォソルఠ_ఠ

これはシーケンスの問題のようです。間違いなくUB。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.