Day 7

Part 1

This year, Santa brought little Bobby Tables a set of wires and bitwise logic gates! Unfortunately, little Bobby is a little under the recommended age range, and he needs help assembling the circuit.

Each wire has an identifier (some lowercase letters) and can carry a 16-bit signal (a number from 0 to 65535). A signal is provided to each wire by a gate, another wire, or some specific value. Each wire can only get a signal from one source, but can provide its signal to multiple destinations. A gate provides no signal until all of its inputs have a signal.

The included instructions booklet describes how to connect the parts together: x AND y -> z means to connect wires x and y to an AND gate, and then connect its output to wire z.

For example:

  • 123 -> x means that the signal 123 is provided to wire x.
  • x AND y -> z means that the bitwise AND of wire x and wire y is provided to wire z.
  • p LSHIFT 2 -> q means that the value from wire p is left-shifted by 2 and then provided to wire q.
  • NOT e -> f means that the bitwise complement of the value from wire e is provided to wire f.

Other possible gates include OR (bitwise OR) and RSHIFT (right-shift). If, for some reason, you'd like to emulate the circuit instead, almost all programming languages (for example, C, JavaScript, or Python) provide operators for these gates.

For example, here is a simple circuit:

123 -> x
456 -> y
x AND y -> d
x OR y -> e
x LSHIFT 2 -> f
y RSHIFT 2 -> g
NOT x -> h
NOT y -> i

After it is run, these are the signals on the wires:

d: 72
e: 507
f: 492
g: 114
h: 65412
i: 65079
x: 123
y: 456

In little Bobby's kit's instructions booklet (provided as your puzzle input), what signal is ultimately provided to wire a? )


In [1]:
RSHIFT=: (2^16) | ((34 b.)~ -@])
LSHIFT=: (2^16) | (34 b.)~
AND=: (2^16) | 17 b.
OR=: (2^16) | 23 b.
NOT=: (2^16) | 26 b.

NB. need to sort instructions to make sure dependent lines are after starting ones
getIds=: [: ({: , }:)@;:;._2 ('ANDLRSHIFT->O1234567890') -.~ ]
isParent=: {."1 e. [: (a: -.~ ~.)@, }."1
getGen=: +/@(e."2 (#~ isParent)^:a:)@getIds
sortPed=: \: getGen

getCmds=: <@([: '=. '&joinstring [: |. ' -> '&splitstring);._2

input=: freads '~AoC/2015/aoc07_input.txt'
runCircuit=: 3 : ((getCmds sortPed ]) input)
    
echo 'Day7 Part1: ',": runCircuit ''


Day7 Part1: 16076

Part 2

Now, take the signal you got on wire a, override wire b to that signal, and reset the other wires (including wire a). What new signal is ultimately provided to wire a?


In [2]:
runCircuit2=: 3 : (('a=. y';'b=. a') ,}. ((getCmds sortPed ]) input))

echo 'Day7 Part1: ',": runCircuit2^:2  ] 19138


Day7 Part1: 2797