with open('data-2015-07.txt', 'r') as f:
logics = f.read().splitlines()Advent of Code 2015 Day 7
— Day 7: Some Assembly Required —
In little Bobby’s kit’s instructions booklet (provided as your puzzle input), what signal is ultimately provided to wire a?
This might be a similar construction to yesterday’s instructions:
- input
- wire1
- operation
- wire2
- output
Sometimes there is only input and output i.e. if it’s a number on the left hand side. For a NOT operator there is only wire2.
Operators are:
NOT ~AND &OR |RSHIFT >>LSHIFT <<
print('Total: ' + str(len(logics)))
def lens(lst, op='AND'):
return len([x for x in lst if op in x])
print('AND: ' + str(lens(logics, 'AND')))
print('OR: ' + str(lens(logics, 'OR')))
print('NOT: ' + str(lens(logics, 'NOT')))
print('RSHIFT: ' + str(lens(logics, 'RSHIFT')))
print('LSHIFT: ' + str(lens(logics, 'LSHIFT')))
print('Sub-Total:' +
str(lens(logics, 'AND') + lens(logics, 'OR') +
lens(logics, 'NOT') + lens(logics, 'RSHIFT') +
lens(logics, 'LSHIFT')))Total: 339
AND: 112
OR: 80
NOT: 48
RSHIFT: 64
LSHIFT: 32
Sub-Total:336
The remaining instructions after all the others above:
1674 -> b0 -> clx -> a
I’m not sure how to make this efficient. There doesn’t seem like a good way to loop through these instructions to fill out wires and signals. We need to gather a dictionary of all the possible wires first, I think, then populate that dictionary.
# get the before and after pieces
logic_split = [x.split(' -> ') for x in logics]
# we want to get the targets in a dictionary and then populate that dictionary
targets_list = [x[1] for x in logic_split]
targets = dict.fromkeys(targets_list)
# split by space for signals
signals_list = [x[0].split(' ') + [False] for x in logic_split]I think we’re in a good place to start iterating.
i = 0
while None in targets.values():
# while i < 100:
# sum([1 for x in targets.values() if x is None])
i += 1
for s,t in zip(signals_list, targets_list):
if s[-1]:
# we've already processed
if targets[t] is None:
raise('This is awful')
elif len(s) == 4:
# get some information from the signals
try: m = targets[s[0]]
except: m = int(s[0])
try: n = targets[s[2]]
except: n = int(s[2])
# these need to both be populated
if isinstance(m, int) and isinstance(n, int):
print(str(m) + ' ' + s[1] + ' ' + str(n) + ' -> ' + t)
if s[1] == 'AND':
targets[t] = m & n
elif s[1] == 'OR':
targets[t] = m | n
elif s[1] == 'LSHIFT':
targets[t] = m << n
elif s[1] == 'RSHIFT':
targets[t] = m >> n
else:
raise('this is bad')
# skip this instruction next time
s[-1] = True
# this is always NOT
elif len(s) == 3:
if isinstance(targets[s[1]], int):
print('NOT ' + str(s[1]) + ' -> ' + t)
targets[t] = ~ targets[s[1]]
s[-1] = True
# this is usually a number, but might also be the answer
elif len(s) == 2:
if s[0].isdigit():
print('ONE: ' + str(s[0]) + ' -> ' + t)
targets[t] = int(s[0])
s[-1] = True
else:
# print(t + ': ' + str(s[0]))
targets[t] = targets[s[0]]
else:
raise('this is not good')ONE: 0 -> c
ONE: 1674 -> b
0 LSHIFT 1 -> t
1674 RSHIFT 1 -> v
1674 RSHIFT 5 -> f
1674 RSHIFT 2 -> d
1674 RSHIFT 3 -> e
209 OR 52 -> g
209 AND 52 -> h
NOT h -> i
245 AND -17 -> j
418 AND 229 -> l
NOT l -> m
418 OR 229 -> k
487 AND -161 -> n
1674 AND 327 -> p
1674 OR 327 -> o
NOT p -> q
1999 AND -3 -> r
1 AND 1997 -> s
0 OR 1 -> u
1 LSHIFT 15 -> w
837 OR 32768 -> x
33605 RSHIFT 2 -> y
33605 RSHIFT 3 -> z
33605 RSHIFT 1 -> aq
33605 RSHIFT 5 -> aa
1 LSHIFT 1 -> ao
4200 OR 1050 -> ab
4200 AND 1050 -> ac
NOT ac -> ad
5242 AND -9 -> ae
8401 OR 5234 -> af
8401 AND 5234 -> ag
NOT ag -> ah
13555 AND -81 -> ai
33605 AND 13475 -> ak
33605 OR 13475 -> aj
NOT ak -> al
47079 AND -2 -> am
1 AND 47078 -> an
0 LSHIFT 15 -> ar
16802 OR 0 -> as
2 OR 0 -> ap
16802 RSHIFT 2 -> at
2 LSHIFT 1 -> bj
16802 RSHIFT 5 -> av
16802 RSHIFT 3 -> au
2100 AND 525 -> ax
16802 RSHIFT 1 -> bl
2100 OR 525 -> aw
NOT ax -> ay
2621 AND -5 -> az
4200 OR 2617 -> ba
4200 AND 2617 -> bb
NOT bb -> bc
6777 AND -41 -> bd
16802 AND 6737 -> bf
NOT bf -> bg
16802 OR 6737 -> be
23539 AND -1 -> bh
1 AND 23539 -> bi
4 OR 1 -> bk
1 LSHIFT 15 -> bm
5 LSHIFT 1 -> ce
8401 OR 32768 -> bn
41169 RSHIFT 3 -> bp
41169 RSHIFT 5 -> bq
41169 RSHIFT 2 -> bo
41169 RSHIFT 1 -> cg
5146 OR 1286 -> br
5146 AND 1286 -> bs
NOT bs -> bt
5406 AND -1027 -> bu
10292 OR 4380 -> bv
10292 AND 4380 -> bw
NOT bw -> bx
14652 AND -21 -> by
41169 AND 14632 -> ca
41169 OR 14632 -> bz
NOT ca -> cb
47609 AND -8193 -> cc
1 AND 39417 -> cd
1 LSHIFT 15 -> ch
10 OR 1 -> cf
20584 OR 32768 -> ci
53352 RSHIFT 2 -> cj
53352 RSHIFT 3 -> ck
53352 RSHIFT 5 -> cl
53352 RSHIFT 1 -> db
11 LSHIFT 1 -> cz
6669 AND 1667 -> cn
NOT cn -> co
6669 OR 1667 -> cm
7823 AND -514 -> cp
13338 OR 7310 -> cq
13338 AND 7310 -> cr
NOT cr -> cs
15518 AND -5131 -> ct
53352 OR 10388 -> cu
53352 AND 10388 -> cv
NOT cv -> cw
63740 AND -1 -> cx
1 AND 63740 -> cy
22 OR 0 -> da
0 LSHIFT 15 -> dc
22 LSHIFT 1 -> du
26676 OR 0 -> dd
26676 RSHIFT 2 -> de
26676 RSHIFT 3 -> df
26676 RSHIFT 5 -> dg
26676 RSHIFT 1 -> dw
3334 AND 833 -> di
3334 OR 833 -> dh
NOT di -> dj
3911 AND -257 -> dk
6669 OR 3655 -> dl
6669 AND 3655 -> dm
NOT dm -> dn
7759 AND -2566 -> do
26676 OR 5194 -> dp
26676 AND 5194 -> dq
NOT dq -> dr
31870 AND -1 -> ds
1 AND 31870 -> dt
44 OR 0 -> dv
44 LSHIFT 1 -> ep
0 LSHIFT 15 -> dx
13338 OR 0 -> dy
13338 RSHIFT 1 -> er
13338 RSHIFT 3 -> ea
13338 RSHIFT 2 -> dz
13338 RSHIFT 5 -> eb
1667 AND 416 -> ed
1667 OR 416 -> ec
NOT ed -> ee
1955 AND -129 -> ef
3334 AND 1827 -> eh
3334 OR 1827 -> eg
NOT eh -> ei
3879 AND -1283 -> ej
13338 AND 2597 -> el
13338 OR 2597 -> ek
NOT el -> em
15935 AND -1 -> en
1 AND 15935 -> eo
1 LSHIFT 15 -> es
6669 OR 32768 -> et
39437 RSHIFT 1 -> fm
88 OR 1 -> eq
89 LSHIFT 1 -> fk
39437 RSHIFT 5 -> ew
39437 RSHIFT 3 -> ev
4929 AND 1232 -> ey
39437 RSHIFT 2 -> eu
4929 OR 1232 -> ex
NOT ey -> ez
6097 AND -65 -> fa
9859 AND 6033 -> fc
9859 OR 6033 -> fb
NOT fc -> fd
14227 AND -1666 -> fe
39437 AND 12562 -> fg
39437 OR 12562 -> ff
NOT fg -> fh
47903 AND -4097 -> fi
1 AND 43807 -> fj
178 OR 1 -> fl
1 LSHIFT 15 -> fn
179 LSHIFT 1 -> gf
19718 OR 32768 -> fo
52486 RSHIFT 1 -> gh
52486 RSHIFT 2 -> fp
52486 RSHIFT 3 -> fq
52486 RSHIFT 5 -> fr
6560 AND 1640 -> ft
6560 OR 1640 -> fs
NOT ft -> fu
8168 AND -33 -> fv
13121 AND 8136 -> fx
13121 OR 8136 -> fw
NOT fx -> fy
16329 AND -4929 -> fz
52486 AND 11401 -> gb
52486 OR 11401 -> ga
NOT gb -> gc
60815 AND -3073 -> gd
1 AND 57743 -> ge
358 OR 1 -> gg
1 LSHIFT 15 -> gi
26243 OR 32768 -> gj
59011 RSHIFT 1 -> hc
359 LSHIFT 1 -> ha
59011 RSHIFT 2 -> gk
59011 RSHIFT 3 -> gl
59011 RSHIFT 5 -> gm
7376 AND 1844 -> go
7376 OR 1844 -> gn
NOT go -> gp
8180 AND -1041 -> gq
14752 OR 7140 -> gr
14752 AND 7140 -> gs
NOT gs -> gt
15332 AND -6561 -> gu
59011 AND 8772 -> gw
59011 OR 8772 -> gv
NOT gw -> gx
59079 AND -8705 -> gy
1 AND 50375 -> gz
718 OR 1 -> hb
1 LSHIFT 15 -> hd
29505 OR 32768 -> he
62273 RSHIFT 3 -> hg
62273 RSHIFT 2 -> hf
719 LSHIFT 1 -> hv
62273 RSHIFT 1 -> hx
62273 RSHIFT 5 -> hh
7784 AND 1946 -> hj
NOT hj -> hk
7784 OR 1946 -> hi
8186 AND -1545 -> hl
15568 AND 6642 -> hn
NOT hn -> ho
15568 OR 6642 -> hm
15858 AND -6353 -> hp
62273 AND 9506 -> hr
NOT hr -> hs
62273 OR 9506 -> hq
63331 AND -8449 -> ht
1 AND 54883 -> hu
1 LSHIFT 15 -> hy
1438 OR 1 -> hw
31136 OR 32768 -> hz
1439 LSHIFT 1 -> iq
63904 RSHIFT 1 -> is
63904 RSHIFT 3 -> ib
63904 RSHIFT 5 -> ic
63904 RSHIFT 2 -> ia
7988 OR 1997 -> id
7988 AND 1997 -> ie
NOT ie -> if
8189 AND -1797 -> ig
15976 AND 6393 -> ii
NOT ii -> ij
15976 OR 6393 -> ih
16121 AND -6249 -> ik
63904 OR 9873 -> il
63904 AND 9873 -> im
NOT im -> in
65457 AND -8321 -> io
1 AND 57137 -> ip
1 LSHIFT 15 -> it
2878 OR 1 -> ir
31952 OR 32768 -> iu
64720 RSHIFT 1 -> jn
2879 LSHIFT 1 -> jl
64720 RSHIFT 2 -> iv
64720 RSHIFT 3 -> iw
64720 RSHIFT 5 -> ix
8090 AND 2022 -> iz
8090 OR 2022 -> iy
NOT iz -> ja
8190 AND -1923 -> jb
16180 OR 6268 -> jc
16180 AND 6268 -> jd
NOT jd -> je
16252 AND -6197 -> jf
64720 OR 10056 -> jg
64720 AND 10056 -> jh
NOT jh -> ji
65496 AND -9281 -> jj
1 AND 56216 -> jk
5758 OR 0 -> jm
0 LSHIFT 15 -> jo
5758 LSHIFT 1 -> kg
32360 OR 0 -> jp
32360 RSHIFT 2 -> jq
32360 RSHIFT 3 -> jr
32360 RSHIFT 5 -> js
4045 OR 1011 -> jt
32360 RSHIFT 1 -> ki
4045 AND 1011 -> ju
NOT ju -> jv
4095 AND -962 -> jw
8090 OR 3134 -> jx
8090 AND 3134 -> jy
NOT jy -> jz
8126 AND -3099 -> ka
32360 AND 5028 -> kc
32360 OR 5028 -> kb
NOT kc -> kd
32748 AND -4641 -> ke
1 AND 28108 -> kf
0 LSHIFT 15 -> kj
11516 OR 0 -> kh
16180 OR 0 -> kk
11516 LSHIFT 1 -> lb
16180 RSHIFT 2 -> kl
16180 RSHIFT 5 -> kn
16180 RSHIFT 1 -> ld
16180 RSHIFT 3 -> km
2022 AND 505 -> kp
2022 OR 505 -> ko
NOT kp -> kq
2047 AND -481 -> kr
4045 AND 1567 -> kt
NOT kt -> ku
4045 OR 1567 -> ks
4063 AND -1550 -> kv
16180 AND 2514 -> kx
16180 OR 2514 -> kw
NOT kx -> ky
16374 AND -2321 -> kz
1 AND 14054 -> la
23032 OR 0 -> lc
0 LSHIFT 15 -> le
23032 LSHIFT 1 -> lw
8090 OR 0 -> lf
8090 RSHIFT 2 -> lg
8090 RSHIFT 5 -> li
8090 RSHIFT 1 -> ly
8090 RSHIFT 3 -> lh
1011 AND 252 -> lk
1011 OR 252 -> lj
NOT lk -> ll
1023 AND -241 -> lm
2022 AND 783 -> lo
2022 OR 783 -> ln
NOT lo -> lp
2031 AND -775 -> lq
8090 OR 1257 -> lr
8090 AND 1257 -> ls
NOT ls -> lt
8187 AND -1161 -> lu
1 AND 7027 -> lv
46064 OR 1 -> lx
1 LSHIFT 15 -> lz
4045 OR 32768 -> ma
46065
— Part Two —
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?