バックグラウンド
非常に熟練したカードハンドラーは、デッキを完全に半分にカットしてから、カードを完全にインターリーブする技術を使用できます。並べ替えられたデッキから始めて、この手法を52回連続して完璧に実行すると、デッキは並べ替えられた順序に復元されます。あなたの挑戦は、カードのデッキに整数配列を取り、ファロシャッフルのみを使用してソートできるかどうかを判断することです。
定義
数学的には、ファロシャッフルは、任意の正の整数nに対する2 n個の要素の順列であり、位置i(1からインデックス付け)の要素を位置2 i(mod 2 n +1)に置き換えます。また、奇数長のリストを処理できるようにしたいので、その場合、リストの最後に1つの要素を追加し(便利な場合はジョーカー)、上記のようにFaroは新しいリストをシャッフルしますが、無視しますリストの順序をチェックするときに追加されたダミー要素。
ゴール
整数のリストを取得し、いくつかのファロシャッフルによりそのリストが非降順でソートされる場合(その数がゼロであっても、小さなリストが真実を示す必要がある場合)、真実を返すか出力するプログラムまたは関数を記述します。それ以外の場合は、偽物を返すか出力します。
例
[1,1,2,3,5,8,13,21] => True
[5,1,8,1,13,2,21,3] => True
[9,36,5,34,2,10,1] => True
[1,0] => True
[0] => True
[] => True
[3,2,1] => True
[3,1,2] => False
[9,8,7,6,5,4,3,2,1,0] => True
[9,8,7,6,5,4,3,2,0,1] => False
[3,1,4,1,5,9,2,6,9] => False
[-1,-1,-1,-2] => True
得点
これはコードゴルフなので、バイト単位での最短ソースが優先されます。
他のカードハンドラーとの混乱を避けるために、2種類のファロシャッフルがあることに注意してください。中・シャッフルとアウトシャッフル。ここで説明する方法は、シャッフルです。興味深いことに、デッキを元の順序に戻すのに8回のシャッフルが必要です。詳細
—
BrainSteel
これは、「N + 1回シャッフルし、途中のリストがソートされているかどうかを確認する」だけではありませんか?
—
リルトシアスト
実際にはn回で十分です。2n回実行するとすべての可能な順列が見つかることが保証されますが、最初のnで昇順または降順の少なくとも1つを取得できます。
—
キントピア
最初の要素は常に最初の位置にとどまりませんか?
—
ユーメル