roiti46's blog

主に競プロ問題の解説を載せてます

AOJ 1155: How can I satisfy thee? Let me count the ways...

同じく論理式の評価問題。演算子オーバーロードを初めて有効に使えた気がする。

問題はこちら

問題

3値論理式(0:偽、1:未知、2:真)が与えられる。P,Q,Rの3つの変数をそれぞれ0,1,2と変えていったときに、与えられた論理式が2となる場合はいくつあるか答えよ。

解法

演算子オーバーロードを使えばすっきりと書ける。

3値論理演算表にしたがってそれぞれの演算をオーバーロードして、evalで評価してやればいい。途中replaceで数字をmyboolインスタンスに変換してるのが少し汚い気もする。

import itertools as it
class mybool:
    def __init__(self, value):
        self.value = value
    def __neg__(self):
        return mybool(2-self.value)
    def __mul__(self, other):
        return mybool(min(self.value,other.value))
    def __add__(self, other):
        return mybool(max(self.value,other.value))
 
while 1:
    s = raw_input()
    if s == ".": break
 
    for i in xrange(3):
        s = s.replace(str(i),"mybool(%d)"%i)
     
    ans = 0
    for p,q,r in it.product([0,1,2],repeat=3):
        P,Q,R = mybool(p),mybool(q),mybool(r)
        if eval(s).value == 2:
            ans += 1
     
    print ans