检查单身麻将的手牌值


12

麻将是一款在亚洲非常受欢迎的瓷砖游戏。它通常由四个玩家玩,并且游戏的目标是成为第一个使用磁砖完成有效手牌的人。在麻将中,有三副牌服和荣誉牌-对于这一挑战,我们将仅考虑使用来自单个牌服的牌形成的手。

磁贴从编号19,每个磁贴正好有四个副本。有效手牌由四组组成,每组三组,每组一对,共14张。

三个一组可以是:

  • 一个三元组,三个相同的图块(例如444),或
  • 三个连续图块的序列(例如123678但不是357)。序列不换行(因此912无效)。

一对只是两个相同的图块(例如55)。

挑战

给定有效手牌数为14张,请根据以下条件确定其得分:

Condition                Description                                 Point/s
-------------------------------------------------------------------------------
Straight                 Contains the sequences 123 456 789          1
Identical sequences      Contains two identical sequences            1
All simples              Only 2-8, no 1s or 9s                       1
All sequences            All sets of three are sequences             1
All triplets             All sets of three are triplets              2
Flush                    Single-suit hand (always applies)           5

(这里的评分是根据日本的麻将规则进行的,但经过了简化,以使规范不那么混乱。)

手的分数是其满足条件的总分。如果一只手可以通过多种方式分解,请进行最高得分的分解。

确保输入的手是有效的,即从1到9的十四个图块,每个图块最多出现四次,并且可以假定已被排序。输入是通过STDIN,函数参数或命令行的数字列表(作为字符串或整数的单个平面列表)。输出可能是STDOUT或返回值。

测试用例

22233355777888  ->  8  # 222 333 55 777 888, flush + all simp. + all trip.
11112345678999  ->  6  # 111 123 456 789 99, flush + straight
11123456788999  ->  5  # 111 234 567 88 999, flush only (no straight)
23344455566788  ->  7  # 234 345 456 567 88, flush + all simp. + all seq.
33334444555566  ->  8  # 33 345 345 456 456, flush + all simp. + all seq. + identical seq.
11122233377799  ->  7  # 111 222 333 777 99, flush + all trip. (no identical seq.)
12344556678889  ->  8  # 123 456 456 789 88, flush + all seq. + straight + identical seq.
11344556678999  ->  5  # 11 345 456 678 999, flush only (no identical seq.)
22233344455566  ->  8  # 222 333 444 555 66, flush + all simp. + all trip.
11112233344555  ->  5  # 111 123 234 345 55, flush only

对于第五个示例,尽管具有两对相同的序列,但仅需存在一个即可达到该点。分解345 345 345 345 66得分相同,而333 345 444 555 66得分更差。

计分

这是,因此以最少字节为单位的解决方案将获胜。有标准漏洞


相关挑战:您还在等什么?(麻将求解器)

Answers:


1

J(241再见)

您需要安装最新版本的J。

i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'

s用整数列表调用该函数。例如,以下示例脚本验证了上面的测试用例:

#!/usr/bin/jconsole
i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'


echo (s 2 2 2 3 3 3 5 5 7 7 7 8 8 8)=8
echo (s 1 1 1 1 2 3 4 5 6 7 8 9 9 9)=6
echo (s 1 1 1 2 3 4 5 6 7 8 8 9 9 9)=5
echo (s 2 3 3 4 4 4 5 5 5 6 6 7 8 8)=7
echo (s 3 3 3 3 4 4 4 4 5 5 5 5 6 6)=8
echo (s 1 1 1 2 2 2 3 3 3 7 7 7 9 9)=7
echo (s 1 2 3 4 4 5 5 6 6 7 8 8 8 9)=8
echo (s 1 1 3 4 4 5 5 6 6 7 8 9 9 9)=5
echo (s 2 2 2 3 3 3 4 4 4 5 5 5 6 6)=8
echo (s 1 1 1 1 2 2 3 3 3 4 4 5 5 5)=5

exit''
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.