2

私は頭を包むことができないように見える独特の問題に遭遇しました。すぐに始めます。

問題は、一連のカードを一連のルールに一致させることです。

一連のルールを文字列として定義することができます。のコンマ区切りのタプルで構成されます<suit>:<value>。たとえばH:4, S:1、ハートの 4 つとスペードのエースに一致する必要があります。ワイルドカードを使用することもできます。たとえば、*:*任意のカードにD:*一致し、ダイヤのスーツの任意のカードに一致*:2し、任意のスーツの 2 に一致します。ルールはカンマで組み合わせることができます: *:*,*:*,H:42 枚のランダムなカードとハートの 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) のカードを見つけようとしましたが、失敗しました。

上記の例のように、一連のカードの順序が結果に影響を与える方法は望んでいません。どんなルールセットでもうまく機能する優れた戦略を思いつくことができれば、カードセットを並べ替えることができます.

私はカードの枚数やルールの数について何も知らないので、ブルート フォース アプローチは実行できません。

ここまで読んでくれてありがとう、ヒントや洞察に感謝します。

4

1 に答える 1

-2

あなたの問題は実際には注文の問題です。これがその簡単なバージョンです:

数字とパターンの入力シーケンスが与えられたら、パターンに合うようにそれらを並べ替えます。パターンには、「任意の数字」を意味する「*」と「前の数字よりも大きい」を意味する「>」を含めることができます。

たとえば、与えられたパターン[**>>]とシーケンス[10102 1]のような順序が存在し、それは[10 1210]です。一部の入力は出力を提供しない場合があり、他の入力は1を提供し、他の入力は多くを提供する場合があります(入力[10 1021]とパターン[*** *]を考えてください)。

この単純化された問題の解決策が得られたら、問題に切り替えるには、別の次元といくつかの演算子を追加するだけです。これ以上役に立たないことをお詫びします:/。

LE。許可されている文字記号が有限(つまり4)であり、許可されている数字(つまり9)でもある場合は、作業が簡単になる可能性があることに注意してください。

于 2012-08-21T19:30:10.597 に答える