このコンテストはまだ開催されていないようです。
タスクは簡単です。n
偶数であるフィボナッチ数列の最初の数を追加し、結果を出力します。
これはOEIS A099919によって与えられますが、シーケンスはからではfib(1) = 0
なく、1ずつシフトされfib(1) = 1
ます。
これはコードゴルフです。最も少ないバイト数が優先されます。
例
n sum
1 0
2 2
3 10
4 44
5 188
6 798
7 3382
8 14328
9 60696
このコンテストはまだ開催されていないようです。
タスクは簡単です。n
偶数であるフィボナッチ数列の最初の数を追加し、結果を出力します。
これはOEIS A099919によって与えられますが、シーケンスはからではfib(1) = 0
なく、1ずつシフトされfib(1) = 1
ます。
これはコードゴルフです。最も少ないバイト数が優先されます。
n sum
1 0
2 2
3 10
4 44
5 188
6 798
7 3382
8 14328
9 60696
回答:
@ETHProductionsのおかげで1バイト、@ Adnanのおかげでさらに2バイト節約されました!
zc»+U
これは、MATLの回答と同じ繰り返し式を使用します。
U
、コード内でがに置き換えられていると書かれていますが00
、これでバイトを節約できますか?
4*
てz
と2+
して»
:)
r3*♂FΣ
説明:
3番目ごとのフィボナッチ数(から始まるF_0 = 0
)は偶数です。したがって、最初のn
偶数フィボナッチ数はのF_{i*3}
にi
なり[0, n)
ます。
r3*♂FΣ
r [0, n)
3* multiply each element by 3
♂F retrieve the corresponding element in the Fibonacci sequence
Σ sum
f=x=>x>1&&4*f(x-1)+f(x-2)+2
救助への回帰!これは、OEISページのいずれかの式を使用します。
f(n <1)= 0、f(n)= 4 * a(n + 1)+ a(n)+2
(ただし、チャレンジによって1つシフトされるため、1つシフトされます)
{[+] grep(*%%2,(1,&[+]...*))[^($_-1)]}
{[+] grep(*%%2,(0,1,*+*...*))[^$_]}
{[+] (0,1,*+*...*)[3,6...^$_*3]}
{ # bare block lambda with implicit parameter 「$_」
[+] # reduce with 「&infix:<+>」
( 0, 1, * + * ... * )\ # fibonacci sequence with leading 0
[ 3, 6 ...^ $_ * 3 ] # every 3rd value up to
# and excluding the value indexed by
# the input times 3
}
@(n)filter(2,'FAD'-69,(1:n)>1)(n)
この無名関数は、差分方程式a(n) = 4*a(n-1)+a(n-2)+2
を再帰フィルターとして実装します。
Y = filter(B,A,X)
ベクター内のデータをフィルタリングX
ベクトルによって記述されるフィルタとA
し、B
フィルタリングされたデータを作成しますY
。このフィルターは、標準差分方程式の「直接形式II転置」実装です。
a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
私たちの場合A = [1 -4 -1]
、B = 2
および入力はx
出力の最後のエントリとして表示される結果と、1のベクトルでなければなりませんy
。ただし、必要に応じて出力に0
イニシャル0
が表示されるように、入力の最初の値に設定します。
'FAD'-69
は、係数ベクトルを生成するための短い方法A = [1 -4 -1]
です。(1:n)>1
入力ベクトルを生成しますx = [0 1 1 ... 1]
。
9k5v1+2/3?*1-^5v/0k2/p
または、プログラムをファイルに保存し、次のように入力して実行します
dc -f *filename*
プログラムは、stdinで負でない整数nを受け入れ、stdoutで最初のn個の偶数フィボナッチ数の合計を出力します。(フィボナッチ数列は、OPの例に従って0から始まると解釈されます。)
このプログラムは、最初のn個の偶数フィボナッチ数の合計に式(F(3n-1)-1)/ 2を使用します。ここで、Fは通常のフィボナッチ関数であり、F(0)= 0、F(1)= 1、F(n)= F(n-2)+ F(n-1)(n> = 2)
dcはスタックベースの計算機です。詳細な説明は次のとおりです。
9k # Sets the precision to 9 decimal places (which is more than sufficient).
5v # Push the square root of 5
1+ # Add 1 to the number at the top of the stack.
2/ # Divide the number at the top of the stack by 2.
この時点で、数字(1 + sqrt(5))/ 2はスタックの一番上にあります。
3 # Push 3 on top of the stack.
? # Read a number from stdin, and push it.
\* # Pop two numbers from the stack, multiply them, and push the product
1- # Subtract 1 from the number at the top of the stack.
この時点で、3n-1はスタックの最上部(nは入力)にあり、(1 + sqrt(5))/ 2は最上部から2番目です。
^ # Pop two numbers from the stack (x, then y), compute the power y^x, and push that back on the stack.
5v/ # Divide the top of the stack by sqrt(5).
この時点で、スタックの一番上の数字は(((1 + sqrt(5))/ 2)^(3n-1))/ sqrt(5)です。この数に最も近い整数はF(3n-1)です。F(3n-1)は常に奇数であることに注意してください。
0k # Change precision to 0 decimal places.
2/ # Divide the top of the stack by 2, truncating to an integer.
p # Print the top of the stack on stdout.
OOi:"t4*b+2+]x
これは、OEISの繰り返し式のいずれかを使用します。
a(n)= 4 * a(n-1)+ a(n-2)+2
入力Nの場合、コードはN回繰り返されますが、これは必要な回数より2回多くなります。これを設定することによって補償される0
、0
(代わりに0
、2
初期値として、そして最後に得られた値を削除して、以前のいずれかを表示することによって)。
OO % Push two zeros as initial values of a(n-2), a(n-1)
i % Input N
:" % Do this N times
t % Duplicate a(n-1)
4* % Multiply by 4
b+ % Bubble up a(n-2) and add to 4*a(n-1)
2+ % Add 2. Now we have 4*a(n-1)+a(n-2)+2 as a(n), on top of a(n-1)
] % End
x % Delete last value, a(n). Implicitly display the remaining value, a(n-1)
@BrainSteelのおかげで2バイト節約
OEISページの式により、はるかに短くなりました。
a(n){return--n<1?0:4*a(n)+a(n-1)+2;}
82バイト:
x,s,p,n,c;f(N){s=0;p=n=1;c=2;while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}
最初のバージョンは75バイトですが、常に前の呼び出しf
よりN
も大きい値で呼び出す場合を除き、関数は再利用できません:-)
x,s,p=1,n=1,c=2;f(N){while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}
ここで私の最初の答え。他の回答もOEISもチェックしませんでした。私はそれを短くするために適用できるいくつかのトリックがあると思います:-)
a(n){return--n<1?0:4*a(n)+a(n-1)+2;}
(36バイト)
@ChristianSieversのおかげで1バイト節約できました。
OEISに記載されている式を使用:a(n) = 4*a(n-1)+a(n-2)+2, n>1
Gary Detlefs著
a n|n>1=4*a(n-1)+a(n-2)+2|n<2=0
n<=1
整数のゴルファーの言い方はn<2
です。また、2番目の条件は最初の条件の否定である必要はありません(イディオムotherwise
は単純ですTrue
)ので、ゴルフのようなもの1<2
は通常使用されます。
Fibonacci[3Input[]-1]/2-1/2
功績XNOR。ジョンファンミンのおかげで5バイト節約されました。
(Fibonacci(3*n+2) - 1)/2
、墨を書く方が短いですか?
(* Vincenzo Librandi, Mar 15 2014 *)
、OEISのように、投稿にMathematicaコメントを含めることもできます。)
sum(DescTools::Fibonacci(3*(scan():2-1)))
scan()
:n
stdinから取得します。
scan():2-1
:から整数を生成n
する2
ことにより減少し、1
得n-1
て1
。
3*(scan():2-1)
:3つごとにフィボナッチ数が偶数であるため、3を掛けます。
DescTools::Fibonacci(3*(scan():2-1))
:これらのフィボナッチ数(すなわち、3
を介して(n-1)*3
)。
sum(DescTools::Fibonacci(3*(scan():2-1)))
:結果を合計します。
以前は、OEISの式の1つを使用してこの興味深いソリューションがありました。
a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)
desctools::fibonacci
できませんnumbers::fibonacci
か?その霧が少し短くなるからです。
bigz
、*apply
関数変換のクラスが入力するraw
ための理由...
for(${0}=1;$i++<$argv[1];$$x=${0}+${1})${$x^=1}&1?$i--:$s+=$$x;echo$s;
壊す
for(${0}=1; # init first two fibonaccis (${1}=NULL evaluates to 0 in addition)
# the loop will switch between $0 and $1 as target.
$i++<$argv[1]; # loop until $i reaches input
$$x=${0}+${1} # 3. generate next Fibonacci
)
${$x^=1} # 1. toggle index (NULL => 1 => 0 => 1 ...)
&1?$i-- # 2. if current Fibonacci is odd, undo increment
:$s+=$$x; # else add Fibonacci to sum
echo$s; # print result
数字は、PHPで完全に有効な変数名です。
しかし、リテラルについては、中括弧が必要です。すなわち${0}
、ない$0
。
36バイト、O(1)
<?=(7-$c=2+5**.5)*$c**$argv[1]/20|0;
xnor´sの回答のポート