57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
import os
|
|
import os.path
|
|
|
|
def checksum(hdd):
|
|
res = 0
|
|
for i in range(len(hdd)):
|
|
if hdd[i] != '.':
|
|
res += i * int(hdd[i])
|
|
return (res)
|
|
|
|
def has_free_size(hdd, j, size):
|
|
block_size = 0
|
|
while hdd[j] == '.':
|
|
block_size += 1
|
|
if block_size == size:
|
|
return True
|
|
j += 1
|
|
return False
|
|
|
|
def main():
|
|
file_path = "./input.txt"
|
|
if os.path.isfile(file_path):
|
|
content = open(file_path, "r").read()
|
|
else:
|
|
content = "2333133121414131402"
|
|
|
|
hdd = []
|
|
|
|
for i in range(len(content)):
|
|
if i % 2 == 0:
|
|
hdd.extend([i // 2 for x in range(int(content[i]))])
|
|
else:
|
|
hdd.extend(['.' for x in range(int(content[i]))])
|
|
|
|
print(hdd)
|
|
|
|
block_len = 1
|
|
for i in range(len(hdd) - 1, -1, -1):
|
|
if '.' not in [hdd[i], hdd[i - 1]] and int(hdd[i - 1]) == int(hdd[i]):
|
|
block_len += 1
|
|
continue
|
|
|
|
for j in range(len(hdd[:i])):
|
|
if has_free_size(hdd, j, block_len):
|
|
for k in range(block_len):
|
|
hdd[i + k], hdd[j + k] = hdd[j + k], hdd[i + k]
|
|
block_len = 1
|
|
break
|
|
block_len = 1
|
|
|
|
print(checksum(hdd))
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|