Tichu - карточная игра, в которой игроки по очереди разыгрывают наборы карт из колоды, состоящей из стандартной 52-карточной колоды плюс 4 дополнительные карты:
- дракона , который имеет значения больше , чем любая другая карта
- Феникс , который может действовать в качестве шаблона
- собака , которая проходит поворот к своему партнеру
- Mah Jong , который имеет значение 1 (и лицо , оно играет первым)
Первый игрок (у которого, как говорят, есть «лидерство») может выбрать один из следующих типов комбинаций карт:
- одного (например
6
) - пара (
JJ
) - тройной (
555
) - полный дом (
QQQ33
) - тройка и пара - прямой (
56789
) - 5 или более последовательные карты - трактор (
223344
) - любая последовательная последовательность пар
Затем последующим игрокам разрешается разыгрывать только набор карт того же типа, но строго выше. Например, QQ
можно играть сверху JJ
, но QQKK
нельзя (это трактор, а не пара). Фулл-хаусы заказываются тройкой (например, 77722
> 44499
), а стриты и тракторы должны быть одинаковой длины ( 456789
нельзя играть сверху 23456
). Тузы высокие.
Есть одно исключение: любые 4 из одной и той же карты являются бомбой и могут быть сыграны поверх чего угодно, кроме более высокой бомбы. 1
Дракон может быть сыгран сам по себе поверх любого сингла или со свинцом (но больше нигде). Феникс, кроме того, что он является символом подстановки, также может быть сыгран поверх любого сингла, кроме дракона. 2 Собаку можно играть только с помощью поводка, и она немедленно заканчивает ход. 3
Ваша задача - определить, является ли данная игра Tichu действительной, учитывая предыдущую игру.
Вы можете принять обе пьесы в любом порядке в виде списков целых чисел или строк - в любом случае вы можете выбрать любое сопоставление карточек с целыми числами / символами. Если была предыдущая игра, она всегда будет действительна, и если нет (то есть, у игрока есть лидерство), первым вводом будет пустой массив / строка (соответствующий типу другого ввода). Карты не гарантируются в любом конкретном порядке.
Ваш вывод должен быть выбран из набора точно двух разных значений, одно из которых указывает, что игра является законной, а другая - нет.
Нет необходимости проверять, существует ли на самом деле набор карт в колоде (например, 77766
после 88877
него невозможно, потому что есть только четыре семерки) - такие случаи никогда не будут приведены.
В следующих тестовых примерах 234567890JQKA
обозначают от 2 до туза и RPD1
представляют соответственно дракона, феникса, собаку и маджонга. Пустая строка показана здесь как -
. Эти пьесы являются законными:
6 J
JJ QQ
555 KKK
44499 77722
23456 56789
223344 QQKKAA
49494 72727
A R
A P
P R
66 7P
P6 77
58304967 6P0594J7
5P304967 680594J7
57446765 788657P5
- D
- 1
- 12345
3344556677889900 JJJJ
5555 7777
И это не
9 3
66 55
888 444
44 888
77722 44499
44499 777
44499 777JJJ
45678 34567
34567 456789
556677 334455
5566 778899
72727 49494
A A
R A
R P
77 RP
77 6P
P7 66
680594J7 5P304967
6P0594J7 58304967
57446765 3645P536
1 D
2 D
2 1
- 1234
7777 5555
- 223355
1: на самом деле, стрит-флеш - это тоже бомба, но так как это единственное место в игре, в котором важен масть карт, я решил оставить ее для простоты ради
2: значение феникса, играемого поверх карты со значением n, на самом деле равно n + 0,5 (феникс на 9 равен 9 с половиной); так как это требует знания дополнительной истории для вынесения решения, ни в одном из тестовых случаев не участвует один, сыгранный поверх одного феникса
3: поэтому первый ввод никогда не будет собакой
источник
777JJJ
,1234
,223355
). Тем не менее,RP
не является действительным: « Дракон не может играть сам по себе на вершине какой - либо одной или свинцом (но нигде). »5555 777P
должна быть недопустимая игра, но оба текущих ответа помечают ее как действительную.Ответы:
JavaScript (ES6),
274273 байта(a)(b)
Возвращает false для действительного или true для недействительного.
Попробуйте онлайн!
Как?
o[]
Для каждого ранга карты в раздаче соответствующий слот
o[]
увеличивается. После присоединения к строке мы можем применить следующие регулярные выражения для определения каждого типа руки:Если рука не вызывает ни одно из этих регулярных выражений, это недопустимо.
(20*)
Феникс (то есть подстановочный знак) просто заменяется каждым возможным рангом карты, начиная с самого высокого, до тех пор, пока не будет обнаружено совпадение.
источник
Python 3 ,
466455403401399 байтПопробуйте онлайн! Ввод - это список рук, где рука - это список целых чисел 1 со следующим отображением значения:
1: Хотя в связанных тестах TIO выражены в виде списка строк из-за удобства, которые переводятся в соответствии с отображением значения перед вызовом
f
источник