シャッフルですか?


19

昨日、リフルシャッフルについてこの質問をしました。昨日の質問は少し難しすぎたようですので、この質問は関連しているものの、はるかに簡単なタスクです。

今日、あなたは順列が実際にリフルシャッフルであるかどうかを判断するように求められます。リフルシャッフルの定義は、最後の質問から変更されています。

シャッフルの最初の部分は分割です。分割では、カードのデッキを2つに分割します。2つのサブセクションは連続的で、相互に排他的かつ網羅的でなければなりません。現実の世界では、パーティションをできるだけ均等にしたいと考えていますが、この課題ではこれは考慮事項ではありません。縮退している(1つのパーティションが空である)パーティションを含むすべてのパーティションは等しく考慮されます。

それらが分割された後、カードは、それらがメンバーであるパー​​ティション内で相対的な順序を維持するような方法で一緒に接続されます。たとえば、カードAがデッキのカードBの前にあり、カードABが同じパーティションにある場合、カードAが最終結果のカードBの前にある必要があります。場合はABが異なるパーティションにある、彼らは最終的な結果に関係なく、自分の順番の、任意の順序にすることができます。

各リフルシャッフルは、カードの元のデッキの順列として見ることができます。たとえば、順列

1,2,3 -> 1,3,2

リフルシャッフルです。このようにデッキを分割すると

1, 2 | 3

のすべてのカード1,3,2は、パーティション内の他のすべてのカードと同じ相対的な順序を持っていることがわかります。 2まだ後1です。

一方、次の順列はリフルシャッフルではありません

1,2,3 -> 3,2,1

これは、2つの(重要な)パーティションすべてに対して

1, 2 | 3
1 | 2, 3 

相対的な順序を維持しないカードのペアがあります。最初のパーティション12順序を変更し、2番目のパーティション23順序を変更します。

仕事

合理的な方法で順列が与えられた場合、それが有効なリフルシャッフルを表すかどうかを判断します。「はい、これはリフルシャッフルです」と「いいえ、これはリフルシャッフルではありません」の2つの異なる定数値を出力する必要があります。

これはため、回答はバイト単位でスコアリングされ、バイト数が少ない方が優れています。

テストケース

1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False

1
出力に一貫性はないが、私たちの言語では真実/虚偽である可能性がありますか?(Pythonでは、整数のうち0だけが偽である)のように0、偽であるが[1, +∞)、真実のために任意の整数がありますか?
ミスターXcoder

1
@ Mr.Xcoder私は真実/偽の値が好きではありません。それらをうまく定義するのはかなり難しいからです。回答は現在のルールに準拠する必要があります。
小麦ウィザード

推奨されるテストケース:[3,1,4,2,5]
Ørjanヨハンセン

9
このことについて申し訳ありませんが、: [2,3,6,1,4,5]
Ørjanヨハンセン

1
入力としてでは[0, ..., n-1]なくの順列を使用でき[1, ..., n]ますか?
デニス

回答:


8

JavaScript(ES6)、47バイト

入力を整数の配列として受け取ります。ブール値を返します。

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

テストケース

どうやって?

入力配列Aは、連続する整数の最大2つの異なるインターレースシーケンスで構成される場合、有効なリフルシャッフルです。

チャレンジルールは、[1 ... N]の順列が与えられることを指定します。したがって、これらのシーケンスのソートされた和集合が実際にそのような範囲になることを追加で確認する必要はありません。

A [0]に初期化されたカウンターxと、最初は未定義のカウンターyを使用します。

各エントリのためにZA、第2の1から始まります。

  • zx + 1またはy + 1に等しいかどうかを確認します。はいの場合、対応するカウンターをインクリメントします。
  • それ以外:yがまだ定義されていない場合、zに初期化します。
  • そうでない場合:テストを失敗させます。


5

Haskell、43バイト

sOPの例のように整数のリストを取り、を返しますBool

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

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

使い方

  • リスト内包表記は、各要素xp順番に試し、それがシャッフルの2番目のパーティションの最初の要素になり得るかどうかをチェックします。次に、チェックのいずれかがあった場合にor戻ります。TrueTrue
  • 内包表記では、これを(with filterpをより小さい要素とより大きい要素(または等しい要素)に分割しx、連結し、結果のリストが[1..length p]であるかどうか、つまり要素を順番にチェックします。
  • [1..length p]結果が無限リストよりも厳密に小さいかどうかを調べることにより、結果のリストが存在するかどうかのチェックが行われ[1..] == [1,2,3,etc.]ます。

5

ゼリー13 6バイト

ỤIṢḊRẠ

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

代替バージョン、ポストデートチャレンジ、5バイト

Ụ>ƝSỊ

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

使い方

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

Brachylog、9バイト

o~cĊ⟨⊆⊇⟩?

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

入力がリフルシャッフルを表す場合、述語は成功し、そうでない場合は失敗します。つまり、述語がプログラム全体として実行される場合、成功が印刷されtrue.、失敗が印刷されますfalse.。入力は、あらゆる種類のアイテムのリストとして取得され、ソートされたそれ自体の順列を表すものとして解釈します。

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

⊆ᵐ4バイトの「サンドイッチ」構造の代わりに機能する何かがあるという気がし⟨⊆⊇⟩ます。


1
あなたはPPCGの回答でサンドイッチを使用した最初の人だと思います(そしてそれは美しい対称的なものです:))
15:20に


2

ルビー、35バイト

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

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

どうやって?

  • l & [*1..a] | l交差点その後、労働組合を適用します。最初の要素を取得lことをされ<=aた後、残りの要素を追加するl順序を変更せずに。aが探している数である場合、この操作はsortと同じlです。


2

Pyth、5バイト

}SQy+

テストスイート

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

二重化された入力リストに、自身のソートされたバージョンがサブシーケンスとして含まれているかどうかを確認します。

エリックのおかげでOutgolferは、1バイトのために暗黙の入力をより良く活用すること+QQではなく*2Q


5バイト:}SQy+。に展開され}SQy+QQます。
エリックアウトゴルファー

@EriktheOutgolferいいね、ありがとう。
xnor

1

Pyth、9バイト

!t-.+xLQS

テストスイート。

isaacgのおかげで3バイト節約されました

Pyth、14バイト

}SQm.nS.Tcd2./

ここで試してみてください!またはすべてのテストケースを検証します。

TrueそれぞれFalse、riffle-shuffleおよびnon-riffle-shuffleの出力。

どうやって?

} SQm.nS.Tcd2./〜完全なプログラム。STDINから入力を読み取り、STDOUTに出力します。

            ./〜入力のすべての分割を互いに素な部分文字列(パーティション)に戻します。
   m〜変数dを使用して上記をマッピングします。
         cd2〜dを2要素リストに切り分けます。
       .T〜欠席を無視した正当な転置。
      S〜ソート(辞書編集)。
    .n〜ディープフラット化。
}〜上記に含まれているかどうかを確認します...
 SQ〜ソートされた入力。

さらに、さらに2バイトで<#0置き換えることができ-ます。
isaacg

@isaacgそうそうfacepalmありがとう。編集済み。編集済み。
氏Xcoder



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.