-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday09-works.py
73 lines (63 loc) · 1.58 KB
/
day09-works.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
#import utils
#inp = utils.get_input(9)
inp = "2333133121414131402"
# inp = sample_inp
import sys
inputfile = ""
if len(sys.argv) == 2:
inputfile = sys.argv[1] + ".txt"
else:
inputfile = "input" + sys.argv[0][3:5] + ".txt"
with open(inputfile,"r") as input:
inp = input.read().rstrip()
pid = 0
free = []
free_blocks = {}
filled = {}
blocks = {}
pos = 0
for i, l in enumerate(inp.strip()):
l = int(l)
if i % 2:
if l:
free.extend(list(range(pos, pos + l)))
free_blocks[pos] = l
else:
filled[pid] = list(range(pos, pos + l))[::-1]
blocks[pid] = pos, l
pid += 1
pos += l
data = {}
for pid in sorted(filled.keys(), key=lambda x: -x):
for k in filled[pid]:
k_ = k
if free and free[0] < k:
k_ = free[0]
free.pop(0)
assert k_ not in data
data[k_] = pid
ans = sum(k * v for k, v in data.items())
#utils.write_output(ans, day=9, w=1)
data = {}
for pid in sorted(blocks.keys(), key=lambda x: -x):
s, l = blocks[pid]
for k2 in sorted(free_blocks.keys()):
if k2 > s:
continue
if free_blocks[k2] < l:
continue
l2 = free_blocks[k2]
del free_blocks[k2]
if l2 > l:
free_blocks[k2 + l] = l2 - l
for i in range(k2, k2 + l):
assert i not in data
data[i] = pid
break
else:
for i in range(s, s + l):
assert i not in data
data[i] = pid
ans2 = sum(k * v for k, v in data.items())
print(ans2)
#utils.write_output(ans2, day=9, a=1)