チートでカンニングを手伝ってください


13

チートは、あなたの手を取り除こうとしているカードゲームです。ターンは次のようになります。

  1. そのターンにプレイするカードのランクを決定します。ほとんどのバリエーションでは、これは前のターンより1ランク高いです。
  2. 1-4枚のカードを裏向きにプレイします。これらは有効なランクと一致する必要はありません。そうでない場合、チートと見なされます。この時点で、どのプレイヤーもあなたに挑戦できます。
    • 誰もあなたに挑戦しない場合、プレイは次のプレイヤーに続きます。
    • 誰かがあなたに挑戦し、あなたがカンニングをしなかった場合、彼らはプレイしたカードのすべてを取らなければなりません。
    • 誰かがあなたに挑戦し、あなたがチートをした場合、あなたはプレイされたカードのすべてを取らなければなりません。

戦略は、主にブラフとカードカウントの組み合わせです。しかし、私は数学が苦手なので、Cheatをごまかしてボットを持ってきます。

入力

入力は、任意の順序または形式になります。

  1. プレイヤーの手。彼らがカードを持っている必要があることを知っている場合(たとえば、それらを拾うのを見たことがあります)、それらは昇順でリストされます。不明なものは、後にとしてリストされ?ます。たとえば、6枚のカードがあり、2枚が1枚で、1枚が4枚であることがわかっている場合、有効なハンドの表現は114???です。?は常に既知のカードの後に​​リストされます。 141???そして11???4両方の無効な入力であり、あなたのコードでは、それらを処理する必要はありません。
  2. 私が間違いなく知っているカードは彼らの手の一部ではありません(私はそれらを持っています、他の誰かがそれらを拾うのを見ました、など)。リストはランクの昇順になります。リストは空かもしれません。
  3. プレーヤーがプレイすると主張したカード。彼らが3 7をプレイすると主張した場合、ここで可能な入力はになります777。カードは常に同じランクになります。

プレイされるカードの数は常に1〜4で、ランクは常に0〜9です。ランクは、手ではなく手に4回以上表示されることはありません。

これは有効な入力の例です:

33577??
01555688
55

これは無効な入力の例です:

35377?? # Out of order
7779    # Five 7's in total
23      # Two separate ranks played

出力

私たちが間違いなくすべきなら、真の価値挑戦。チャレンジしたくない場合はfalse値。

彼らがだまされていることがわかっている場合、私たちは常に挑戦します。持っていなかったカードをプレイした場合、彼らはだまされたことがわかります。

12

3  # They don't have any 3's or ?'s    
-------------
12?

33 # Fewer ?'s than played cards
-------------
123?
333
33 # Since we have three 3's they can't have two

私たちが挑戦する他の時間は、彼らが最後のカードをプレイするかどうかです。たとえプレイの合法性がゲームを終了させたとしても、私たちはそれに挑戦するかもしれません。

1

1 # They'd win, so challenge anyway

その他のテストケース

真実の(挑戦すべき)

11445678?

22
-------------
????????
4
4444
-------------
12345678

9

Falsey(挑戦すべきではない)

1?
222
2
-------------
12?
22
22
-------------
?????

1111

得点

最短のコードが優先されます。


7
これはbullsh * tです:)
jacksonecac

何人プレイしていますか?
jacksonecac

@jacksonecacは1回のプレイを見ているだけなので、プレイヤーの人数を心配する必要はありません。
ホバーカウチ

1
これはキングの-丘challangeする必要があります
VLO

2
2番目の偽の場合に挑戦してはいけませんか?
StephenTG

回答:



1

JavaScript(ES6)、93バイト

(h,s,c,g=(a,z=c[0])=>a.split(z).length-1)=>h.length==g(c)|g(h,'?')+g(h)<g(c)|g(h)+g(s)+g(c)>4

カードの3つの文字列(文字0- 9または?)を受け入れます。それ以外の場合1はチャレンジのために戻ります0。説明:

(h,s,c,                 Input parameters
 g=(a,z=c[0])=>         Helper function defaults to claimed card
  a.split(z).length-1   Count cards matching (g(c) == c.length)
)=>h.length==g(c)       Does hand length equal claim length
  |g(h,'?')+g(h)<g(c)   Could hand not contain claimed cards
  |g(h)+g(s)+g(c)>4     Are there too many claimed cards

1

C#6、134バイト

using System.Linq;
bool f(string a,string b,string c)=>a.Length==1|a.Count(x=>x==c[0]|x=='?')<c.Length|b.Count(x=>x==c[0])+c.Length>4;

(注:OPの例に沿って、対戦相手が複数のカードを持ち、すべてのハンドをプレイしている場合でも、この答えはfalseを返します。戦略的には、これはtrueを返す必要があります。)

説明:

a:プレイヤーの手
b:間違いなく知っているカード...
cカード:カードはプレイすると主張

ゴルフをしていない:

bool f(string a, string b, string c) => 
    a.Length == 1                               // Last card played
    | a.Count(x => x == c[0] | x == '?' )       // Count no. of cards that surely/may match claimed cards
                                                // Assuming all claimed cards are the same, just compare with c[0]
        < c.Length                              // I'm sure you don't have that many cards...
    | b.Count(x => x == c[0]) + c.Length > 4;   // ... Or that there can't be that many cards in play

するべきではa.Length==1ありませんa.Length==c.Length。あなたはあなたのメモでそのようなことを暗示しているように見えますが、あなたが言及しているOPの例がわかりません。
ケビンCruijssen

1

Java 8、169 135バイト

(a,b,c)->{int C=c.length();char x=c.charAt(0);return a.length()==C|(a+0).split(x+"|\\?",-1).length<=C|5-(b+0).split(""+x,-1).length<C;}

説明:

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

(a,b,c)->{            // Method with three String parameters and boolean return-type
  int C=c.length();   //  The amount of cards played by your opponent this turn
  char x=c.charAt(0); //  The card played by your opponent this turn
  return a.length()==C//  Return true if your opponent played his entire hand (final round)
    |(a+0).split(x+"|\\?",-1).length
                      //   Or the amount of the played card and '?' in your opponent's hand
      <=C             //   is smaller than the amount of cards played
    |5-(b+0).split(""+x,-1).length
                      //   Or if 4 minus the amount of the played card are part of the
                      //   cards you definitely know, 
     <C;              //   is smaller than the amount of cards played
}                     // End of method

注:(s+0).split("c",-1).length-1文字cが発生する回数をStringで示しsます。したがって、上記の説明のコメントは正しいですが、そのためにコードが異なるように見える場合があります。に(a+0).split(x+"|\\?",-1).length-1<Cゴルフされ(a+0).split(x+"|\\?",-1).length<=C、に4-(b+0).split(""+x,-1).length-1<Cゴルフされ5-(b+0).split(""+x,-1).length<Cます。

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