配列をシャッフル解除できますか?


15

バックグラウンド

非常に熟練したカードハンドラーは、デッキを完全に半分にカットしてから、カードを完全にインターリーブする技術を使用できます。並べ替えられたデッキから始めて、この手法を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つを取得できます。
キントピア


1
最初の要素は常に最初の位置にとどまりませんか?
ユーメル

回答:


3

Pyth- 26 25 24バイト

累積リデュースを使用してファロシャッフルを複数回適用し、すべての結果を保持します。次に、それをマップし、ソート時に不変であるかどうかを確認し、合計を使用してtrueかどうかを確認します。正またはゼロを返します。

smSI-db.usC_c2NQsC.tc2Qb

テストスイート


3

MATL、41バイト

itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx

出力は1または0です。

説明

i              % get input array
tn2\           % is size odd?
?              % if that's the case
  YNh          % concat NaN at the end
]              % end if
tn             % get size of input array
t1+:           % vector 1:n+1, where n is input size, so loop will be entered even with []
"              % for loop
  x[]2e!PY)    % delete result from previous iteration and do the shuffling
  ttZN~)       % remove NaN, if there's any
  tS=A         % check if array is sorted
  t.           % copy the result. If true, break loop
]              % end for
wx             % remove unwanted intermediate result

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.