2011-12-17 15 views
0

私が代わりにいくつかの条件文のブール代数を使用したい、例えばの代わりに、私はブール代数を使用したい文、

def boo(x,y): 
    if x==3 and y==1: return 4 
    if x==3 and y==4: return 1 
    if x==4 and y==1: return 2 
    if x==4 and y==2: return 1 
    if x==5 and y==1: return 3 

場合、私は何をしたいのか、いくつかを使用すると、

def simple(x,y): 
    return x#y 

です合計12の方程式がありますが、私はちょうどブール演算子である(x#y)を直接返したいと思います。私はこれを、幸いなことに関係を見つけた小さな問題にしました。この場合も同じことをしたいのですが、どのように進めるのですか?

これはいくつかのif条件を通過しないため、パフォーマンスが向上しますか? これは通常の練習ですか?

サンプル:

x y output 
1 2  3 
1 3  2 
1 4  5 
1 5  4 

ここでは、単純なビット単位のXORゲートは

def(x,y): return x^y 
+0

あなたの関係の性質についてもっと詳しく教えてください。その制約をあまり知らずに、問題の表現を数学的に最適化する方法を言うのは難しいです。ネストされた 'dictionary 'を使うよりももっとエレガントな方法があるかもしれませんが、おもちゃの問題でよく見られるように、あなたが何を期待できるのか正確に理解する必要があります。 –

+0

私はビット賢明な操作を使ってこれを行う一般的な手順を探しています。私は、学部のエレクトロニクスクラスでこのような問題を覚えています。小さな例で質問を更新してください。私はちょうど興味があります。通常のケースでは、ディクショナリを使う方がよりエレガントな方法です。 – syllogismos

+0

入力がブール値でないときにブール代数を使う方法を想像することはできません。あなたが関係を知る方法については、よく...あなたが関係を知らないなら、あなたはどのようにして12の別々の入力に対する正しい答えを知っていますか? –

答えて

1

私は、上記のロジックのより簡潔な表現を見つけようとすると、より読みやすいコードにつながるかどうかわかりません。おそらくない。あなたはすべての値が指定された場合に一致することがわかっている場合は、あなたを

def boo(x, y): 
    return {(3,4):1, (4,2):1, (4,1):2, (5,1):3, (3,1):4}.get((x, y), None) 

def boo(x, y): 
    p = (x, y) 
    return (1 if p in ((3, 4), (4, 2)) else 
      2 if p == (4, 1) else 
      3 if p == (5, 1) else 
      4 if p == (3, 1) else 
      None) 

別のオプションは、辞書を使用することです:より多くの数学的な処方にそのまましかし、あなたはロジックを修正することができます.get((x, y), None)の代わりに[(x, y)]と書くことができます。

+0

実際には12の関係があるので、辞書を使用してよりクリーンな方法です – syllogismos

2

を行いますあなたはあなたの条件文と同じ値を生成する権利表現を見つけることができますが、そのようなコードが読みにくくなり、維持する。

より良い解決策は、入力値を使用して索引付けできるネストされたリストまたはディクショナリを使用することです。このようにして、コードをデータに変換します。このデータは、マッピングの明確で迅速な表現であり、将来容易に理解でき、容易に変更することができます。

+0

これはパズルの問題です、誰もそれを読むつもりはありません私を除いて...辞書を使用することは感謝しています..しかし、私はまた、関係を見つける方法が好奇心です。 – syllogismos

+0

あなたが本当にそれをしていたら、あなたはいくつかの可能性を持っています。 1つはすべての条件を取って、int()で整数に変換し、期待される結果を掛け、すべての選択肢を合計します。 1つの選択肢のみが非ゼロの結果をもたらす。別の方法は、多項式を利用することです。各入力に対して正しい結果をもたらす多項式を検索します。多項式係数の連立方程式系を書くことでこれを始めると、係数を使って結果を計算する式を書くことになります。辞書はあなたの友達です! –

+0

私は8ビットの入力があり、予想される出力から論理ゲートを設計するこの種の問題を覚えています。だから私は最初のこの質問をしました。まっすぐ前方の問題のように見えて、私は他の方法でそれを最適化することを考えることができませんでした:( – syllogismos

0

辞書の使用を検討することができます。おそらく辞書の辞書を作って、あなたの関数に辞書を介して値を取得させることができます。

def boo(x,y): 
    if x==3 and y==1: return 4 
    if x==3 and y==4: return 1 
    if x==4 and y==1: return 2 
    if x==4 and y==2: return 1 
    if x==5 and y==1: return 3 

def boodict(x,y): 
    d1 = {3: {1:4, 4:1} ,4: {1:2, 2:1},5: {1:3}} 
    try: 
     value = d1[x][y] 
    except KeyError: 
     value = None 
    return value 
関連する問題