ブリッジハンドスコアリング


13

コントラクトブリッジを非常に興味深いものにしているものの1つは、非常に複雑な「人工」メタゲームです。採点のこのシステムは、そのほんの一部です。

Bridgeは、トリックをとるカードゲームです。各プレイヤーには13枚のカードが渡され、ゲームは入札から始まります。入札は、ゲームの残りの部分をどのようにプレイするかを決定するので、重要な部分です。あなたとあなたのパートナーが高すぎる(または低すぎる)入札をしないようにするために、この人工スコアリングシステムは、あなたのハンドがどれほど良いかを示すために開発されました。

得点

次にサンプルハンドを示します。

S:KQT5
H:J72
D:965
C:AK8

S、H、D、Cはスーツ(スペード、ハート、ダイアモンド、クラブ)を表し、残りはそれらのスーツのカードです。したがって、このハンドには、スペードのクイーン(Q)、スペードのキング(K)、スペードの10(T)、スペードの5、ハートのジャック、ハートの7などがあります。

スコアリングシステムは次のように機能します。

  • エース(A)ごとに4ポイント、キング(K)ごとに3ポイント、クイーン(Q)ごとに2ポイント、ジャック(J)ごとに1ポイントを獲得できます。他のカードはポイントを与えません。
  • スーツの4番目以降のカードはすべて1ポイントを与えます。したがって、ハートが6つある場合、2ポイントを獲得します。
  • カードが2枚しかないスーツでは、1ポイントが与えられます(これはダブルトンです)。カードが1枚しかないスーツでは、2ポイントが与えられます(これはシングルトンです)。特定のスーツにカードがない場合、3ポイントを獲得します(これは無効です)。(通常、これらはパートナーとの訴訟で合意した場合にのみカウントされますが、チャレンジをより面白くするためにそれらを含めています。)

したがって、上記のハンドには13ポイントがあります。

チャレンジ

上記の形式のブリッジハンドが与えられたら、そのハンドのポイント数を計算します。スーツは常にスペード、ハート、ダイヤモンド、クラブの順にリストされ、カードは常にA、K、Q、J、T、9-2の順にソートされます。

サンプルの入力と出力

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

これはなので、バイト単位の最短コードが優先されます。

回答:


4

ゼリー、27 25 21バイト

-3バイトありがとう@Dennis!

L_5.AḞW+“JQKA”i$€Sµ€S

これは、入力を行のリストとして受け取ります。入力を複数行の文字列として取得するには、aを事前連結しṣ⁷µます。

周波数ポイントの表を作成します。

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

それらがに等しいことがわかりますabs(c-3.5)-.5。cはカードの数です。各行には2つの余分な文字が含まれており、ポイントの数は常に整数であるためfloor(abs(l-5.5))、lは行の長さです。

Jellyのインデックスは1ベースであり、次元の不一致に対するベクトル化された関数の動作にも注意してください。長いリストの余分な要素は影響を受けません。だから[1] + [3,2,0,0]与える[4,2,0,0]

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

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


3

ES6、107の 99 89バイト

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)

2

Pyth、27 25 24バイト

sms+a5.5ldshMxL"JQKA"d.z

各スーツの値を個別に計算し、それらを追加します。

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

テストスイート


1

網膜、77 59バイト

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

行/行のペアによる説明:

  • 最初の行では、charsをに変換AKQJT9876554325432111111111ます。これは、スーツごとに合計があることを意味します。私たちが持っている場合0 1 2 3 4 5 6 7 ...このスーツにカードがある、合計は+3 +1 -1 -3 -4 -4 -4 -4 ...正しいスコアから外れます。
  • これを修正するために2行目と3行目ですべての行に3を追加し、スペースの前に減算する値を追加します。この減算値は、最大3枚のカードの長さの2倍で、少なくとも4枚のカードがある場合はさらに1枚です。
  • 4行目と5行目では、数字を単項に変換し、区切りスペース以外のすべてを削除します。
  • 6行目と7行目では、単項減算を行います。
  • 8行目1では、結果を与えるをカウントアップします。

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



1

スタックス、18 バイト

½Γ}♣▓="pì∩û╨▐M↨}╚-

これまでの最短回答、ゼリーを破りました(すぐに敗北することを期待していますが...)

オンラインで実行してデバッグします!

説明

解凍されたバージョンを使用して説明します。

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

これは、翻訳することにより達成されます

  • スーツの4番目以降のカードはすべて1ポイントを与えます。したがって、ハートが6つある場合、2ポイントを獲得します。
  • カードが2枚しかないスーツでは、1ポイントが与えられます(これはダブルトンです)。カードが1枚しかないスーツでは、2ポイントが与えられます(これはシングルトンです)。特定のスーツにカードがない場合、3ポイントを獲得します(これは無効です)。

  • スーツごとに3ポイント追加
  • スーツの4枚目より前の各カードは-1ポイント、4枚目以降の各カードは1ポイント、4枚目のカードは0を獲得します。

その後、signum関数のプロパティを利用できます。

これを行うことにより、数バイトを節約するカードの数の明示的な処理を回避できます。

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