2011-12-20 5 views
3

私はPythonでユーザーが数学的な質問に答えることができる小さなアプリを書いています。私が抱えている問題は、彼らの答えをチェックすることです。2つの数学的回答が同等かどうかを確認してください

質問は次のようにあります言ってやるがいい。「Factorise x^2 + 3x +2

これに答えるためのさまざまな方法があります。例えば:

  • (X + 1)(X + 2)
  • (X + 2)(x + 1)
  • (2 + X)(X + 1)

答えは別のと等価であるかどうかをチェックしますライブラリはありますか?特に、与えられた答えを単純化しないもの。そう:

(x + 1)(x + 2) === (2 + x)(x + 1)

しかし

(x + 1)(x + 2) == x^2 + 3x +2

私はこのためにwolframalphaを使用して考えた - これは可能でしょう - ので、どのような構文は、私が使用するかどうか! ?

ありがとうございます!

+4

これはもはやPythonの小さなアプリです... – antlersoft

+2

http://code.google.com/p/sympy/ –

+0

あなたはどのようなプリミティブをあなたの表現に使用できますか? exp、ln、sin、cosを許可しますか? (そうした場合、単純化問題は解決できなくなります) –

答えて

1

sympyのような記号的な数学ライブラリを試してみることができます。

は、あなたの答えと、ユーザーによって提供される1両方にsimplifyロジックを呼び出します。この問題は、ドキュメントに記さ両方のアドレスにロジックを実行:この機能はしようと

正確な戦略は、あなたがwimsを見てみたいことがあり、将来のバージョンSymPy

+0

これは非常に有望に見える - 提案のおかげで。しかし、ユーザーが元の質問を入力して正しいとフラグを立てることができるという問題は残っています... – bluepnume

+0

@bluepnume多項式を因数分解する特定のケースでは、 'x'のすべての出現を最初のもの電源のみ。多分それは、ソリューションの構造を強制するための正規表現と結びついています。 – nsanders

0

うんウルフラムアルファは、(ちょうど検索にあなたの条件を固執し、それはブール値を返します)これを処理します。

あなたは明らかにあなたがthe Wolfram Alpha APIに回すことができるように、各1のためにそれを行うにはしたくありません。彼らはPythonライブラリを持っており、非商用利用のために無料で、最大2000ヶ月間の呼び出しが可能です。商用通話またはより多くの通話が必要な場合は、月額料金が適用されます。

あり(Pythonのような)ローカルオプションがありますが、あなたはおそらく、ユーザーが悪質なPythonコードに渡し、ちょうどすべてをサポートしていないことを確認すること、書式設定、構文を使用して多くの問題があるでしょう。 WA-APIは、あなたの問題の大半を取り除きますが、最初にテストしてください。

+0

素晴らしいですが、ユーザーが質問を回答として入力して正しいとマークするのを防ぐ方法を考えてもいいですか? – bluepnume

+0

それはもっと簡単です。あなたが因数分解している場合、括弧のグループ、別々のxグループなどがあるかどうかのように、答えの中の特定のものを探す必要があります。しかし、ユーザーはWAに質問を残してテストに出ることができます。 – Oli

0

SymPyを試してみてください。あなたの問題を解決するのに役立つかもしれません。

0

に変更することができます。 AFAIKはPythonで書かれていませんが、オープンソースなので、コードを見ていくつかのアイデアを得ることができます。

0

私はあなたのようなもののためのライブラリが必要とは思わない。ユーザーの入力は、プログラムが理解できる答え(文字列が意味するもの)に限定されています。逆の操作をして質問にマッチすることで答えが正しいかどうかを調べるか、簡単な方法でラジオボタンを選択します。だからあなたの例を使って、あなたのプログラムが与えた答えを展開し、それをx^2 + 3x + 2に対してチェックする。

+0

この質問の例に対する正解の少なくとも10の異なる順列があります。 10人の異なる正解を入力するようユーザー/教師に要求することを真剣に考えていますか?この問題は、基本的な算術ルールで少なくとも部分的に解決可能でなければなりません。 –

+0

私の方法では、プログラムは入力をチェックする文字列として10個以上の答えを持つ必要はありません。ユーザー入力(ユーザーの回答)を取得し、展開を生成し、尋ねられた内容(教師が入力した質問)のコピーと照合します。因数分解の例では、プログラムは入力を取り込み、トークン化して、その結果を標準形式(文字列や係数の配列など)で乗算して吐き出します。その答えを同じ形式で保持するコードを書くのは簡単です。 – daniel

+0

それから私はあなたの答えを誤解しているはずです:-) –

関連する問題