Это настоящая игра Тичу?


11

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: поэтому первый ввод никогда не будет собакой


@Arnauld Не все допустимые комбинации (например 777JJJ, 1234, 223355). Тем не менее, RPне является действительным: « Дракон не может играть сам по себе на вершине какой - либо одной или свинцом (но нигде). »
Дверная ручка

Действительно, я как раз собирался отредактировать свой комментарий, чтобы сказать, что все первые руки, кажется, всегда действительны.
Арно

1
@ Arnauld Ах - да, вы можете считать, что все первые руки действительны.
Ручка двери

Возможно, стоит упомянуть, что Феникс нельзя использовать в качестве символа подстановки в бомбе. 5555 777Pдолжна быть недопустимая игра, но оба текущих ответа помечают ее как действительную.
Джитсе

Ответы:


5

JavaScript (ES6),  274  273 байта

(a)(b)aб

  • 1
  • 3
  • 4..16
  • 18
  • 19

Возвращает false для действительного или true для недействительного.

a=>b=>!(L='length',[A,B]=(g=a=>(h=n=>--n?[i=1,2,3,'(20*)3|30*2','1{5,}','22+',4].some(p=>m=o.join``.match(`9(0*)(${p})0*$`,i++),a.map(x=>o[x-19?x:x=n]=-~o[x],o=[...9e16+'']))?[i,m[1][L]+(m[3]||[])[L]]:h(n):[])(18))(a),[C,D]=g(b),a+a?A-C?C>7|+b>a:a[L]==b[L]&D>B|A<3&b==18:C)

Попробуйте онлайн!

Как?

o[]9

//       D  -  1  2  3  4  5  6  7  8  9  T  J  Q  K  A
o = [ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];

Для каждого ранга карты в раздаче соответствующий слот o[]увеличивается. После присоединения к строке мы можем применить следующие регулярные выражения для определения каждого типа руки:

 hand        | pattern     | full regex              | example
-------------+-------------+-------------------------+-------------------
 single      | 1           | /9(0*)(1)0*$/           | 90000100000000000
 pair        | 2           | /9(0*)(2)0*$/           | 90000002000000000
 3-of-a-kind | 3           | /9(0*)(3)0*$/           | 90003000000000000
 full house  | (20*)3|30*2 | /9(0*)((20*)3|30*2)0*$/ | 90020000030000000
 straight 5+ | 1{5,}       | /9(0*)(1{5,})0*$/       | 90000111110000000
 tractor     | 22+         | /9(0*)(22+)0*$/         | 90000000000022200
 bomb        | 4           | /9(0*)(4)0*$/           | 90000000000000004

Если рука не вызывает ни одно из этих регулярных выражений, это недопустимо.

9(20*)

Феникс (то есть подстановочный знак) просто заменяется каждым возможным рангом карты, начиная с самого высокого, до тех пор, пока не будет обнаружено совпадение.


0

Python 3 , 466 455 403 401 399 байт

R=lambda H,n=3:n==len(H)*(len({*H})<2)and[15]!=H[1:]
s=lambda H:[H[2:],H[:1]][R(H[:3])]
def n(J,K):j,k=[[16in H,R(H,4),len(H)>4and all(15!=t>T-2for t,T in zip(H,H[1:])),[R(H[2:])*R(H[:2],2),R(H[3:],2)][R(H[:3])],R(H),R(H,2),R(H,1),1].index(1)for H in[J,K]];return k!=7and[17]==J or[j==k*[J<K,s(J)<s(K)][2<j<5],J<K][k==1]
f=lambda P:any(n(*[sorted([L,i][i>0]for i in H)for H in P])for L in range(16))

Попробуйте онлайн! Ввод - это список рук, где рука - это список целых чисел 1 со следующим отображением значения:

  • 0: Феникс
  • 1: Маджонг
  • 2-13: 2 до туза
  • 14: Дракон
  • 15: собака
  • 16: пустая строка

1: Хотя в связанных тестах TIO выражены в виде списка строк из-за удобства, которые переводятся в соответствии с отображением значения перед вызовом f

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.