, , . , , , . XOR.
, ACC ( False) ACC, :
ACC <- ACC or MUT
MUT <- True
, rules, bools, , 0..n . , XOR [[True, True, True], [False, False, True], [False, True, False], [True, False, False]].
, , :
def generateCode (rules):
rules = [rule for rule in rules if rule [0] ]
if not rules: return []
opcodes = []
for rule in rules:
rule = rule [1:]
negs = [i for i, e in enumerate (rule) if not e]
poss = [i for i, e in enumerate (rule) if e]
if negs:
opcodes.append ('NOT')
for neg in negs: opcodes.append ('OR[{}]'.format (neg) )
opcodes.append ('NOT')
if poss:
for pos in poss: opcodes.append ('AND[{}]'.format (pos) )
opcodes.append ('ACC')
return opcodes
, , ['AND[0]', 'AND[1]', 'ACC', 'NOT', 'OR[0]', 'OR[1]', 'NOT', 'ACC'], .
, . reset, ACC .
class CPU:
def reset (self, inputs):
self.MUT = True
self.ACC = False
self.INP = inputs [:]
def __call__ (self, opcodes):
for opcode in opcodes:
if opcode == 'NOT':
self.MUT = not self.MUT
continue
if opcode == 'ACC':
self.ACC = self.ACC or self.MUT
self.MUT = True
continue
if opcode [0] == 'O':
inp = int (opcode [3:-1] )
self.MUT = self.MUT or self.INP [inp]
continue
if opcode [0] == 'A':
inp = int (opcode [4:-1] )
self.MUT = self.MUT and self.INP [inp]
continue
raise Exception ('Need more dried frog pills.')
return self.ACC
, , , , , , .