Це дійсна п’єса Тічу?


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


Ваше завдання полягає в тому, щоб визначити, чи дійсна дана п’єса Тічу дійсна, враховуючи попередню гру.

Ви можете приймати обидві п’єси в будь-якому порядку як списки цілих чисел або рядків - в будь-якому випадку ви можете вибрати будь-яке зіставлення карт на цілі числа / символи. Якщо раніше була гра, вона завжди буде дійсною, а якщо ні (тобто гравець веде), першим входом буде порожній масив / рядок (відповідає типу іншого входу). Гарантії не будуть видані в якомусь конкретному порядку.

Вихід повинен бути обраний з набору рівно двох різних значень, одне з яких вказує на те, що гра є законною, а інша, яка вказує, що це не так.

Немає необхідності перевіряти, чи існує набір карток насправді в колоді (наприклад, 77766після чого 88877неможливо, тому що всього чотири 7) - такі випадки ніколи не даватимуться.

У наступних тестових випадках 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 Ага - так, ви можете вважати, що всі перші руки є дійсними.
Дверна ручка

Можливо, варто згадати, що Phenix не може використовуватися як підстановка у бомбі. 5555 777Pмає бути недійсною програмою, але обидві поточні відповіді відзначають її як дійсну.
Jitse

Відповіді:


5

JavaScript (ES6),  274  273 байт

(a)(b)ab

  • 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

Пітон 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.