回答:
·LÉœÙεÅγo;P}O
置換が組み込まれているため、非常に遅い。
オンラインそれを試してみたり、最初の4つの入力を確認します。
説明:
· # Double the (implicit) input
L # Create a list in the range [1, doubled_input]
É # Check for each if they're odd (1 if truthy, 0 is falsey)
# We now have a list of n 0s and n 1s (n being the input)
œ # Get all permutations of that list
Ù # Only leave the unique permutations
ε } # Map each permutation to:
Åγ # Run-length encode the current value (short for `γ€g`)
o # Take 2 to the power for each
; # Halve each
P # Take the product of the mapped permutation
O # Sum all mapped values together (and output implicitly)
多くの例を描いてプログラミングした後、これはルークの問題と同じであることが私に思い浮かびました:
上ののチェス盤から行くにはルークのためにどのように多くの方法があるにだけ右に移動することによりまたはアップ?
基本的に、グリッドの一番上と一番下の行があります。次に、非水平線を入力する必要があります。各三角形には、2本の非水平線が必要です。側面の1つが上部の線の一部であるか下部の線の一部であるかは、ルークの問題で進む方向と長さに対応します。これはOEIS A051708です。この対応の例として、次の例を検討してください。ここで、上の行は上向きの動きに対応し、下の行は右向きの動きに対応しています。
-6バイトを@PeterTaylorに、-2バイトを@PostLeftGarfHunterに感謝します!
b 0=1
b 1=2
b n=div((10*n-6)*b(n-1)-9*(n-2)*b(n-2))n
A051708(n+1)
。だから私は最初の正しいを投稿しました答え :-P
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
2つ以上の変数を再帰するかなり直接的な実装。
このソリューションを取得する方法は次のとおりです。直接再帰式を実装するコードから始めます。
54バイト
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
を使用して flawrのルークの移動の解釈すると、a%b
ルークをから(a,b)
に(0,0)
移動するパスの数は、移動だけで座標が減少します。最初の動きは減少a
または減少しますb
、他のは同じに保たれるため、再帰式になります。
49バイト
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
私たちは中に繰り返しを避けることができるmap(a%)[0..b-1]++map(b%)[0..a-1]
二つの半分が同じであることを注意することによってa
、およびb
交換ます。補助コールはa?b
最初の動きが減少する経路をカウントしa
、そのためb?a
最初の移動が減少する場合、それらをカウントしますb
。これらは一般的に異なり、に追加されa%b
ます。
の合計はa?b
、リストの内包表記として書くこともできa?b=sum[a%i|i<-[0..b-1]]
ます。
42バイト
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
最後に、次の%
点で再帰を取り除きます。?
置き換えa%i
てa?i+i?a
再帰呼び出しで。
新しいベースケースでは、これが原因?
の出力与えるのダブルそのために?
49バイトのバージョンでは、とのことから0?0=1
、私たちは持っているでしょう0%0=0?0+0?0=2
。これによりf n=n?n
、他のユーザーが行う必要のある半分を使わずにdefine を使用できます。
a%b
は、0,1,...,a
一番上の行のノードと一番下の行のノードを使用して、パーティションの数をカウントし0,1,..,b
ます。演算子a?b
は、a
最下位ノードb
が既に使用されている場合に最上位ノードから新しい行を追加できる方法の数をカウントします。(a
すべてのノードに接続できますが、それらのノード[0,1,...,b-1]
ごとに再帰する必要があります。)
?
、私はしません42バイトの1の、そしてどのような特に好奇心旺盛なのは、それは対称ではないということです。
map...
ではリスト内包表記に置き換えることができ、2番目のステップでは次の定義をプラグインするだけです%
。a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
{2,*e!{e`0f=:(1b2\#}%1b}
これは、バブラーのアプローチを使用して、n
0とn
1のしています。
{ e# Define a block
2,* e# Given input n, create an array of n 0s and n 1s
e! e# Generate all permutations of that array
{ e# Map:
e` e# Run-length encode
0f=:( e# Extract just the lengths and decrement them
1b e# Sum
2\# e# Raise 2 to the power of that sum
}%
1b e# Sum the mapped values
}
{_1aa{_2$,f{j}@@,f{j}+1b}2j}
三角形にはすべて、1つの水平エッジと、水平線をリンクする2つのエッジがあります。2つのx座標のタプルで非水平エッジにラベルを付け、辞書式に並べ替えます。次に、最初のエッジは(0,0)
で、最後のエッジは(n,n)
で、2つの連続したエッジは2つの位置の1つで正確に異なります。これにより、単純な再帰が作成されます。これは、メモした再帰演算子を使用して実装しましたj
。
{ e# Define a block
_ e# Duplicate the argument to get n n
1aa e# Base case for recursion: 0 0 => 1
{ e# Recursive body taking args a b
_2$,f{j} e# Recurse on 0 b up to a-1 b
@@,f{j} e# Recurse on a 0 up to a b-1
+1b e# Combine and sum
}2j e# Memoised recursion with 2 args
}
fj
CJamでサポートを受けたいと思ったのはこれが初めてではありません。ここでは、スコアも24バイトになります。おそらく、パッチを作成する必要があります...
Ø.xŒ!QŒɠ€’§2*S
ピーターテイラーのコメントに基づく-1バイト。
結果の数式ではなく、flawrのイラストを直接使用します。
Ø.xŒ!QŒɠ€’§2*S Main link (monad). Input: positive integer N.
Ø.x Make an array containing N zeros and ones
Œ!Q All unique permutations
Œɠ€ Run-length encode on each permutation
’§ Decrement and sum each
2*S Raise to power of 2 and sum
四角いグリッド上のすべての可能なルートを取ります。ルークとしてLユニットを一方向に動かす方法の数は2**(L-1)
です。これをすべてのルートに適用し、各ルートを横断する方法の数を合計します。
F⊕θ«≔⟦⟧ηF⊕θ⊞ηΣ∨⁺ηEυ§λκ¹⊞υη»I⊟⊟υ
オンラインでお試しください!説明:反対側の長さの台形m,n
をすべて整数オフセットにある三角形に分割する方法の数を計算することによって機能します。これは、単にn
問題のサイズの長方形の一般的なケースです。パーティションの数は、すべての辺m,0..n-1
およびのパーティション数の合計として再帰的に与えられn,0..m-1
ます。これは、ルークの一般化された問題、OEIS A035002と同等です。このコードは、以前に計算された値0,0
をn,n
使用するまでの作業パーティションの数を単純に計算します。
F⊕θ«
行をループします0..n
。
≔⟦⟧η
空の行から始めます。
F⊕θ
行の列をループします0..n
。
⊞ηΣ∨⁺ηEυ§λκ¹
これまでの行と現在の列の前の行の値を取得し、合計を現在の行に追加します。ただし、値がまったくない場合1
は、合計の代わりに置き換えます。
⊞υη»
これまでに、完成した行を行のリストに追加します。
I⊟⊟υ
計算された最終値を出力します。
によって発見された再帰式を使用します Peter Taylorとflawrがます。
f=n=>n<2?n+1:(10-6/n)*f(--n)+9/~n*f(--n)*n