-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path14.py
79 lines (64 loc) · 1.9 KB
/
14.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
with open("14.txt") as f:
lines = f.read().splitlines()
def part1(lines):
maskZero = []
maskOne = 0
memory={}
for line in lines:
if line[:2]=="ma":
mask=line[7:]
maskZero = []
maskOne = 0
for i in range(36):
if mask[i]=="x": continue
if mask[i] == "0":
maskZero.append(35-i)
if mask[i] == "1":
maskOne=maskOne|1<<(35-i)
else:
address=int(line.split("[")[1].split("]")[0])
value = int(line.split("=")[1])
value=value|maskOne
for i in maskZero:
value=~(1<<i)&value
memory[address]=value
sum=0
for v in memory.values():
sum+=v
print(sum)
def part2(lines):
memory = {}
maskZeroOne=0
for line in lines:
if line[:2] == "ma":
maskZeroOne=int(line.replace("X","0").split("=")[1],2)
maskFloat = []
mask = line[7:]
for i in range(36):
if mask[i] == "X":
maskFloat.append(35-i)
else:
address = int(line.split("[")[1].split("]")[0])
address=address|maskZeroOne
addressList=getPermuatuins(address,maskFloat)
value = int(line.split("=")[1])
for add in addressList:
memory[add]=value
total=sum(memory.values())
print(total)
def getPermuatuins(value,places):
if len(places) ==0:
return [value]
addresses=[]
value1=value|(1<<places[0])
value0=~(1<<places[0])&value
if len(places) == 1:
return [value0,value1]
addresses += getPermuatuins(value1, places[1:])
addresses+=getPermuatuins(value0,places[1:])
return addresses
if __name__ == '__main__':
part1(lines)
print("^^^^part one^^^^\n\n\n")
part2(lines)
print("^^^^part two^^^^")