-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday9.py
More file actions
111 lines (92 loc) · 2.43 KB
/
day9.py
File metadata and controls
111 lines (92 loc) · 2.43 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import copy
with open("d9big.txt", "r") as fin:
x = fin.readline().strip()
numbers = []
spaces = []
# part 1
c = 0
for i in range(len(x)):
if (c % 2 == 0):
numbers.append([c // 2, int(x[i])])
c += 1
else:
spaces.append([-1, int(x[i])])
c += 1
# build str
listBuildStr = []
p1 = 0
p2 = 0
curNumbers = True
while (p1 < len(numbers) or p2 < len(spaces)):
if (curNumbers):
listBuildStr += [str(numbers[p1][0])] * numbers[p1][1]
p1 += 1
curNumbers = False
else:
listBuildStr += ["."] * spaces[p2][1]
p2 += 1
curNumbers = True
print(listBuildStr)
cpListBuildStr = copy.copy(listBuildStr) # for part 2
# swap "."
p1 = 0
p2 = len(listBuildStr) - 1
while (p1 < p2):
if (listBuildStr[p1] != "."):
p1 += 1
elif (listBuildStr[p2] == "."):
p2 -= 1
elif (listBuildStr[p1] == "." and listBuildStr[p2] != "."):
listBuildStr[p1] = listBuildStr[p2]
listBuildStr[p2] = "."
p2 -= 1
p1 += 1
print(listBuildStr)
# get checksum
checksum = 0
for i in range(len(listBuildStr)):
if (listBuildStr[i] == "."):
break
checksum += int(listBuildStr[i]) * i
print(checksum)
# part 2
listBuildStr = cpListBuildStr
# swap "." part 2
p2 = len(listBuildStr) - 1
while (p2 >= 0):
# print("".join(list(map(str, listBuildStr))))
if (listBuildStr[p2] == "."):
p2 -= 1
else:
# listBuildStr[p1] == "." and listBuildStr[p2] != "."
numCount = 0
for i in range(p2, -1, -1):
if (listBuildStr[i] == listBuildStr[p2]):
numCount += 1
else:
break
ifUpdated = False
for i in range(0, p2):
pdCount = 0 # period count
for j in range(i, p2):
if (listBuildStr[j] == "."):
pdCount += 1
else:
break
if (numCount <= pdCount):
p1 = i
for k in range(numCount):
listBuildStr[p1] = listBuildStr[p2]
listBuildStr[p2] = "."
p2 -= 1
p1 += 1
ifUpdated = True
break
if (not ifUpdated):
p2 -= numCount
# get checksum
checksum = 0
for i in range(len(listBuildStr)):
if (listBuildStr[i] != "."):
checksum += int(listBuildStr[i]) * i
print(checksum)