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