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