シングルスーテッドマージャンのハンドバリューを確認する


12

麻雀は、アジアで非常に人気のあるタイルゲームです。通常、4人のプレイヤーでプレイされ、ゲームの目標は、タイルを使用して有効なハンドを完了する最初の人になることです。麻雀には3つのタイルスーツと名誉タイルがあります。この課題では、単一のスーツのタイルを使用して形成された手のみを検討します。

タイルから番号が付けられている19、各タイルの4つのコピーが正確にあります。有効なハンドは、3セットと4組の合計4つのタイルで構成されます。

3つのセットは次のいずれかです。

  • トリプレット、同じタイルの3つ(例444)、または
  • 三つの連続タイル(例えば、一連の123678ではなく357)。シーケンスはラップしません(912無効です)。

ペアは、単純に2つの同一のタイルです(例:)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までの14個のタイルと、各タイルが最大4回出現し、すでにソートされていると仮定できます。入力は、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

5番目の例では、2つのペアの同一のシーケンスがありますが、ポイントを達成するために必要なのは1つだけです。分解の345 345 345 345 66スコアは同じですが、333 345 444 555 66スコアは悪化します。

得点

これはであるため、最小バイト数のソリューションが優先されます。標準の抜け穴が適用されます。


関連する課題:何を待っていますか?(麻雀ソルバー)

回答:


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''
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.