Чит - карточная игра, в которой вы пытаетесь избавиться от своей руки. Ход выглядит примерно так:
- Определите, какое звание карты вы должны разыграть в этот ход. В большинстве вариантов это на один ранг выше, чем в предыдущем ходу.
- Сыграйте 1-4 карты, лицом вниз. Они не должны соответствовать действительному рангу. Если они этого не делают, это считается читом . В этот момент любой игрок может бросить вам вызов .
- Если никто не бросает вам вызов, игра продолжается до следующего игрока.
- Если кто-то бросает вам вызов, а вы не обманываете, ему нужно взять все сыгранные карты.
- Если кто-то бросает вам вызов и вы обманываете, вы должны взять все сыгранные карты.
Стратегия в основном представляет собой сочетание блефа и подсчета карт. Я плохо разбираюсь в математике, поэтому я собираюсь обмануть читов и взять с собой бота.
вход
Ввод будет в любом порядке или формате, который вы хотите:
- Рука игрока. Если я знаю, что у них должны быть карточки (например, я видел, как они их поднимали), они будут перечислены в порядке возрастания. Любые неизвестные будут перечислены позже
?
. Например, если у них есть шесть карт, и я знаю, что две - это 1, а одна - 4, правильное представление руки - это114???
. ? s всегда будут перечислены после известных карт.141???
и11???4
оба являются недействительными входными данными, и ваш код не должен обрабатывать их. - Карты, которые я точно знаю, не являются частью их руки (у меня они есть, я видел, как кто-то другой взял их и т. Д.). Список будет в порядке возрастания ранга. Список может быть пустым.
- Карты, на которые претендовал игрок. Если бы они утверждали, что играют в 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
счет
Самый короткий код выигрывает.
источник
Ответы:
Pyth, 22 байта
Попробуйте онлайн.
источник
JavaScript (ES6), 93 байта
Принимает три строки карт (символы
0
-9
или?
); возвращается1
на вызов, в0
противном случае. Объяснение:источник
C # 6, 134 байта
(Примечание. В соответствии с примером OP этот ответ возвращает значение false, даже если у противника более одной карты и он разыгрывает все свои руки. С точки зрения стратегии это должно возвращать значение true.)
Объяснение:
a
: Рука игрокаb
: Карты, которые я точно знаю ...c
: Карты, на которые претендуют игратьUngolfed:
источник
a.Length==1
бытьa.Length==c.Length
. Кажется, вы подразумеваете что-то подобное в своей заметке, но я не знаю, какой пример ОП, на который вы ссылаетесь, позволяет разыгрывать больше карт, чем количество карт, которые есть у оппонента в руке.Java 8,
169135 байтОбъяснение:
Попробуй это здесь.
ПРИМЕЧАНИЕ:
(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
.источник