Superb Shuffle™を実行する


15

この質問のために、カードのデッキは次のようにフォーマットされています。

[
  "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"
]

カードは常に値としてフォーマットされ、その後にスーツが続きます。例えばAS、スペードのエースです。2つのシングルJはジョーカーです。このデッキをシャッフルしたいのですが、シャッフルはSuperb™でなければなりません。

Superb Shuffle™は次のいずれかです。

  • 同じスーツの2枚のカード(ジョーカーを除く)は隣接していません。
  • 同じ値のカードに隣接するカードはありません(ジョーカーを除く)。
  • 隣接する値(A、2、3、4、5、6、7、8、9、10、J、Q、K、 A.エースは2またはキングに隣接できないことに注意してください。
  • ジョーカーは任意の位置に配置できます。
  • Superb Shuffle™の定義では、カードをシャッフルするたびに異なる順序にする必要はありません。これはそれほどすばらしいものではありませんが、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"
]

チャレンジ:

  • 素晴らしいシャッフルを実行するコードを書く
  • 任意の言語を使用します。
  • 入力は次のいずれかです。
    • 同じ順序で上記のカードのデッキ配列または他のリスト構造で。
    • 入力なし(コードはこの順序でカードのデッキを生成します)
  • 出力は、上記のSuperb Shuffle™のカードの完全なデッキでなければなりません。
  • Superb Shuffle™を最小バイト数で実行してみてください。
  • Try It Onlineなどのオンライン通訳へのリンクが推奨されますが、オプションです。

ハッピーシャッフル!



T代わりに使用できます10か?
ジョーキング

@JoKingできません。一組のカードの質問を生成するのと同じように、異なる文字列の長さは複雑さの一部です。
AJFaraday

木炭の答えのように各カードを個別に印刷することはできますか、それとも実際に配列/リストを返す必要がありますか?
ケビンクルーッセン

@KevinCruijssenそのフォーマット(値とスーツ)でカードのデッキを顕著に返す限り、それは問題ありません。
AJファラデー

回答:



34

Ruby、31バイト

->x{(0..53).map{|r|x[r*17%54]}}

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

説明:

1枚のカードを選び、次の16枚をスキップして、デッキの最後のカードに到達したときに最初のカードから始めます。17と54は相互に素数なので、すべてのカードを選択するはずです。

17番目の位置は異なるスーツであることが保証されており、値の差は少なくとも2です。13番目(または15番目)のカードは同じ値と異なるスーツであるため、他の4(または2)をスキップすると、値は正しいです。


6
他のすべての答えが使用するプロセスを見つけることによくやった;)
AJFaraday

3
* 17%54を見つけた方法を説明できますか?ただ試行錯誤するか、私が見逃している明らかな数学がありますか?
ダニエル

@Daniel 17は、数値的に隣接していない2枚の異なるカードの間に必要な最小距離です(2つのジョーカーを考慮します。たとえば、17ステップでクラブのエースからスペードの3に移動します)。54はデッキのカードの数です。
ヘリオン



4

Java 10、72 65バイト

d->{var r=d.clone();for(int i=54;i-->0;r[i*7%54]=d[i]);return r;}

@GBのRubyの回答と似ていますが、バイトを保存するために入力i*7%54配列ではなく結果配列で使用しi*17%54ます。

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

説明:

d->{              // Method with String-array as both parameter and return-type
  var r=d.clone();//  Result-String, starting as a copy of the input
  for(int i=54;i-->0;
                  //   Loop `i` in the range (54, 0]
    r[            //    Set an item in the result-array at index:
      i*7%54      //     Index `i` multiplied by 7, and then take modulo-54
     ]=d[i]);     //    To the `i`'th item in the input-Deck
  return r;}      //  Return the result-Array

残念ながら、結果には同じスーツのカードに隣接する多数のカードが含まれています。で始まりAS, 6S, JS, 3D, 8D, KD,ます。
AJファラデー

@AJFaraday TIOは7ではなく11のままでした。もう一度確認してください。おそらく他の何かを見逃したかもしれませんが、今は正しいはずです(願っています)。
ケビンCruijssen

それは今それを持っています。よくやった!
AJFaraday

3

Perl 6の21の20 18バイト

-2バイトのBrad Gilbert b2gillsに感謝

{.[$++*17%$_]xx$_}

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

GBの答えのさらに別の移植版。グローバル変数$!は関数間でリセットされませんが、出力の順序は有効であるため、値は重要ではありません。しかし、$ であるリセット。

説明:

{                } #Anonymous code block
             xx$_  #Repeat size of inputted array (54) times
 .[         ]      #Get from the inputted array, the value at index
    $++*17%$_         #The incremented variable, multiplied by 17, modded by size of the array

1
これ$は、$!またはの場合と同様に、名前のない状態変数でも同様に機能し$/ます。また、$_代わりに使用した場合は、別のバイトを保存@_する.[…]代わりに開始でき@_[…]ます。
ブラッドギルバートb2gills

2

05AB1E9 7 5 バイト

ā17*è

@GBのRubyの回答のポートなので、必ず彼に賛成してください!

-2バイトは、各カードを結果リストにラップするのではなく、改行区切り文字で印刷することにより
-2バイト@ Mr.Xcoderのおかげで

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

説明:

ā        # 1-indexed length range [1 ... length_of_input_list (54)]
 17*     #  `k`: Multiply each index by 17
    è    #  And then replace each item with the 0-indexed `k`'th card of the input-list
         #  (with automatic wrap-around)

1
ā17*è2バイト以上保存する必要があります
ミスターXcoder

2

JavaScript、27

ルビーの答えに基づいた別のもの

d=>d.map((_,i)=>d[i*17%54])

明らかな短縮で編集


2

T-SQL、31バイト

SELECT c FROM t ORDER BY i*7%54

出力の余分な列を気にしない場合は、29バイトに減らすことができます

SELECT*FROM t ORDER BY i*7%54

だから、私の出力が「すばらしい」ことを確認できます。これが生成するデッキは次のとおりです。

 J, 5H,  8S, KH, 3D,  8C, JD, 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

(新しいSQL 2017の追加を使用して生成、STRING_AGG):

SELECT STRING_AGG(c,', ')WITHIN GROUP(ORDER BY i*7%54)FROM t 

私にとって難しい部分は、選択コードではなく、入力テーブル(これは IOルールに従ってSQLに許可されています)。

SQLは本質的に順序付けられていないため(明示的なORDER BY句を含めると特定の順序のみが保証されます)、入力テーブルtのフィールドiとして元の順序を含める必要がありました 。これは、他のすべての人が使用しているのと同じ「比較的素数」のfactor / modプロセスを使用して、ソートに使用できることも意味します。私はそれが同様にうまくいくことがわかった。i*7%54i*17%54

この関連する質問に対する私の解決策に基づいて入力テーブルtを設定および設定するコマンドを次に示します。

CREATE TABLE t (i INT IDENTITY(1,1), c VARCHAR(5))

--Insert 52 suited cards
INSERT t(c)
SELECT v.value+s.a as c
FROM STRING_SPLIT('A-2-3-4-5-6-7-8-9-10-J-Q-K','-')v,
     (VALUES('S',1),('D',2),('H',3),('C',4))s(a,b)
ORDER BY s.b

--Insert Jokers
INSERT t(c) SELECT 'J'
INSERT t(c) SELECT 'J'

i、ここで追加の入力とはみなされませんか?
シャギー

@Shaggy質問は、入力デッキを元の(リストされた)順序で取得できると言っています。SQLでこれを保証する唯一の方法は、SQLテーブルに「デフォルトの順序」がないため、順序を入力の明示的な一部にすることです。したがって、私はそれを入力の必要なコンポーネントと見なします。しかし、心配しないでください。SQLはとにかく競合することはめったにありません:)
BradC

2

ゼリー 5  4 バイト

s⁴ZẎ

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

道判明 除いて皆ランダム男はそれがバイト:(セーブやっている
の功績その方法のためのGBを


私が行った方法...

ṙÐe20

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

どうやって?

1枚おきにカードを修正し、20箇所左にデッキを回転させて散りばめます(18箇所と22箇所も機能します。さらに、どちらの回転方向も奇数または偶数のカードを修正します)

ṙÐe20 - Link: list of the card strings (lists of characters)
   20 - place a literal twenty on the right
 Ðe   - apply to even indices:
ṙ     -   rotate left (by 20)

それは(Tfor 10rjbjを使用してJ):

input: AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj
  ṙ20: 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D
ṙÐe20: AS 9D 3S JD 5S KD 7S 2H 9S 4H JS 6H KS 8H 2D TH 4D QH 6D AC 8D 3C TD 5C QD 7C AH 9C 3H JC 5H KC 7H bj 9H 2S JH 4S KH 6S 2C 8S 4C TS 6C QS 8C AD TC 3D QC 5D rj 7D

2

PowerShell 3.0、 30 26バイト

$args[(0..53|%{$_*17%54})]

-4
30バイトのMazzy Oldコードのおかげ

param($d)0..53|%{$d[$_*17%54]}

GBのメソッドの別のポート。


26バイト$args[(0..53|%{$_*17%54})]
mazzy

@Mazzy入力仕様が壊れているように感じます。確かにそれらは$ argsに集められますが、実際には渡していません
。-ベスカ

引用:The input can be either:... in the same order, as *an array*$args配列です。スプラッティングを使用することができます。たとえば$a=@("AS", ..., "J"); &{} @a。それを試してみてください。:)
マジーな

さらに、文字&{とを数える必要はないようです}param($d)0..53|%{$d[$_*17%54]}ファイルに保存できます。そして、せずに、このファイルを呼び出す&{...}
mazzy

1
@mazzyええ、私は常にどのコントロールパーツを保持するのか少し不安でしたので、通常は既定でスクリプトブロックにすることにしました。ただし、今後は削除します。
ヴェスカー

1

、8バイト

Eθ§θ×¹⁷κ

オンラインでお試しください!リンクは、コードの詳細バージョンです。@GBのRuby回答の別の移植版。説明:

 θ          Input array
E           Map over elements
       κ    Current index
     ¹⁷     Literal 17
    ×       Multiply
   θ        Input array
  §         Cyclically index
            Implicitly print each result on its own line

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