diff --git a/2020/14.py b/2020/14.py new file mode 100755 index 0000000..321727e --- /dev/null +++ b/2020/14.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python + +from aoc import get_input # AoC +import re # regex + +data = get_input(14).splitlines() + +def listToString(s): + + str1 = "" + for ele in s: + str1 += ele + + return str1 + +def dectobin(num): + return format(num, "036b") + +def bintodec(_bin): + return int(_bin, 2) + +def parseLine(line): + if( line[0:3] == "mem" ): + address, val = re.match( r"^mem\[([0-9]+)\] = ([0-9]+)$", line ).groups() + _bin = dectobin(int(val)) + + return address, _bin + + else: + op, mask = line.split(" = ") + return op, mask + +def applyMask( _bin, mask ): + newbin = [] + newbin[:0] = _bin + + for i in range(len(mask)): + if( mask[i] != "X" ): + newbin[i] = mask[i] + + return listToString(newbin), _bin + +def applyMask2( addr, mask ): + newaddr = [] + newaddr[:0] = addr + + print(addr, len(addr)) + + for i in range(len(mask)): + newaddr[i] = mask[i] + + return listToString(newaddr) + + +import itertools as it + +def copyList(lst): + return [elem for elem in lst] + +def getallcombs(xlen): + return [list(i) for i in it.product(["0", "1"], repeat=xlen)] + +def getAddressCombos(mask, addr): + addrlist = [] + addrlist[:0] = addr + xlen = mask.count("X") + + combs = getallcombs(xlen) + + addrcombos = [] + + for comb in combs: + xcount = 0 + newaddrlist = copyList(addrlist) + for i in range( len(newaddrlist) ): + char = newaddrlist[i] + maskchar = mask[i] + + if(maskchar == "X"): + newaddrlist[i] = comb[xcount] + xcount += 1 + elif(maskchar == "1"): + newaddrlist[i] = maskchar + + addrcombos.append( listToString(newaddrlist) ) + + return addrcombos + + + +curMask = None +mem = dict() +membin = dict() + +for i in range( len(data) ): + line = data[i] + print(line) + address, val = parseLine(line) + + if( address != "mask" ): + # apply mask to address + address = dectobin(int(address)) + addrlist = getAddressCombos(curMask, address) + + for addr in addrlist: + decaddr = bintodec(addr) + print(f"{decaddr=} : {val=} = {bintodec(val)}") + mem[decaddr] = bintodec(val) + + else: + curMask = val + +memsum2 = 0 +for addr, val in mem.items(): + memsum2 += val + +print(memsum2) + +# for i in range( len(data) ): +# line = data[i] + +# address, val = parseLine(line) +# # print( f"{i=} {address=} {val=}" ) +# # +# if( address != "mask" ): +# val, oldval = applyMask(val, curMask) +# dec_val, dec_oldval = bintodec(val), bintodec(oldval) + +# mem[address] = dec_val +# membin[address] = val + +# else: +# curMask = val +# continue + +# memsum = 0 +# for addr, val in mem.items(): +# memsum += val + +# print(mem) +# print(memsum)