道路はいくつの方法で川を渡れますか?


13

まっすぐな川と、橋をn回川を渡る道路を想像してください。道路はそれ自体でループせず、無限に長くなります。この道路は、曲がりくねった道と見なされます。オープン蛇行は、それ自体と交差しないと線と交差する両端に無限に延び開曲線であるN回。

有効な蛇行は、それが訪れる交差点の順序によって完全に記述される場合があります。

蛇行する可能性があるn の交差点を持つ交差点の明確なパターンの数は、n番目の平均数です。たとえば、n = 4

このシーケンスの最初の数は次のとおりです。

1, 1, 1, 2, 3, 8, 14, 42, 81, 262, 538, 1828, 3926, 13820, 30694, 110954...

これは、OEISシーケンスA005316です。

チャレンジ

入力として正の整数nを取り、n番目の平均値を出力するプログラム/関数を作成します。

仕様書

  • 標準のI / Oルールが適用されます。
  • 標準的な抜け穴禁止されています。
  • ソリューションには0インデックスまたは1インデックスのいずれかを指定できますが、どちらを指定してください。
  • この課題は、すべての言語で最短のアプローチを見つけることではなく、各言語で最短のアプローチを見つけることです
  • あなたのコードがされるバイト数で得点特に指定がない限り、通常はエンコーディングUTF-8で、。
  • このシーケンスを計算する組み込み関数は許可されますが、組み込みに依存しないソリューションを含めることをお勧めします。
  • 「実用的な」言語であっても説明が奨励されます。

テストケース

これらは0インデックスです。言語がデフォルトでできない場合、これほど大きな数字を処理する必要はないことに注意してください。

Input      Output

1          1
2          1
11         1828
14         30694
21         73424650
24         1649008456
31         5969806669034

いくつかのより良い形式で:

1 2 11 14 21 24 31
1, 2, 11, 14, 21, 24, 31

1
蛇行を閉曲線として定義しますが、OEISシーケンスは開曲線による蛇行用です。代わりにA005315を意味しましたか?
木ではない

7
これはプロジェクトオイラーレベルです
...-J42161217

1
@Notatreeああ、その日の私の大混乱があります...それを探していました。修正します、私に知らせてくれてありがとう!
完全に人間の


1
もう1つ言い難い(申し訳ありません…):開いた曲線は終点を持つことができますが、開いた蛇行は両端で無限に伸びる必要があると思います。(エンドポイントが許可されている場合は、平均値が大きくなるような曲線を作成できます。)
ツリーではない

回答:


11

Pythonの3208の 188 187 184 180 177 171バイト

lambda n:sum(all(i-j&1or(x<a<y)==(x<b<y)for(i,(a,b)),(j,(x,y))in d(enumerate(map(sorted,zip((0,)+p,p+(n,)))),2))for p in d(range(n)))
from itertools import*;d=permutations

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

1インデックス(以前に0 -インデックス付きだったが、1-インデックスが原因蛇行の行動に関するラッキー癖にバイトを保存)。

説明

これはJenny_mathyが投稿したリンクと同じかもしれませんが、私は論文を読んでいないので、これは私のメソッドの背後にあるロジックです。

結果を視覚化するために、OEISで提供されている次の図を使用します。

ここに画像の説明を入力してください

有効な各蛇行は、それが訪れる交差点の順序によって完全に記述される場合があります。これは画像で簡単に観察できます。エントリセグメントは常に同じ側にあります(そうでない場合、番号は2倍になります)。入口と出口の両方のセグメントがそれぞれの無限大に向かう傾向を表すには、単にすべての順序に両側のポイントを追加します。つまり、順序(2, 1, 0)はになり(-1, 2, 1, 0, 3)ます。

これを念頭に置いて、タスクは、順序の数、またはからまでの範囲の順列を見つけるnことです。交差点は、接続セグメントが同じ側にあるポイントのペア間の問題にすぎません。セグメントが辺を共有する順列内の連続する2組の点について、それらが交差するかどうかは、1組の点のうちの1つだけが他の組の2つの要素の間にあるかどうかに相当します。そのため、同じ側のセグメントを持つ別のペアに含まれる1つのポイントを持つペアがないかどうかによって、順序が有効かどうかを判断できます。

最後に、各順列の有効性を決定すると、関数の出力は有効であることが判明した順列の数になります。


1
コンビナトリクスのクラスでこれをすでに行っていますか?それとも、FGITWが非常に難しいだけでしたか?
魔法のタコUr

2
@MagicOctopusUrn正直なところ、私は約2時間これに頭をぶつけていました。
-notjagan

質問であなたの説明の一部を使ってもいいですか?「私の現在の説明は...ではありません...素晴らしいです。
完全に人間

1
@totallyhuman有用と思われるものなら何でも自由に使用してください。ただし、特に私の方法に固有のものが多いので、それほど多くないと思います。
-notjagan

5

Haskell、199バイト

1!x=x
-1!(-1:x)=1:x
n!(i:x)=i:(n-i)!x
0#([],[])=1
0#_=0
n#(a,b)=sum$((n-1)#)<$>(-1:a,-1:b):[(a,-i:b)|i:a<-[a]]++[(-j:a,b)|j:b<-[b]]++[(j!a,i!b)|i:a<-[a],j:b<-[b],i+j>=0]
f n=n#([],[-1,1])+n#([1],[1])

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

Iwan Jensenのアイデアの拡張に基づいて、1999年の平面蛇行の列挙、開いた蛇行の場合。これは、TIOで約20秒でn = 1、…、16まで実行されます。



@PeterTaylorしなかった。同じ論文の新しいバージョンのように見え、オープンな蛇行を扱うための戦略で更新され、おそらく私の戦略よりも説明しやすいかもしれませんが、コードにはもっと多くの特別なケースが必要です。
アンダースカセオルグ

0

APL(Dyalog Classic)127 115バイト

⊃⊃⌽{↓⍉(⊃,/c),∘(+/)⌸(≢¨c←{1↓¨⍳¨⍨0,¨((×2↑¯1⌽⍵)/¯1 1⌽¨⊂⍵),(⊂∊#⍵#),(××/m,≠/m)/⊂1↓¯1↓(⊢-⍵×~)⍵∊m2↑¯1⌽⍵}¨⊃⍵)/⊃⌽⍵}⍣⎕⌽1,⊂⍳2

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


これはどのように作動しますか?
リトシアスト

@lirtosiast基本的にはこれですが、エンコーディングループは0/1の代わりに整数IDのマッチングで終了します
ngn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.