parent
8e6cf00fe7
commit
2146e246bb
@ -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) |
Loading…
Reference in new issue