Помоги мне обмануть в чит

13

Чит - карточная игра, в которой вы пытаетесь избавиться от своей руки. Ход выглядит примерно так:

  1. Определите, какое звание карты вы должны разыграть в этот ход. В большинстве вариантов это на один ранг выше, чем в предыдущем ходу.
  2. Сыграйте 1-4 карты, лицом вниз. Они не должны соответствовать действительному рангу. Если они этого не делают, это считается читом . В этот момент любой игрок может бросить вам вызов .
    • Если никто не бросает вам вызов, игра продолжается до следующего игрока.
    • Если кто-то бросает вам вызов, а вы не обманываете, ему нужно взять все сыгранные карты.
    • Если кто-то бросает вам вызов и вы обманываете, вы должны взять все сыгранные карты.

Стратегия в основном представляет собой сочетание блефа и подсчета карт. Я плохо разбираюсь в математике, поэтому я собираюсь обмануть читов и взять с собой бота.

вход

Ввод будет в любом порядке или формате, который вы хотите:

  1. Рука игрока. Если я знаю, что у них должны быть карточки (например, я видел, как они их поднимали), они будут перечислены в порядке возрастания. Любые неизвестные будут перечислены позже ?. Например, если у них есть шесть карт, и я знаю, что две - это 1, а одна - 4, правильное представление руки - это 114???. ? s всегда будут перечислены после известных карт. 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

Falsey (не должен оспаривать)

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

1111

счет

Самый короткий код выигрывает.

Hovercouch
источник
7
Это фигня * т :)
jacksonecac
Сколько людей играют?
Jacksonecac
@jacksonecac вы смотрите только одну игру, так что вам не нужно беспокоиться о количестве игроков.
Hovercouch
1
Это должен быть вызов
царя
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

Принимает три строки карт (символы 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: Карты, на которые претендуют играть

Ungolfed:

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
Ссылка Ng
источник
Не должно a.Length==1быть a.Length==c.Length. Кажется, вы подразумеваете что-то подобное в своей заметке, но я не знаю, какой пример ОП, на который вы ссылаетесь, позволяет разыгрывать больше карт, чем количество карт, которые есть у оппонента в руке.
Кевин Круйссен
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встречается в строке 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.

Кевин Круйссен
источник