帮我在作弊作弊


13

作弊是一种纸牌游戏,您想摆脱它。转弯大致如下所示:

  1. 确定您该回合必须打的卡等级。在大多数变体中,这比上一回合高一等级。
  2. 面朝下播放1-4张牌。这些不必匹配有效等级。如果他们不这样做,就被视为作弊。此时,任何玩家都可以挑战您。
    • 如果没有人挑战您,则继续玩下一位玩家。
    • 如果有人挑战您并且您没有作弊,那么他们必须拿走所有已玩过的纸牌。
    • 如果有人挑战您并且您作弊,则您必须拿走所有已玩过的纸牌。

该策略主要是虚张声势和纸牌计数的组合。不过我数学不好,所以我要欺骗作弊者并带一个机器人。

输入值

输入将采用您想要的任何顺序或格式:

  1. 玩家的手。如果我知道他们必须有卡(例如,我看过他们捡起它们),则这些卡将以升序排列。任何未知内容将在之后列为?。例如,如果他们有6张牌,并且我知道2张为1,一张为4张,则该手的有效表示为114????总是会在已知卡之后列出。 141???并且11???4都是无效输入,您的代码不需要处理它们。
  2. 我绝对不知道这些卡不是他们手的一部分(我有它们,我看到有人捡起它们,等等)。该列表将按升序排列。该列表可能为空。
  3. 玩家声称玩的纸牌。如果他们声称玩3 7,则可能输入777。卡将始终处于同一等级。

所打牌的数量将始终为1-4,等级始终为0-9。等级在他们手中不会出现超过四次,而不会出现在手中。

这是一个有效输入示例:

33577??
01555688
55

这是一个无效输入示例:

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

输出量

如果我们一定要挑战的话,这是一个真实的价值。如果我们不想挑战,则为假值。

如果我们知道他们被骗了,我们就会一直挑战。我们知道,如果他们打出不可能的牌,他们就会作弊:

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

虚假(不应挑战)

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

1111

计分

最短的代码获胜。


7
这是bullsh * t :)
jacksonecac

有多少人在玩?
jacksonecac

@jacksonecac您只看一场比赛,因此您不必担心有多少名球员。
Hovercouch16年

1
这应该是山丘之王的挑战
Vlo

2
在第二个假案中,您不应该挑战吗?
StephenTG '16

Answers:



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

接受三串卡(字符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的示例,这有可能使更多的牌正在被玩,而不是对手手中的牌数量。
凯文·克鲁伊森

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被golfed到(a+0).split(x+"|\\?",-1).length<=C4-(b+0).split(""+x,-1).length-1<C被golfed到5-(b+0).split(""+x,-1).length<C

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.