それは素晴らしいShuffle™️でしたか


8

この質問によると、Superb Shuffle™️は、次の一連のルールに従うカード(ジョーカーを含む)の完全なデッキとして定義されています。

  • 同じスーツの2枚のカード(ジョーカーを除く)は隣接していません。
  • 同じ値に隣接するカード(ジョーカーを除く)はありません。
  • カード(ジョーカーを除く)は、隣接する値のいずれかに隣接していません(A、2、3、4、5、6、7、8、9、10、J、Q、K、 A.エースは2またはキングのいずれにも隣接できないことに注意してください)。
  • ジョーカーは任意の位置に配置できます。

カードは、値(A、2、3、4、5、6、7、8、9、10、J、Q、K)とそれに続くスート(C、D、H、S)で表されます。たとえば、「AS」はスペードのエースです。ジョーカーはJという1文字で表されます。

  • カードの配列がSuperb Shuffle™️かどうかを示すコードを記述します。
  • 好きな言語を使用してください。
  • 最小バイト数でこれを試みます。

テストケース:

1:これはSuperb™️です

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

2:これはすべてソートされています

[
  "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", 
  "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", 
  "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", 
  "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", 
  "J", "J"
]

# false

3:一緒にエース

[
  "AC", "AS", "AD", "AH", "5D", "9H", "KC", "2D", "6H", "10C", "QS",
  "9S", "KD", "4C", "6S", "10D", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", "3H", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "5C", "7S", "JD", "2C", "4S", "8D", "7C", "QH"
]

# false

4:クレイジー8

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "AH",
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "QD", "3C", "5S", "10S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "5C", "7S", "JD", "2C", "4S","QH", "8D", "8S", "8C", "8H"
]

# false

5:すばらしい

[
  "AS", "6H", "9S", "AC", "4D", "9C", "QD", "2S", "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# true

6:エース2

[
  "AS", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# false

7:キングによるエース

[
  "AS", "KH", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", 
  "2C", "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", 
  "4S", "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C",  
  "8D", "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", 
  "QH", "2D", "7C", "10D", "J", "5H", "8S", "3D", "8C", "JD"
]

# false

8:ジョーカーを一緒に

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S",
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "J", "4D",
  "8H", "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C",
  "5S", "9D", "KH", "2S", "6D", "10H", "3D", "7H", "JC", "KS", "4H",
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

9:ジョーカーで区切られた隣接するスーツ/値

[
  "AS", "6H", "9S", "AC", "4D", "J", "4H", "2S", "7H", "10S", "2C",
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S",
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D",
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "QD", "7S", "QH",
  "2D", "7C", "10D", "8C", "5H", "8S", "KH", "3D", "9C", "JD"
]

# true 

2
いずれかのカードが欠落している場合、それはすばらしいシャッフルではありません」-入力検証を開始します!
Shaggy

私は個人的に@ArnauldとShaggyに同意します。シャッフルされた54枚のカードデッキのこれら2つを検証するための課題:1.同じスーツの隣接者がいません。2.同じ値、1つ低い値、または1つ高い値の隣接値は、良い課題のようには見えません。検証する必要がある場合:ちょうど54枚のカードがあります(少なすぎず、多すぎませんか)。すべて正しい形式のカードです。奇妙なASCII入力はありませんか。空の文字列はありませんか。重複するカードはありませんか。等々私には個人的にはやり過ぎのようです。
Kevin Cruijssen

@KevinCruijssen見逃しました
AJFaraday

2
4D, J, 3DまたはなどのシーケンスJ, JSは、偽陰性の原因にもなります。
アーノールド

@Arnauld Ah、shit ..投稿しようとしていた解決策はありましたが、実際には失敗し4D, J, 3Dました..
Kevin Cruijssen

回答:


9

JavaScript(ES7)、88バイト

戻り値の真素晴らしい™用️またはアグリー™用️。

a=>a.every(r=s=([a,b,c])=>!s|!b|!((r-(r='34567891JQKA'.search(a)))**2%13<2|s==(s=c||b)))

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

どうやって?

各カードは3つの文字abcに分割されますが、その一部は未定義の場合があります。

ランクは、文字列"34567891JQKA"内のaの位置によって指定されます('2'-1を返します)。スーツは、代わりにcをテストする必要がある10以外のすべてのカードと、未定義のスーツを持つジョーカーに対してbで与えられます。

私たちは、の前のランクのトラックに保つRとの前のスーツ

rew_rak2モッド13

  • 0
  • 11
  • 11441441モッド13
  • それ以外より大きい整数1

新しいスーツをsと比較して、同一の連続したスーツを検出します。

!sという表現を使用します!bは、前のカードまたは現在のカードがジョーカーであることを検出します。この場合、他のテストの結果は破棄されます。


2
Definitely Ugly™️;)
AJFaraday

4

Retina 0.8.2、68バイト

.*,(.*)
$1,$&
J\b
--
10
T
\b\w
$&$&
T`Ao`2-9TJQKA`\b.
(\w).{2,4}\1.*

オンラインでお試しください!リンクにはテストケースが含まれます。0優れている1場合は出力し、ない場合は出力します。説明:

.*,(.*)
$1,$&

最後のカードを最初にコピーして、ラップアラウンドをシミュレートします。

J\b
--

ジョーカーを2文字のプレースホルダーに置き換えます。これは、周囲のカードが互いに一致しないようにするのに十分です。

10
T

そして、10sを10に置き換えます。

\b\w
$&$&

各カードのランクを複製します。

T`Ao`2-9TJQKA`\b.

隣接ランクを計算します。

(\w).{2,4}\1.*

同じスーツまたは同じまたは隣接するランクの隣接するカードを探します。


3

Java 10、246 210 205 178170バイト

d->{var r=1>0;int p=-1,P=p,q,u;for(var c:d)r&=p<0|(u=(p-(p=(q=c.length())<2?-1:"A234567891JQK".indexOf(c.charAt(0))))%12)<-1|u>1&P!=(P=q<2?p:c.charAt(q>2?2:1));return r;}

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

説明:

d->{                   // Method with String-array parameter and boolean return-type
  var r=1>0;           //  Result-boolean, starting at true
  int p=-1,            //  Previous value, starting at -1
      P=p,             //  Previous suit, starting at -1
      q,u;             //  Temp integers
  for(var c:d)         //  Loop over the cards of the input-deck:
    r&=p<0             //   Validate whether the previous value is -1
       |(u=(p-         //   Or if the difference between the previous and current value,
          (p=          //   where the current value is:
                       //   (and replace the previous with the current value for the next
                       //   iteration at the same time)
             (q=c.length())<2?
                       //    Is it a Joker:
               -1      //     Use -1
              :        //    Else:
               "A234567891JQK".indexOf(c.charAt(0))
                       //     Use 0-12 depending on the order
        ))%12)         //   (Modulo-12 for 'A' and 'K')
              <-1|u>1  //   is more than 2
       &P!=            //   And the previous and current suits are not equal,
           (P=         //   where the current suit is:
                       //   (and replace the previous with the current suit for the next
                       //   iteration at the same time)
              q<2?     //    Is it a Joker:
               p       //     Use -1
              :        //    Else:
               c.charAt(q>2?2:1));
                       //     Use the suit-character
                       //     where the `q>2?2:1` is for cards of value 10
  return r;}           //  Return if all validations inside the loop have succeeded

3

Python 2、108バイト

lambda l:all('J'in(a,b)or(q(a[0])-q(b[0])+1)%13>2<a[-1]!=b[-1]for a,b in zip(l,l[1:]))
q='234567891JQK'.find

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


Python 3、109バイト

lambda l:all([(q(a[0])-q(b[0])+1)%13*(A!=B)>2for(*a,A),(*b,B)in zip(l,l[1:])if a>[]<b])
q='234567891JQK'.find

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

Python 3は、反復可能なアンパックでバイトを獲得しますが、異なるタイプの項目の比較をチェーンでつなぐことを拒否することでバイトを失います。開梱ニーズは両方を処理する'J''10S'、それはどちらかの最初の値または最後の値ではなく、両方を抽出することができることを意味しています。


2

Ruby、123バイト

->a{a.each_cons(2).all?{|a,b|a==?J||b==?J||(s="A234567891JQK".chars).zip(s.rotate).all?{|f|((a.chars|b.chars)-[?0]-f)[2]}}}

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

説明:

詳細にはあまり触れません。

  • すべてのペアを1つの文字に分割する
  • 「0」を削除します
  • 重複する文字を削除する
  • 隣接する値のペアを削除してみてください

治療後、3文字残っていればペアは良好です。


2

Pythonの3、130の 125バイト

Chas Brownのおかげで5バイト節約

v="A234567891JQK".find;s=lambda d:len(d)<2or("J"in d[:2]or 1<abs(v(d[0][0])-v(d[1][0]))<12and d[0][-1]!=d[1][-1])and s(d[1:])

ここに私の最初の投稿があるので、これはおそらくもう少し下に行くことができます。

説明

再帰的なラムダ; 現在のリストの最初の2枚のカードが異なるスートであり、異なるランクであり、それらのランクが1以上(ただし、Ace-Kingを考慮して12未満)異なるか、または2枚のカードの1つがジョーカーは、その場合は問題ありませんが、リストの最初の要素を消費して再帰します。


1
で置き換えることv="A234567891JQK"によりv="A234567891JQK".find、5バイトを節約します。その後、使用できますabs(v(d[0][0])-v(d[1][0])。また、PPCGへようこそ!最初の正解です。
Chas Brown

@ChasBrownああ、良いキャッチ。ありがとう!
nthistle

@nthistleブール論理の順序を切り替えると、バイトが節約されます
mbomb007


1

Ruby、119バイト

f=->s,c=20,d=?Z{a,*b=s;a ?(x=a[-1];x==?J||(e=((i="A234567891JQK".index(a[0]))-c)%13;e>1&&e<12)&&x!=d)&&f[b,i||20,x]:!p}

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

再帰バージョン。
アレイをウォークスルーし、現在のカードを最後のカードと比較します。ランクは文字列「A234567891JQK」で検索され、ジョーカーはスキップされます。それはどんな隣人も受け入れるダミーの前のカード「20Z」から始まります。


20Zカードが隣人を受け入れることができる場合、それはジョーカーのルールと同じルールではありませんか?あなたはそれをジョーカーにすることで2バイトをカットすることができましたか?
AJFaraday

実際、ジョーカーはランク20と色「J」になっているため、最初の?Zを?Jに変更できますが、バイトを節約できるかどうかはわかりません。2人のジョーカーが連続しているというエッジケースを処理すると、「J」を明示的にチェックする必要があります
crashoz

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