def main():
    with open(filename, 'r') as f:
        lines = f.read().splitlines()
        
        #first pass -- Move numeric direct assignments to the top
        for line_index, line in enumerate(lines):
            if  CircuitBookletReader.is_numeric_assignment(line):
                final_instructions.append(line)
                lines_to_delete.append(line_index)
                
        new_instructions = [instruction for inst_ind, instruction in enumerate(lines) if inst_ind not in lines_to_delete] 
        lines_to_delete = []

        print(new_instructions)
        i = 0
        while(True):
            print(i)
            i += 1
            if i == 100:
                break
            #get wires
            defined_wires = [CircuitBookletReader.give_wire(inst) for inst in final_instructions]
            if i == 99:
                print(defined_wires)

            #second pass -- okay to move lines with only direct assignments on the left
            for line_index2, line2 in enumerate(new_instructions):
                gate, gate_index = CircuitBookletReader.give_gate(line2)
                if gate_index is None:
                   lefthand = line2[0] 
                   if lefthand in defined_wires:
                       final_instructions.append(line2)
                       lines_to_delete.append([line_index2])
                elif gate == 'AND' or gate == 'OR':
                    left_op, right_op = CircuitBookletReader.give_left_right_operands(line2, gate_index)
                    if left_op in defined_wires and right_op in defined_wires:
                        final_instructions.append(line2)
                        lines_to_delete.append([line_index2])
                elif gate[1:] == 'SHIFT':
                    left_op = line2[0]
                    if left_op in defined_wires:
                        final_instructions.append(line2)
                        lines_to_delete.append([line_index2])

            new_instructions = [instruction for inst_ind, instruction in enumerate(new_instructions) if inst_ind not in lines_to_delete] 
            print(len(new_instructions))
            sys.exit()
            lines_to_delete = []

    print(len(new_instructions))
    print(len(final_instructions))
    def get_operands(instruction):
        self.instruction_gate, index = CircuitBookletReader.give_gate(line)
        words = instruction.split(' ')
        if gate == '':
            self.operands.append(words[0])


                '''
def process_line(filename):
    with open(filename, 'r') as f:
        lines = f.read().splitlines()
        for line in lines:
            words = line.split(' ')
            wire_name = CircuitBookletReader.give_wire(line)
            gate, index = CircuitBookletReader.give_gate(line)
            if gate == '':
                wire_signals[wire_name] = CircuitBookletReader.Signal(words[0])
            if gate == 'NOT':
                if wire_name in list(wire_signals.keys()):
                    wire_signals[wire_name].value = ~wire_signals[words[1]]
                else:
                    wire_signals[wire_name] = CircuitBookletReader.Signal(~wire_signals[words[1]])
            if gate == 'OR':
                if wire_name in list(wire_signals.keys()):
                    wire_signals[wire_name].value = wire_signals[words[0]] | wire_signals[words[2]]
                else:
                    wire_signals[wire_name] = CircuitBookletReader.Signal(wire_signals[words[0]] | wire_signals[words[2]])
            if gate == 'AND':
                if wire_name in list(wire_signals.keys()):
                    wire_signals[wire_name].value = wire_signals[words[0]] & wire_signals[words[2]]
                else:
                    wire_signals[wire_name] = CircuitBookletReader.Signal(wire_signals[words[0]] & wire_signals[words[2]])
            if gate == 'lshift':
                if wire_name in list(wire_signals.keys()):
                    wire_signals[wire_name].value = operator.lshift(wire_signals[words[0]], int(words[2]))
                else:
                    wire_signals[wire_name] = CircuitBookletReader.Signal(operator.lshift(wire_signals[words[0]], int(words[2])))
            if gate == 'RSHIFT':
                if wire_name in list(wire_signals.keys()):
                    wire_signals[wire_name].value = operator.rshift(wire_signals[words[0]], int(words[2]))
                else:
                    wire_signals[wire_name] = CircuitBookletReader.Signal(operator.rshift(wire_signals[words[0]], int(words[2])))

        pprint.pprint(wire_signals,indent=4)
Ejemplo n.º 4
0
filename = sys.argv[2]
#outfile = sys.argv[3]
signal_tree = SignalTree(wire_of_interest)

#list of two lists:
# first list holds depth,
# second list holds breadth
while True:
    #with open(outfile, 'r') as check_outfile:
        #lines = check_outfile.read().splitlines()
    #true check:
    #if lines[-1][0].isdigit():
    #current check:
    if twice:
        print(signal_tree.find_last_leaf())
        sys.exit
        
    with open(filename, 'r') as instruction_f:
        lines = instruction_f.read().splitlines()
        for line in lines:
            words = line.split(' ')
            wire_name = CircuitBookletReader.give_wire(line)
            if wire_name == wire_of_interest:
                signal_tree.add(line[-1])
                last_leaf = signal_tree.find_last_leaf()
                last_leaf.get_operands(line)


                #print_wire = open(outfile, 'a')
                #print_wire.write(line)