スペードトリックの勝者


19

Spadesのゲームで4枚のカードトリックで勝つ人を決定するコードを記述します。少ないバイトが勝ちます。

入力は、TH QC JH 2H(Ten of Hearts、Queen of Clubs、Jack of Hearts、Two of Hearts)のように順番に再生される4枚のカードをリストする文字列です。カードは、スーツfrom CDHSと値fromの2つの文字で与えられます23456789TJQKA。入力が有効であり、カードが異なることが保証されます。

トリックの勝者には1、2、3、または4の数字を出力する必要があります。例TH QC JH 2Hでは、ハートのジャックがトリックに勝つため、3を出力する必要があります。

入力と出力は、記述されているとおりでなければなりませんが、末尾の改行はオプションです。

トリックに勝つためのスペードのルールは次のとおりです。勝ったカードは4つの最高のカードですが、いくつか注意点があります。スペードはトランプスーツであるため、スペードはスペード以外を上回ります。最初にプレイされたカードのスーツはリードスーツで、そのスーツまたはスペードのカードのみがトリックに勝つ資格があります。同じスーツのカードは、その値によって比較されます。値は、昇順で示され23456789TJQKAます。

テストケース:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2

回答:


10

Pyth、28 27 25バイト

J"KTAZ"hxcz)eo_XN+@z1JJcz

オンラインで試す:デモンストレーションまたはテストスイート(最初の4文字がテストスイートの構成要素です)

@isaacgのおかげで、2文字節約できました。

主なアイデアは、勝者の手が最大の価値を持つように、各手の文字を修正することです。

針の値23456789TJQKAはすでにほぼソートされています。私は交換する必要がありTAKTしてAZして、その結果、23456789AJQSZ

スーツの順序はCDHS、ほとんど重要ではありません。S、最も強力なスーツで、すでに最大値です。重要なのは、最初の手のスーツに2番目に強力な価値を与えることです。だから私はこのスーツをに翻訳しKます。

また、スーツはバリューよりも強力なので、すべてのハンドを逆に読み取る必要があります。

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1

私はあきらめ、よくやった:P
orlp

私は.eそれが価値があるとは思わない- o私がそれを理解すると、使用は1文字短くなります。
isaacg

@isaacgあなたの権利。おもしろいことに、.e28のソリューションの前に27のソリューションがありました。しかし、27のソリューションはa )で終了したため、28バイトもありました。:oops:
ジャクベ

1
別の2文字を保存する方法を考えました:+@z1"KTA"to からに変換しますが"KTAZ"、文字列を使用する代わりにJ"KTAZ"、先頭と+@z1Jto で直接使用しJます。
isaacg

@isaacg非常に賢い。ありがとう。ところで Xオプションの3番目の引数を作成することについてかなり長い間考えています(aとbが文字列の場合のみ)。しかしXab)Xab_b(反転b、のようなものに適しているXa"</\>")またはXab+tbhb(bシフト)に評価する必要があるかどうかは、本当にわかりません。好みは?
ジャクベ

6

CJam、34 33バイト

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

アルゴリズム

ロジックは簡単です。カスタムソートを実行しています。最初にスーツを表す2番目のキャラクターを優先します。この場合、スペードが最高の優先度を取得し、次に最初にスローされたスイートを取得します。残りはすべてです-1。次に、語彙ソートを行うために、Twith AQwith Kを交換して最初の文字をソートします。

コードの説明

最初に、カードの顔の値の字句順を見てみましょう。

"23456789TJQKA"$

23456789AJKQT

したがって、すべての数字は正しい位置にあります。Jまた、正しい位置にあります。スワップKQJそしてA字句の順序を取得する必要があります。

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

こちらからオンラインでお試しください


3

JavaScript(ES6)、112

リストをスキャンして、見つかった最高値の位置を返します。

スニペットを実行してテストします(Firefoxで)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>


3

Perl、73バイト

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

私を試してください

ゲーム値の順序がアルファベット順になるようにカード名を変換し、ソートして最高のものを選択し、元の文字列で位置を探します。


2

ルビー、59 + 2 = 61

コマンドラインフラグを使用してna、実行

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}

2

J、47バイト

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

使用法:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

方法:

  • 入力文字ごとに、'S[second char of input]AKQJT9876543'文字列内の位置に基づいて値を割り当てます。見つからない文字はlast position + 1暗黙的に値を取得します。それ以降の文字の値ははるかに小さくなります(value=(16-position)!)。
  • 3つの入力文字トリプレットと1つのデュプレット(TH_ QC_ 9S_およびなど8S)の合計を計算します。
  • 最大値の1から始まるインデックスを選択します。

J

こちらからオンラインでお試しください。


2

C#、237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

仕組み:カードの「価値」を計算するために各手を繰り返します。最高価値のインデックスを保存します。カードの値は、カードのランクにスペードまたはオープニングスーツでない場合は0、オープニングスーツの場合は1、スペードではあるがオープニングスーツではない場合は9を掛けて決定されます。(9つ選択されたb / c 2 * 9 = 18> A = 14&9は単一の文字です)


1

Pyth、36 33バイト

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

かなり簡単なアプローチで、カスタムキー関数を使用した並べ替えを使用して、最高値のインデックスを見つけます。


ソートを避けて、最高値を見つけようとしましたか?JavaScriptでは短いことが判明している
edc65

@ edc65 Pythには、ソートするために最高値を見つける操作はありません。しかし、1文字(e)で最後の要素を取得できるため、最高値を見つけるには、ソート後に最後の要素を取得するだけです。
orlp

Downvoter、説明する気?
-orlp

1

Pyth、31バイト

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

ここで試してみてください。

使い方:

この手順を読む適切な方法は、最初から最後までです。この手順では、目的のカードをリストの最後にソートしてから引き出し、元のリストでそのインデックスを見つけます。

  • cz:これにより、カード文字列のリストが生成されます。c、chopは通常バイナリ関数(アリティ2)ですが、1つの入力でのみ呼び出された場合、.split()文字列メソッドとして機能します。

  • S:これは、通常のソート動作を適用します。これは、小さい番号のカードを高いカードの前にソートします。

  • ox"TJQKA"hN:これは、カードの最初の文字のx文字列()のインデックス()で"TJQKA"カードを並べ替えhNます。数字のあるカードの場合、最初の文字は見つからず、結果が得られ-1ます。Pythのソート機能は安定しているため、番号付きカードの順序は影響を受けません。

  • o}@z1Z:次に、最初にプレイしたカードのスーツ(@z1)が問題のカードにあるかどうかで注文します。True後ろFalseにソートされるので、これはリードスーツのカードを後ろに送ります。

  • o}\SN:これは前のソートと同じですが、文字Sがカードにあるかどうかでソートされ、スペードが後ろに送られます。

  • hxczde:これは、このようにソートされた最後のカードを抽出し(e)、カードのリストでそのインデックスを見つけxczdh)、1ずつ増加し()、目的のプレーヤーの位置を示します。

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