Advent of code

 7 décembre 2015 

  Some Assembly Required :
  1. 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)