这是Tichu的有效戏吗?


11

Tichu是一种纸牌游戏,其中玩家从包含52张标准纸牌的甲板上轮流玩几组纸牌,外加4张额外的纸牌:

  • ,它比任何其他卡更大的价值
  • ,其可以作为通配符作用
  • ,它通过转向你的合作伙伴
  • 值1 的麻将(以及持有该值的人先打)

第一个玩家(据说具有“领先”)可以选择玩以下类型的卡组合之一:

  • 单个(例如6
  • JJ
  • 一个三重555
  • 一个完整的家QQQ33) -三和一对
  • 一个直的56789) - 5或更多个连续的卡
  • 拖拉机223344) -对任何连续序列

然后,仅允许随后的玩家玩一组相同类型但严格更高的纸牌。例如,QQ可以在上播放JJ,但QQKK不能播放(它是拖拉机,而不是一对)。满屋是按三元组排序的(例如77722> 44499),直线和拖拉机的长度必须相同(456789不能在上方播放23456)。ace高。

有一个例外:同一张卡中的任何四张都是炸弹,并且可以在除高级炸弹之外的任何东西上玩。1个

巨龙可以自己在任何单人之上或带头(但无处可)玩。凤凰号除了可以用作通配符外,还可以在除龙以外的任何单个单张上播放。2狗只能自己带头玩,并立即结束回合。3


您面临的挑战是确定给定的Tichu剧本是否有效。

您可以接受任何形式的整数或字符串列表的两种播放方式-在任何一种情况下,您都可以选择纸牌到整数/字符的任何映射。如果有以前的播放,它将始终有效,如果没有,即玩家处于领先地位,则第一个输入将为空数组/字符串(与其他输入的类型匹配)。不保证以任何特定顺序提供卡。

您的输出必须从一组恰好两个不同的值中进行选择,其中一个值指示播放是合法的,而另一个值则指示不是合法的。

无需测试卡片组中是否确实存在这组卡(例如7776688877由于只有四个7 ,因此不可能进行测试)-永远不会给出这种情况。

在以下测试案例中,234567890JQKA代表2到ace,分别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并非所有的都是有效的组合(例如777JJJ1234223355)。但是,这RP是无效的:“ 巨龙可以自己在任何单人的上面玩,也可以在主角上玩(但无其他地方)。
Doorknob

事实上,我正要编辑我的评论说,所有的第一手似乎总是有效的。
阿纳尔德

1
@Arnauld Ah-是的,您可以假设所有第一手都有效。
门把手

也许值得一提的是,凤凰号可能不会在炸弹中用作通配符。5555 777P应该是无效的播放,但是两个当前答案都将其标记为有效。
吉特(Jitse)

Answers:


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

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到A
  • 14:龙
  • 15:狗
  • 16:空字符串

1:尽管在链接的TIO中,出于方便性,测试用字符串列表表示,但在调用之前根据值映射对其进行了转换 f

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.