2016-05-31 15 views
0

楽しいので、私は24 gameを解決するためのプログラムを試しています。複数の解決策をチェックするときに、同等の式を表示しないようにする方法を見つけようとしています。等価式を検出するアルゴリズム

たとえば、数字6, 6, 6, 6が与えられていると、アルゴリズムは(繰り返しまたは再帰的に)いくつかの等価な式を生成することができます。
たとえば、((6 + 6) + 6) + 6(6 + 6) + (6 + 6)などです。これらはすべて「4つの6つを一緒に追加する」という意味です。

明らかに、4つの算術演算子すべてを扱うときには、もっと面白くなります。
たとえば、式A * B + C * DC * D + B * Aも同等です。検出するのがより難しいかもしれ

別のケースでは、私がこれまで持ってA - B - C - DA - (C + B + D)

アイデアです:

  1. (優先順位と結合性を追跡することによって)、必要なときにのみ、括弧を使用して。
  2. 比較を容易にするためのオペランドの順序。
+0

あなたのアルゴリズムは、インフィックス、ポストフィックスまたはポリッシュの表記法と同時に動作する可能性がありますか? –

+0

いいえ、2つの算術式が等しいかどうかを調べることができますが、どの表記法でも同じように気にしません。 –

答えて

1

可能なすべての式を生成して24にした後、正規化ステップを追加します。このステップの目的は、冗長な括弧を削除することです。

remove redundant parenthesis is given hereの良い説明。その後、正規化されたすべての式のセットが得られます。

+0

これは始まりですが、より多くの正規化が必要です。おそらく '2 + 4 + 9 + 9'​​は' 4 + 9 + 2 + 9'​​と同じであると考えています。これを行うには、すべてのオペランドの順序を '+'や '*'のような連想型および可換型の演算子(たとえば、最小のもの)に絞り込みます。 –

+1

@j_random_hackerはい、あなたは正しいです。ありがとう、私はそれを忘れてしまった。そして、はい、それは可換オペレータのグループ内でオペランドをソートすることで解決できます。あなたはマイナスについても忘れました。 '(a -b -c)'です。マイナスは+: 'a +(-b)+(-c)'のように扱い、-bと-cをソートすることができます。 –