summaryrefslogtreecommitdiff
path: root/2024/aoc2024-d09-1.py
diff options
context:
space:
mode:
Diffstat (limited to '2024/aoc2024-d09-1.py')
-rw-r--r--2024/aoc2024-d09-1.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/2024/aoc2024-d09-1.py b/2024/aoc2024-d09-1.py
new file mode 100644
index 0000000..3a3e1e6
--- /dev/null
+++ b/2024/aoc2024-d09-1.py
@@ -0,0 +1,56 @@
+#advent of code 2024
+#day 09 - part 1
+#I'll rewrite it to include both parts in the same file one day
+#tbh I'm not even reviewing this shit
+#very slow part 1, part 2 relatively fast
+
+part1 = 0;
+disk = open("09.in","r").readline().strip();
+files = {};
+freespace = {};
+NewDisk = {};
+fid = 0;
+sid = 0;
+ind = 0;
+for i in range (0,len(disk)):
+ if i%2 == 0:
+ files[fid] =[int(x)+ind for x in range(int(disk[i]))];
+ ind += int(disk[i]);
+ fid += 1;
+ else:
+ freespace[sid] = [int(x)+ind for x in range(int(disk[i]))];
+ ind += int(disk[i]);
+ sid +=1;
+
+si = 0; #space index
+fi = fid -1; #file index
+originalSize = len(files[fi]);
+while sum([len(freespace[x]) for x in freespace]) > 0:
+ #empty list of freespaces - change to another one
+ if len(freespace[si]) == 0:
+ si += 1;
+ continue;
+
+ #clear freespace that is after the fileblock with biggest index
+ FileMax = max([max(files[x]) for x in files]);
+ if FileMax < freespace[si][-1]:
+ freespace[si].pop(-1);
+ continue;
+
+ #switch places between last fileblock and first freespace
+ files[fi].pop();
+ originalSize -= 1;
+ NewSpace = freespace[si].pop(0);
+ files[fi].insert(0,NewSpace);
+
+ #if that was the last fileblock, switch to second to last file
+ if originalSize == 0:
+ fi -= 1;
+ originalSize = len(files[fi]);
+
+#checksum calculation
+for file in files:
+ for f in files[file]:
+ part1 += file*f;
+
+print("part 1 =", part1);