私は頭を包むことができないように見える独特の問題に遭遇しました。すぐに始めます。
問題は、一連のカードを一連のルールに一致させることです。
一連のルールを文字列として定義することができます。のコンマ区切りのタプルで構成されます<suit>:<value>
。たとえばH:4, S:1
、ハートの 4 つとスペードのエースに一致する必要があります。ワイルドカードを使用することもできます。たとえば、*:*
任意のカードにD:*
一致し、ダイヤのスーツの任意のカードに一致*:2
し、任意のスーツの 2 に一致します。ルールはカンマで組み合わせることができます: *:*,*:*,H:4
2 枚のランダムなカードとハートの 4 を保持している場合、カードのセットに一致します。
ここまでは順調ですね。このためのパーサーは、簡単に書くことができます。ここがトリッキーな部分です。
これらのルールを簡単に構成できるようにするために、スーツと値に対してさらに 2 つの構文を使用できます。これらは<
(スーツと値に対して有効) および+n
(値に対してのみ有効) であり、n は数字です。<
は「前の試合と同じ」を+n
意味し、「前の試合より n 高い」を意味します。例:
*:*, <:*, *:<
意味: 任意のカードと一致し、次に最初の一致と同じスートのカードと一致し、次に 2 番目の一致と同じ値の別のカードと一致します。このハンドは次のようにマッチします:
H:4,H:8,C:8
Hearts of Four と Hearts of Eight は同じスートであり、Eight of Hearts と Eight of Clubs は同じ値だからです。
すべてのルールが一致する限り、より多くのカードを持つことができます (したがって、C:10
上記の手札に追加してもルールは一致します)。
これを解決するための私の最初のアプローチは、基本的に、一致する必要があるカードのセットを取得し、最初のルールをそれに適用しようとすることです。一致した場合は、次のルールに進み、カードのセットから一致させようとしました。すべてのルールが一致するか、一致しないルールが見つかるまで、これを繰り返しました。このアプローチには (少なくとも) 1 つの欠陥があります。上記の例を考慮*:*,<:*,*:<
してください:H:8,C:8,H:4
- 最初のルールの H:8 に一致します。
Matched: H:8
- 次に、同じスーツ (ハート) を持つものを見つけようとします。ハートの4があります。
Matched: H:8, H:4
- 次に、同じ値 (4) のカードを見つけようとしましたが、失敗しました。
上記の例のように、一連のカードの順序が結果に影響を与える方法は望んでいません。どんなルールセットでもうまく機能する優れた戦略を思いつくことができれば、カードセットを並べ替えることができます.
私はカードの枚数やルールの数について何も知らないので、ブルート フォース アプローチは実行できません。
ここまで読んでくれてありがとう、ヒントや洞察に感謝します。