◂ 7 décembre 2015 ▸
Some Assembly Required :
- code.py
import sys
f = open('input.txt', 'r')
linesOrig = list(map(str.strip, f.readlines()))
def erreur(message):
print("Erreur: " + message, file=sys.stderr)
exit(1)
instructions = {}
for line in linesOrig:
line = line.split(' ')
out = line.pop()
assert line.pop() == '->' or erreur("pas de fleche en avant-derniere position ?")
if len(line) == 1:
operation = "REF"
else:
operation = line.pop(-2)
instructions[out] = (operation, line)
def getValue(wireName, wiresValues, instructions):
if wireName.isnumeric():
return int(wireName)
if wireName in wiresValues:
return wiresValues[wireName]
else:
return calcValue(wireName, wiresValues, instructions)
def calcValue(wireName, wiresValues, instructions):
# operation, args = instructions.pop(wireName) # pas une bonne idee si on veut reutiliser pour la 2e partie
operation, args = instructions[wireName]
if operation == 'REF':
value = getValue(args[0], wiresValues, instructions)
elif operation == 'NOT':
value = 2**16 - 1 - getValue(args[0], wiresValues, instructions) # ~getValue(...) + 2**16
elif operation in ('LSHIFT','RSHIFT'):
arg = getValue(args[0], wiresValues, instructions)
shift = int(args[1])
if operation == 'RSHIFT':
value = arg >> shift
else:
value = (arg << shift) % (2**16) # (arg << shift) & (2**16 - 1)
else:
arg1 = getValue(args[0], wiresValues, instructions)
arg2 = getValue(args[1], wiresValues, instructions)
if operation == 'AND':
value = arg1 & arg2
elif operation == 'OR':
value = arg1 | arg2
else:
erreur("operation inconnue: " + operation)
wiresValues[wireName] = value
return value
wiresValues = {}
valA = getValue('a', wiresValues, instructions)
print("1re partie:", valA)
wiresValues = {'b':valA}
valA = getValue('a', wiresValues, instructions)
print("2e partie:", valA)