Day 7

Day 7.1

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. In little Bobby's kit's instructions booklet (provided as your puzzle input), what signal is ultimately provided to wire a?

Approach 1: Create a single expression by recursive substitution, then evaluate!


In [20]:
binary_command = {'NOT': '~', 'AND': '&', 'OR': '|', 'LSHIFT': '<<', 'RSHIFT': '>>'}
operators = binary_command.values()

In [21]:
import csv

def translate(l):
    return [binary_command[a] if a in binary_command else a for a in l]

def display(input_file):

    """produce a dict mapping variables to expressions"""
    
    commands = []
    with open(input_file, 'rt') as f_input:
        csv_reader = csv.reader(f_input, delimiter=' ')
        for line in csv_reader:
            commands.append((line[-1], ' '.join(list(translate(line[:-2])))))
    return dict(commands)

In [32]:
import re

def extract_variables(expr):
    varbls = []
    regex_pattern = '\s|\\)|\\('
    l = re.split(regex_pattern, expr)
    for a in l:
        if (a not in operators) and (not a.isnumeric()) and (a != ''):
            varbls.append(a)
    return set(varbls)


def create_instance(wire):
    exec_python = commands[wire]
    pending = extract_variables(commands[wire])
    count = 0
    while pending and (count < 200):
        s = pending.pop()
        expr = commands[s]
        exec_python = re.sub('({0})'.format(s), '( {0} )'.format(expr), exec_python)
        pending = pending.union(extract_variables(exec_python))
        count += 1
    return wire + ' = ' + exec_python

def evaluate(var):
    instance = create_instance(var)
    exec(instance)
    return np.uint16(locals()[var])

Test

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 [40]:
commands = display('inputs/input7.test.txt')

In [41]:
def test():
    assert(evaluate('d') == 72)
    assert(evaluate('e') == 507)
    assert(evaluate('f') == 492)
    assert(evaluate('g') == 114)
    assert(evaluate('h') == 65412)
    assert(evaluate('i') == 65079)
    assert(evaluate('x') == 123)
    assert(evaluate('y') == 456)

In [42]:
test()

This approach seems correct, but it creates huge expressions along the way that become harder and harder to parse. Thus the time to a final expression that wraps up all the computations is very long. Two ideas to carry on: i) concurrent evaluation of expressions; ii) define lazy variables/functions that collect all the dependencies of the circuit and start firing upon request.

Approach 2: Concurrent evaluation from known variables.

The solution provided hereto owes credit to this source: https://www.reddit.com/r/adventofcode/comments/5id6w0/2015_day_7_part_1_python_wrong_answer/


In [21]:
import numpy as np

def RSHIFT(a, b):
    result = np.uint16(a) >> int(b)
    return int(result)

def LSHIFT(a, b):
    result = np.uint16(a) << int(b)
    return int(result)

def OR(a, b):
    result = np.uint16(a) | np.uint16(b)
    return int(result)

def AND(a, b):
    result = np.uint16(a) & np.uint16(b)
    return int(result)

def NOT(a):
    result = ~ np.uint16(a)
    return int(result)

In [28]:
import csv
def display(input_file):

    """produce a dict mapping variables to expressions"""
    
    commands = []
    with open(input_file, 'rt') as f_input:
        csv_reader = csv.reader(f_input, delimiter=' ')
        for line in csv_reader:
            commands.append((line[-1], line[:-2]))
    return dict(commands)

In [105]:
def evaluate(wire):
    known = {}
    while wire not in known:
        if wire in known:
            break
        for k, v in commands.items():
            if (len(v) == 1) and (v[0].isnumeric()) and (k not in known):
                known[k] = int(v[0])
            elif (len(v) == 1) and (v[0] in known) and (k not in known):
                known[k] = known[v[0]]
            elif ('AND' in v) and (v[0] in known) and (v[2] in known):
                known[k] = AND(known[v[0]], known[v[2]])
            elif ('AND' in v) and (v[0].isnumeric()) and (v[2] in known):
                known[k] = AND(int(v[0]), known[v[2]])
            elif ('AND' in v) and (v[0] in known) and (v[2].isnumeric()):
                known[k] = AND(known[v[0]], int(v[2]))
            elif ('OR' in v) and (v[0] in known) and (v[2] in known):
                known[k] = OR(known[v[0]], known[v[2]])
            elif ('OR' in v) and (v[0].isnumeric()) and (v[2] in known):
                known[k] = OR(int(v[0]), known[v[2]])
            elif ('OR' in v) and (v[0] in known) and (v[2].isnumeric()):
                known[k] = OR(known[v[0]], int(v[2]))
            elif ('LSHIFT' in v) and (v[0] in known):
                known[k] = LSHIFT(known[v[0]], v[2])
            elif ('RSHIFT' in v) and (v[0] in known):
                known[k] = RSHIFT(known[v[0]], v[2])
            elif ('NOT' in v) and (v[1] in known):
                known[k] = NOT(known[v[1]])
    return known[wire]

Test 0


In [107]:
commands = display('inputs/input7.test1.txt')
commands


Out[107]:
{'a': ['b'], 'b': ['1', 'OR', 'x'], 'x': ['12']}

In [108]:
evaluate('a')


Out[108]:
13

Test 1


In [109]:
commands = display('inputs/input7.test2.txt')
commands


Out[109]:
{'d': ['x', 'AND', 'y'],
 'e': ['x', 'OR', 'y'],
 'f': ['x', 'LSHIFT', '2'],
 'g': ['y', 'RSHIFT', '2'],
 'h': ['NOT', 'x'],
 'i': ['NOT', 'y'],
 'x': ['123'],
 'y': ['456']}

In [110]:
test()

Solution


In [111]:
commands = display('inputs/input7.txt')
evaluate('a')


Out[111]:
16076

Approach 3: With Lazy Variable Wrapper (Python)


In [3]:
import csv
import numpy as np

def display(input_file):

    """produce a dict mapping variables to expressions"""
    
    commands = []
    with open(input_file, 'rt') as f_input:
        csv_reader = csv.reader(f_input, delimiter=' ')
        for line in csv_reader:
            commands.append((line[-1], line[:-2]))
    return dict(commands)

In [2]:
class LazyVar(object):
    def __init__(self, func):
        self.func = func
        self.value = None
    def __call__(self):
        if self.value is None:
            self.value = self.func()
        return self.value

In [3]:
binary_command = {'NOT': '~', 'AND': '&', 'OR': '|', 'LSHIFT': '<<', 'RSHIFT': '>>'}

def translate(l):
    translated = []
    for a in l:
        if a in binary_command:
            b = binary_command[a]
        elif a.isnumeric():
            b = 'np.uint16({})'.format(a)
        else:
            b = '{}.func()'.format('var_' + a)
        translated.append(b)
    return translated

Test


In [4]:
commands = display('inputs/input7.test2.txt')

In [5]:
commands = display('inputs/input7.test2.txt')
for k, v in commands.items():
    command_str = '{0} = LazyVar(lambda: {1})'.format('var_' + k, ''.join(translate(v)))
    print(command_str)
    exec(command_str)


var_y = LazyVar(lambda: np.uint16(456))
var_d = LazyVar(lambda: var_x.func()&var_y.func())
var_i = LazyVar(lambda: ~var_y.func())
var_h = LazyVar(lambda: ~var_x.func())
var_e = LazyVar(lambda: var_x.func()|var_y.func())
var_f = LazyVar(lambda: var_x.func()<<np.uint16(2))
var_x = LazyVar(lambda: np.uint16(123))
var_g = LazyVar(lambda: var_y.func()>>np.uint16(2))

In [6]:
def test():
    assert(var_d.func() == 72)
    assert(var_e.func() == 507)
    assert(var_f.func() == 492)
    assert(var_g.func() == 114)
    assert(var_h.func() == 65412)
    assert(var_i.func() == 65079)
    assert(var_x.func() == 123)
    assert(var_y.func() == 456)

In [7]:
test()

Although the approach passes the test, it does not end in reasonable time for the full input.

Approach 4: With Lazy Evaluation in R

The approach now is to exploit the lazy evaluation capabilities in R. So we leverage Python to create an R script that does the job.


In [35]:
def rscript_command(var, l):
    vocab =  {'AND'    : 'bitwAnd', 
              'OR'     : 'bitwOr',
              'LSHIFT' : 'bitwShiftL',
              'RSHIFT' : 'bitwShiftR'}
    if len(l) == 3:
        func = vocab[l[1]]
        arg1 = l[0] if l[0].isdigit() else 'var_' + l[0] + '()'
        arg2 = l[2] if l[2].isdigit() else 'var_' + l[2] + '()'
        return 'var_{0} <- function(a={1}, b={2})'.format(var, arg1, arg2) + ' {' + '{0}(a,b)'.format(func) + '}'
    elif len(l) == 2:
        func = 'bitwNot'
        arg1 = l[1] if l[1].isdigit() else 'var_' + l[1] + '()'
        return 'var_{0} <- function(a={1})'.format(var, arg1) + ' {' + '{0}(a)'.format(func) + '}'
    else:
        arg1 = l[0] if l[0].isdigit() else 'var_' + l[0] + '()'
        return 'var_{0} <- function(a={1})'.format(var, arg1) + ' {' + 'a' + '}'

def generate_rscript(commands, target):
    with open('day7_commands.R', 'wt') as f:
        for k, v in commands.items():
            f.write(rscript_command(k, v)+'\n')
        f.write('var_' + target + '()')

Test


In [36]:
commands = display('inputs/input7.test2.txt')
generate_rscript(commands, 'd')

In [37]:
! cat day7_commands.R


var_g <- function(a=var_y(), b=2) {bitwShiftR(a,b)}
var_x <- function(a=123) {a}
var_e <- function(a=var_x(), b=var_y()) {bitwOr(a,b)}
var_f <- function(a=var_x(), b=2) {bitwShiftL(a,b)}
var_i <- function(a=var_y()) {bitwNot(a)}
var_d <- function(a=var_x(), b=var_y()) {bitwAnd(a,b)}
var_y <- function(a=456) {a}
var_h <- function(a=var_x()) {bitwNot(a)}
var_d()

In [38]:
!Rscript day7_commands.R


[1] 72

Solution


In [39]:
commands = display('inputs/input7.txt')
generate_rscript(commands, 'a')

In [40]:
! cat day7_commands.R


var_ak <- function(a=var_x(), b=var_ai()) {bitwAnd(a,b)}
var_ck <- function(a=var_ci(), b=3) {bitwShiftR(a,b)}
var_ed <- function(a=var_ea(), b=var_eb()) {bitwAnd(a,b)}
var_li <- function(a=var_lf(), b=5) {bitwShiftR(a,b)}
var_ce <- function(a=var_bk(), b=1) {bitwShiftL(a,b)}
var_co <- function(a=var_cn()) {bitwNot(a)}
var_fq <- function(a=var_fo(), b=3) {bitwShiftR(a,b)}
var_l <- function(a=var_d(), b=var_j()) {bitwAnd(a,b)}
var_et <- function(a=var_er(), b=var_es()) {bitwOr(a,b)}
var_ik <- function(a=var_ih(), b=var_ij()) {bitwAnd(a,b)}
var_bi <- function(a=1, b=var_bh()) {bitwAnd(a,b)}
var_bu <- function(a=var_br(), b=var_bt()) {bitwAnd(a,b)}
var_kg <- function(a=var_jm(), b=1) {bitwShiftL(a,b)}
var_ih <- function(a=var_ia(), b=var_ig()) {bitwOr(a,b)}
var_hg <- function(a=var_he(), b=3) {bitwShiftR(a,b)}
var_kx <- function(a=var_kk(), b=var_kv()) {bitwAnd(a,b)}
var_ae <- function(a=var_ab(), b=var_ad()) {bitwAnd(a,b)}
var_iy <- function(a=var_iw(), b=var_ix()) {bitwOr(a,b)}
var_dm <- function(a=var_de(), b=var_dk()) {bitwAnd(a,b)}
var_bh <- function(a=var_be(), b=var_bg()) {bitwAnd(a,b)}
var_io <- function(a=var_il(), b=var_in()) {bitwAnd(a,b)}
var_jn <- function(a=var_iu(), b=1) {bitwShiftR(a,b)}
var_iq <- function(a=var_hw(), b=1) {bitwShiftL(a,b)}
var_jq <- function(a=var_jp(), b=2) {bitwShiftR(a,b)}
var_fl <- function(a=var_fk(), b=var_fj()) {bitwOr(a,b)}
var_fi <- function(a=var_ff(), b=var_fh()) {bitwAnd(a,b)}
var_gs <- function(a=var_gk(), b=var_gq()) {bitwAnd(a,b)}
var_gj <- function(a=var_gh(), b=var_gi()) {bitwOr(a,b)}
var_ld <- function(a=var_kk(), b=1) {bitwShiftR(a,b)}
var_cl <- function(a=var_ci(), b=5) {bitwShiftR(a,b)}
var_ei <- function(a=var_eh()) {bitwNot(a)}
var_is <- function(a=var_hz(), b=1) {bitwShiftR(a,b)}
var_bj <- function(a=var_ap(), b=1) {bitwShiftL(a,b)}
var_ex <- function(a=var_ev(), b=var_ew()) {bitwOr(a,b)}
var_ff <- function(a=var_et(), b=var_fe()) {bitwOr(a,b)}
var_db <- function(a=var_ci(), b=1) {bitwShiftR(a,b)}
var_kj <- function(a=var_kf(), b=15) {bitwShiftL(a,b)}
var_fk <- function(a=var_eq(), b=1) {bitwShiftL(a,b)}
var_ko <- function(a=var_km(), b=var_kn()) {bitwOr(a,b)}
var_lp <- function(a=var_lo()) {bitwNot(a)}
var_cw <- function(a=var_cv()) {bitwNot(a)}
var_kc <- function(a=var_jp(), b=var_ka()) {bitwAnd(a,b)}
var_kq <- function(a=var_kp()) {bitwNot(a)}
var_ja <- function(a=var_iz()) {bitwNot(a)}
var_hj <- function(a=var_hg(), b=var_hh()) {bitwAnd(a,b)}
var_cs <- function(a=var_cr()) {bitwNot(a)}
var_ag <- function(a=var_y(), b=var_ae()) {bitwAnd(a,b)}
var_gl <- function(a=var_gj(), b=3) {bitwShiftR(a,b)}
var_ay <- function(a=var_ax()) {bitwNot(a)}
var_ii <- function(a=var_ia(), b=var_ig()) {bitwAnd(a,b)}
var_gx <- function(a=var_gw()) {bitwNot(a)}
var_ha <- function(a=var_gg(), b=1) {bitwShiftL(a,b)}
var_jv <- function(a=var_ju()) {bitwNot(a)}
var_es <- function(a=var_eo(), b=15) {bitwShiftL(a,b)}
var_hd <- function(a=var_gz(), b=15) {bitwShiftL(a,b)}
var_gz <- function(a=1, b=var_gy()) {bitwAnd(a,b)}
var_am <- function(a=var_aj(), b=var_al()) {bitwAnd(a,b)}
var_fs <- function(a=var_fq(), b=var_fr()) {bitwOr(a,b)}
var_du <- function(a=var_da(), b=1) {bitwShiftL(a,b)}
var_cb <- function(a=var_ca()) {bitwNot(a)}
var_m <- function(a=var_l()) {bitwNot(a)}
var_c <- function(a=0) {a}
var_ma <- function(a=var_ly(), b=var_lz()) {bitwOr(a,b)}
var_dc <- function(a=var_cy(), b=15) {bitwShiftL(a,b)}
var_dg <- function(a=var_dd(), b=5) {bitwShiftR(a,b)}
var_lw <- function(a=var_lc(), b=1) {bitwShiftL(a,b)}
var_hh <- function(a=var_he(), b=5) {bitwShiftR(a,b)}
var_ek <- function(a=var_dy(), b=var_ej()) {bitwOr(a,b)}
var_bg <- function(a=var_bf()) {bitwNot(a)}
var_ix <- function(a=var_iu(), b=5) {bitwShiftR(a,b)}
var_kz <- function(a=var_kw(), b=var_ky()) {bitwAnd(a,b)}
var_fb <- function(a=var_eu(), b=var_fa()) {bitwOr(a,b)}
var_ey <- function(a=var_ev(), b=var_ew()) {bitwAnd(a,b)}
var_bq <- function(a=var_bn(), b=5) {bitwShiftR(a,b)}
var_jf <- function(a=var_jc(), b=var_je()) {bitwAnd(a,b)}
var_fa <- function(a=var_ex(), b=var_ez()) {bitwAnd(a,b)}
var_da <- function(a=var_cz(), b=var_cy()) {bitwOr(a,b)}
var_u <- function(a=var_t(), b=var_s()) {bitwOr(a,b)}
var_hn <- function(a=var_hf(), b=var_hl()) {bitwAnd(a,b)}
var_dw <- function(a=var_dd(), b=1) {bitwShiftR(a,b)}
var_gp <- function(a=var_go()) {bitwNot(a)}
var_kd <- function(a=var_kc()) {bitwNot(a)}
var_w <- function(a=var_s(), b=15) {bitwShiftL(a,b)}
var_hk <- function(a=var_hj()) {bitwNot(a)}
var_ht <- function(a=var_hq(), b=var_hs()) {bitwAnd(a,b)}
var_ej <- function(a=var_eg(), b=var_ei()) {bitwAnd(a,b)}
var_kh <- function(a=var_kg(), b=var_kf()) {bitwOr(a,b)}
var_dx <- function(a=var_dt(), b=15) {bitwShiftL(a,b)}
var_jg <- function(a=var_iu(), b=var_jf()) {bitwOr(a,b)}
var_dq <- function(a=var_dd(), b=var_do()) {bitwAnd(a,b)}
var_o <- function(a=var_b(), b=var_n()) {bitwOr(a,b)}
var_js <- function(a=var_jp(), b=5) {bitwShiftR(a,b)}
var_aq <- function(a=var_x(), b=1) {bitwShiftR(a,b)}
var_cq <- function(a=var_cj(), b=var_cp()) {bitwOr(a,b)}
var_dz <- function(a=var_dy(), b=2) {bitwShiftR(a,b)}
var_be <- function(a=var_as(), b=var_bd()) {bitwOr(a,b)}
var_lv <- function(a=1, b=var_lu()) {bitwAnd(a,b)}
var_jw <- function(a=var_jt(), b=var_jv()) {bitwAnd(a,b)}
var_bk <- function(a=var_bj(), b=var_bi()) {bitwOr(a,b)}
var_jk <- function(a=1, b=var_jj()) {bitwAnd(a,b)}
var_bw <- function(a=var_bo(), b=var_bu()) {bitwAnd(a,b)}
var_jd <- function(a=var_iv(), b=var_jb()) {bitwAnd(a,b)}
var_bo <- function(a=var_bn(), b=2) {bitwShiftR(a,b)}
var_at <- function(a=var_as(), b=2) {bitwShiftR(a,b)}
var_j <- function(a=var_g(), b=var_i()) {bitwAnd(a,b)}
var_kf <- function(a=1, b=var_ke()) {bitwAnd(a,b)}
var_ga <- function(a=var_fo(), b=var_fz()) {bitwOr(a,b)}
var_ls <- function(a=var_lf(), b=var_lq()) {bitwAnd(a,b)}
var_af <- function(a=var_y(), b=var_ae()) {bitwOr(a,b)}
var_lg <- function(a=var_lf(), b=2) {bitwShiftR(a,b)}
var_hc <- function(a=var_gj(), b=1) {bitwShiftR(a,b)}
var_do <- function(a=var_dl(), b=var_dn()) {bitwAnd(a,b)}
var_ji <- function(a=var_jh()) {bitwNot(a)}
var_lc <- function(a=var_lb(), b=var_la()) {bitwOr(a,b)}
var_ew <- function(a=var_et(), b=5) {bitwShiftR(a,b)}
var_eo <- function(a=1, b=var_en()) {bitwAnd(a,b)}
var_jz <- function(a=var_jy()) {bitwNot(a)}
var_b <- function(a=19138) {a}
var_aw <- function(a=var_au(), b=var_av()) {bitwOr(a,b)}
var_au <- function(a=var_as(), b=3) {bitwShiftR(a,b)}
var_cc <- function(a=var_bz(), b=var_cb()) {bitwAnd(a,b)}
var_ju <- function(a=var_jr(), b=var_js()) {bitwAnd(a,b)}
var_v <- function(a=var_b(), b=1) {bitwShiftR(a,b)}
var_by <- function(a=var_bv(), b=var_bx()) {bitwAnd(a,b)}
var_kk <- function(a=var_ki(), b=var_kj()) {bitwOr(a,b)}
var_cn <- function(a=var_ck(), b=var_cl()) {bitwAnd(a,b)}
var_ax <- function(a=var_au(), b=var_av()) {bitwAnd(a,b)}
var_eu <- function(a=var_et(), b=2) {bitwShiftR(a,b)}
var_fg <- function(a=var_et(), b=var_fe()) {bitwAnd(a,b)}
var_el <- function(a=var_dy(), b=var_ej()) {bitwAnd(a,b)}
var_bf <- function(a=var_as(), b=var_bd()) {bitwAnd(a,b)}
var_lj <- function(a=var_lh(), b=var_li()) {bitwOr(a,b)}
var_fw <- function(a=var_fp(), b=var_fv()) {bitwOr(a,b)}
var_lh <- function(a=var_lf(), b=3) {bitwShiftR(a,b)}
var_bb <- function(a=var_at(), b=var_az()) {bitwAnd(a,b)}
var_in <- function(a=var_im()) {bitwNot(a)}
var_jl <- function(a=var_ir(), b=1) {bitwShiftL(a,b)}
var_en <- function(a=var_ek(), b=var_em()) {bitwAnd(a,b)}
var_cg <- function(a=var_bn(), b=1) {bitwShiftR(a,b)}
var_dd <- function(a=var_db(), b=var_dc()) {bitwOr(a,b)}
var_gn <- function(a=var_gl(), b=var_gm()) {bitwOr(a,b)}
var_ic <- function(a=var_hz(), b=5) {bitwShiftR(a,b)}
var_bl <- function(a=var_as(), b=1) {bitwShiftR(a,b)}
var_eq <- function(a=var_ep(), b=var_eo()) {bitwOr(a,b)}
var_bv <- function(a=var_bo(), b=var_bu()) {bitwOr(a,b)}
var_p <- function(a=var_b(), b=var_n()) {bitwAnd(a,b)}
var_ab <- function(a=var_z(), b=var_aa()) {bitwOr(a,b)}
var_gc <- function(a=var_gb()) {bitwNot(a)}
var_eb <- function(a=var_dy(), b=5) {bitwShiftR(a,b)}
var_fn <- function(a=var_fj(), b=15) {bitwShiftL(a,b)}
var_g <- function(a=var_e(), b=var_f()) {bitwOr(a,b)}
var_ep <- function(a=var_dv(), b=1) {bitwShiftL(a,b)}
var_id <- function(a=var_ib(), b=var_ic()) {bitwOr(a,b)}
var_ds <- function(a=var_dp(), b=var_dr()) {bitwAnd(a,b)}
var_hu <- function(a=1, b=var_ht()) {bitwAnd(a,b)}
var_le <- function(a=var_la(), b=15) {bitwShiftL(a,b)}
var_df <- function(a=var_dd(), b=3) {bitwShiftR(a,b)}
var_gv <- function(a=var_gj(), b=var_gu()) {bitwOr(a,b)}
var_br <- function(a=var_bp(), b=var_bq()) {bitwOr(a,b)}
var_jt <- function(a=var_jr(), b=var_js()) {bitwOr(a,b)}
var_iw <- function(a=var_iu(), b=3) {bitwShiftR(a,b)}
var_if <- function(a=var_ie()) {bitwNot(a)}
var_ho <- function(a=var_hn()) {bitwNot(a)}
var_ar <- function(a=var_an(), b=15) {bitwShiftL(a,b)}
var_fu <- function(a=var_ft()) {bitwNot(a)}
var_ef <- function(a=var_ec(), b=var_ee()) {bitwAnd(a,b)}
var_hx <- function(a=var_he(), b=1) {bitwShiftR(a,b)}
var_q <- function(a=var_p()) {bitwNot(a)}
var_gd <- function(a=var_ga(), b=var_gc()) {bitwAnd(a,b)}
var_bm <- function(a=var_bi(), b=15) {bitwShiftL(a,b)}
var_im <- function(a=var_hz(), b=var_ik()) {bitwAnd(a,b)}
var_cr <- function(a=var_cj(), b=var_cp()) {bitwAnd(a,b)}
var_cv <- function(a=var_ci(), b=var_ct()) {bitwAnd(a,b)}
var_cm <- function(a=var_ck(), b=var_cl()) {bitwOr(a,b)}
var_jb <- function(a=var_iy(), b=var_ja()) {bitwAnd(a,b)}
var_lf <- function(a=var_ld(), b=var_le()) {bitwOr(a,b)}
var_fx <- function(a=var_fp(), b=var_fv()) {bitwAnd(a,b)}
var_gf <- function(a=var_fl(), b=1) {bitwShiftL(a,b)}
var_dr <- function(a=var_dq()) {bitwNot(a)}
var_gg <- function(a=var_gf(), b=var_ge()) {bitwOr(a,b)}
var_hr <- function(a=var_he(), b=var_hp()) {bitwAnd(a,b)}
var_gm <- function(a=var_gj(), b=5) {bitwShiftR(a,b)}
var_fj <- function(a=1, b=var_fi()) {bitwAnd(a,b)}
var_cj <- function(a=var_ci(), b=2) {bitwShiftR(a,b)}
var_f <- function(a=var_b(), b=5) {bitwShiftR(a,b)}
var_an <- function(a=1, b=var_am()) {bitwAnd(a,b)}
var_kr <- function(a=var_ko(), b=var_kq()) {bitwAnd(a,b)}
var_fv <- function(a=var_fs(), b=var_fu()) {bitwAnd(a,b)}
var_lo <- function(a=var_lg(), b=var_lm()) {bitwAnd(a,b)}
var_ij <- function(a=var_ii()) {bitwNot(a)}
var_kt <- function(a=var_kl(), b=var_kr()) {bitwAnd(a,b)}
var_y <- function(a=var_x(), b=2) {bitwShiftR(a,b)}
var_ao <- function(a=var_u(), b=1) {bitwShiftL(a,b)}
var_lx <- function(a=var_lw(), b=var_lv()) {bitwOr(a,b)}
var_eh <- function(a=var_dz(), b=var_ef()) {bitwAnd(a,b)}
var_ks <- function(a=var_kl(), b=var_kr()) {bitwOr(a,b)}
var_bd <- function(a=var_ba(), b=var_bc()) {bitwAnd(a,b)}
var_fc <- function(a=var_eu(), b=var_fa()) {bitwAnd(a,b)}
var_ez <- function(a=var_ey()) {bitwNot(a)}
var_dl <- function(a=var_de(), b=var_dk()) {bitwOr(a,b)}
var_gq <- function(a=var_gn(), b=var_gp()) {bitwAnd(a,b)}
var_dh <- function(a=var_df(), b=var_dg()) {bitwOr(a,b)}
var_gy <- function(a=var_gv(), b=var_gx()) {bitwAnd(a,b)}
var_ge <- function(a=1, b=var_gd()) {bitwAnd(a,b)}
var_gw <- function(a=var_gj(), b=var_gu()) {bitwAnd(a,b)}
var_fz <- function(a=var_fw(), b=var_fy()) {bitwAnd(a,b)}
var_bn <- function(a=var_bl(), b=var_bm()) {bitwOr(a,b)}
var_jo <- function(a=var_jk(), b=15) {bitwShiftL(a,b)}
var_gr <- function(a=var_gk(), b=var_gq()) {bitwOr(a,b)}
var_hb <- function(a=var_ha(), b=var_gz()) {bitwOr(a,b)}
var_dk <- function(a=var_dh(), b=var_dj()) {bitwAnd(a,b)}
var_ac <- function(a=var_z(), b=var_aa()) {bitwAnd(a,b)}
var_hi <- function(a=var_hg(), b=var_hh()) {bitwOr(a,b)}
var_bs <- function(a=var_bp(), b=var_bq()) {bitwAnd(a,b)}
var_as <- function(a=var_aq(), b=var_ar()) {bitwOr(a,b)}
var_il <- function(a=var_hz(), b=var_ik()) {bitwOr(a,b)}
var_dp <- function(a=var_dd(), b=var_do()) {bitwOr(a,b)}
var_kp <- function(a=var_km(), b=var_kn()) {bitwAnd(a,b)}
var_kv <- function(a=var_ks(), b=var_ku()) {bitwAnd(a,b)}
var_bx <- function(a=var_bw()) {bitwNot(a)}
var_lu <- function(a=var_lr(), b=var_lt()) {bitwAnd(a,b)}
var_av <- function(a=var_as(), b=5) {bitwShiftR(a,b)}
var_fr <- function(a=var_fo(), b=5) {bitwShiftR(a,b)}
var_eg <- function(a=var_dz(), b=var_ef()) {bitwOr(a,b)}
var_jp <- function(a=var_jn(), b=var_jo()) {bitwOr(a,b)}
var_cz <- function(a=var_cf(), b=1) {bitwShiftL(a,b)}
var_ip <- function(a=1, b=var_io()) {bitwAnd(a,b)}
var_jh <- function(a=var_iu(), b=var_jf()) {bitwAnd(a,b)}
var_h <- function(a=var_e(), b=var_f()) {bitwAnd(a,b)}
var_jm <- function(a=var_jl(), b=var_jk()) {bitwOr(a,b)}
var_ai <- function(a=var_af(), b=var_ah()) {bitwAnd(a,b)}
var_lr <- function(a=var_lf(), b=var_lq()) {bitwOr(a,b)}
var_hf <- function(a=var_he(), b=2) {bitwShiftR(a,b)}
var_fh <- function(a=var_fg()) {bitwNot(a)}
var_ft <- function(a=var_fq(), b=var_fr()) {bitwAnd(a,b)}
var_ch <- function(a=var_cd(), b=15) {bitwShiftL(a,b)}
var_s <- function(a=1, b=var_r()) {bitwAnd(a,b)}
var_ea <- function(a=var_dy(), b=3) {bitwShiftR(a,b)}
var_em <- function(a=var_el()) {bitwNot(a)}
var_lk <- function(a=var_lh(), b=var_li()) {bitwAnd(a,b)}
var_ev <- function(a=var_et(), b=3) {bitwShiftR(a,b)}
var_i <- function(a=var_h()) {bitwNot(a)}
var_ku <- function(a=var_kt()) {bitwNot(a)}
var_ia <- function(a=var_hz(), b=2) {bitwShiftR(a,b)}
var_di <- function(a=var_df(), b=var_dg()) {bitwAnd(a,b)}
var_fo <- function(a=var_fm(), b=var_fn()) {bitwOr(a,b)}
var_ly <- function(a=var_lf(), b=1) {bitwShiftR(a,b)}
var_bp <- function(a=var_bn(), b=3) {bitwShiftR(a,b)}
var_gu <- function(a=var_gr(), b=var_gt()) {bitwAnd(a,b)}
var_bz <- function(a=var_bn(), b=var_by()) {bitwOr(a,b)}
var_hm <- function(a=var_hf(), b=var_hl()) {bitwOr(a,b)}
var_dt <- function(a=1, b=var_ds()) {bitwAnd(a,b)}
var_ky <- function(a=var_kx()) {bitwNot(a)}
var_dj <- function(a=var_di()) {bitwNot(a)}
var_fy <- function(a=var_fx()) {bitwNot(a)}
var_fe <- function(a=var_fb(), b=var_fd()) {bitwAnd(a,b)}
var_ap <- function(a=var_ao(), b=var_an()) {bitwOr(a,b)}
var_ll <- function(a=var_lk()) {bitwNot(a)}
var_iv <- function(a=var_iu(), b=2) {bitwShiftR(a,b)}
var_az <- function(a=var_aw(), b=var_ay()) {bitwAnd(a,b)}
var_al <- function(a=var_ak()) {bitwNot(a)}
var_kn <- function(a=var_kk(), b=5) {bitwShiftR(a,b)}
var_fp <- function(a=var_fo(), b=2) {bitwShiftR(a,b)}
var_ba <- function(a=var_at(), b=var_az()) {bitwOr(a,b)}
var_lb <- function(a=var_kh(), b=1) {bitwShiftL(a,b)}
var_lt <- function(a=var_ls()) {bitwNot(a)}
var_lm <- function(a=var_lj(), b=var_ll()) {bitwAnd(a,b)}
var_t <- function(a=var_c(), b=1) {bitwShiftL(a,b)}
var_cu <- function(a=var_ci(), b=var_ct()) {bitwOr(a,b)}
var_km <- function(a=var_kk(), b=3) {bitwShiftR(a,b)}
var_hv <- function(a=var_hb(), b=1) {bitwShiftL(a,b)}
var_go <- function(a=var_gl(), b=var_gm()) {bitwAnd(a,b)}
var_he <- function(a=var_hc(), b=var_hd()) {bitwOr(a,b)}
var_hp <- function(a=var_hm(), b=var_ho()) {bitwAnd(a,b)}
var_ct <- function(a=var_cq(), b=var_cs()) {bitwAnd(a,b)}
var_cy <- function(a=1, b=var_cx()) {bitwAnd(a,b)}
var_jc <- function(a=var_iv(), b=var_jb()) {bitwOr(a,b)}
var_cd <- function(a=1, b=var_cc()) {bitwAnd(a,b)}
var_jj <- function(a=var_jg(), b=var_ji()) {bitwAnd(a,b)}
var_jr <- function(a=var_jp(), b=3) {bitwShiftR(a,b)}
var_ee <- function(a=var_ed()) {bitwNot(a)}
var_er <- function(a=var_dy(), b=1) {bitwShiftR(a,b)}
var_ka <- function(a=var_jx(), b=var_jz()) {bitwAnd(a,b)}
var_n <- function(a=var_k(), b=var_m()) {bitwAnd(a,b)}
var_it <- function(a=var_ip(), b=15) {bitwShiftL(a,b)}
var_fd <- function(a=var_fc()) {bitwNot(a)}
var_dv <- function(a=var_du(), b=var_dt()) {bitwOr(a,b)}
var_k <- function(a=var_d(), b=var_j()) {bitwOr(a,b)}
var_ln <- function(a=var_lg(), b=var_lm()) {bitwOr(a,b)}
var_bt <- function(a=var_bs()) {bitwNot(a)}
var_ir <- function(a=var_iq(), b=var_ip()) {bitwOr(a,b)}
var_hl <- function(a=var_hi(), b=var_hk()) {bitwAnd(a,b)}
var_fm <- function(a=var_et(), b=1) {bitwShiftR(a,b)}
var_de <- function(a=var_dd(), b=2) {bitwShiftR(a,b)}
var_iu <- function(a=var_is(), b=var_it()) {bitwOr(a,b)}
var_ki <- function(a=var_jp(), b=1) {bitwShiftR(a,b)}
var_bc <- function(a=var_bb()) {bitwNot(a)}
var_ec <- function(a=var_ea(), b=var_eb()) {bitwOr(a,b)}
var_cx <- function(a=var_cu(), b=var_cw()) {bitwAnd(a,b)}
var_gh <- function(a=var_fo(), b=1) {bitwShiftR(a,b)}
var_la <- function(a=1, b=var_kz()) {bitwAnd(a,b)}
var_z <- function(a=var_x(), b=3) {bitwShiftR(a,b)}
var_ah <- function(a=var_ag()) {bitwNot(a)}
var_ke <- function(a=var_kb(), b=var_kd()) {bitwAnd(a,b)}
var_gi <- function(a=var_ge(), b=15) {bitwShiftL(a,b)}
var_aj <- function(a=var_x(), b=var_ai()) {bitwOr(a,b)}
var_lz <- function(a=var_lv(), b=15) {bitwShiftL(a,b)}
var_ad <- function(a=var_ac()) {bitwNot(a)}
var_hw <- function(a=var_hv(), b=var_hu()) {bitwOr(a,b)}
var_kl <- function(a=var_kk(), b=2) {bitwShiftR(a,b)}
var_x <- function(a=var_v(), b=var_w()) {bitwOr(a,b)}
var_hy <- function(a=var_hu(), b=15) {bitwShiftL(a,b)}
var_gk <- function(a=var_gj(), b=2) {bitwShiftR(a,b)}
var_lq <- function(a=var_ln(), b=var_lp()) {bitwAnd(a,b)}
var_cp <- function(a=var_cm(), b=var_co()) {bitwAnd(a,b)}
var_aa <- function(a=var_x(), b=5) {bitwShiftR(a,b)}
var_dy <- function(a=var_dw(), b=var_dx()) {bitwOr(a,b)}
var_hs <- function(a=var_hr()) {bitwNot(a)}
var_a <- function(a=var_lx()) {a}
var_kw <- function(a=var_kk(), b=var_kv()) {bitwOr(a,b)}
var_gb <- function(a=var_fo(), b=var_fz()) {bitwAnd(a,b)}
var_ig <- function(a=var_id(), b=var_if()) {bitwAnd(a,b)}
var_r <- function(a=var_o(), b=var_q()) {bitwAnd(a,b)}
var_dn <- function(a=var_dm()) {bitwNot(a)}
var_ca <- function(a=var_bn(), b=var_by()) {bitwAnd(a,b)}
var_gt <- function(a=var_gs()) {bitwNot(a)}
var_kb <- function(a=var_jp(), b=var_ka()) {bitwOr(a,b)}
var_iz <- function(a=var_iw(), b=var_ix()) {bitwAnd(a,b)}
var_je <- function(a=var_jd()) {bitwNot(a)}
var_jy <- function(a=var_jq(), b=var_jw()) {bitwAnd(a,b)}
var_jx <- function(a=var_jq(), b=var_jw()) {bitwOr(a,b)}
var_hz <- function(a=var_hx(), b=var_hy()) {bitwOr(a,b)}
var_e <- function(a=var_b(), b=3) {bitwShiftR(a,b)}
var_ib <- function(a=var_hz(), b=3) {bitwShiftR(a,b)}
var_ie <- function(a=var_ib(), b=var_ic()) {bitwAnd(a,b)}
var_hq <- function(a=var_he(), b=var_hp()) {bitwOr(a,b)}
var_ci <- function(a=var_cg(), b=var_ch()) {bitwOr(a,b)}
var_cf <- function(a=var_ce(), b=var_cd()) {bitwOr(a,b)}
var_d <- function(a=var_b(), b=2) {bitwShiftR(a,b)}
var_a()

In [ ]:
!Rscript day7_commands.R

Although this approach is more natural than defining a LazyWrapper in Python, it takes quite a lot of time to execute, so this is not a very cool solution after all.

Day 7.2


In [114]:
commands = display('inputs/input7.txt')
commands['b'] = ['16076']
evaluate('a')


Out[114]:
2797