Допоможіть мені обдурити чит


13

Cheat - карткова гра, в якій ви намагаєтеся позбутися руки. Поворот виглядає приблизно приблизно так:

  1. Визначте, у якому рейтингу картки ви повинні грати в цьому ході. У більшості варіантів це на один ранг вище, ніж попередня черга.
  2. Грайте в 1-4 карти, обличчям вниз. Вони не повинні відповідати дійсному рангу. Якщо вони цього не роблять, це вважається обманом . У цей момент будь-який гравець може кинути вам виклик .
    • Якщо ніхто не кидає вам виклику, гра продовжується до наступного гравця.
    • Якщо хтось кидає вам виклик, і ви не обдурили, він повинен взяти всі розіграні карти.
    • Якщо хтось кидає вам виклик, і ви обдурили, вам доведеться взяти всі розіграні карти.

Стратегія - це в основному поєднання блефу та підрахунку карт. Мені все одно погано в математиці, тому я збираюся обдурити чит і принести бота зі собою.

Вхідні дані

Вхід буде в будь-якому бажаному порядку або форматі:

  1. Рука гравця. Якщо я знаю, що у них повинні бути картки (наприклад, я бачив, як вони їх забирають), вони будуть перераховані у порядку зростання. Будь-які невідомі згодом будуть вказані як ?. Наприклад, якщо у них є шість карт, і я знаю, що дві - це 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

Більше тестових випадків

Truthy (повинен кинути виклик)

11445678?

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

9

Фальсі (не варто кидати виклик)

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

1111

Оцінка балів

Найкоротший код виграє.


7
Це бич * т :)
jacksonecac

Скільки людей грає?
jacksonecac

@jacksonecac Ви дивитесь лише на одну гру, тож вам не доведеться турбуватися про те, скільки гравців є.
Говеркуч

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;

(Примітка. Відповідно до прикладу ОП, ця відповідь повертається неправдиво, навіть якщо противник має більше однієї карти і грає всіма руками. З точки зору стратегії це має повернутись істинно.)

Пояснення:

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. Ви, схоже, у своїй ноті натякаєте щось подібне, але я не знаю, на якому прикладі ОП ви посилаєтесь, що дає можливість грати більше карт, ніж кількість карт, які має опонент.
Кевін Кройсейсен

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Є golfed до (a+0).split(x+"|\\?",-1).length<=Cі 4-(b+0).split(""+x,-1).length-1<Cє golfed до 5-(b+0).split(""+x,-1).length<C.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.