commit 303748ab9224157ee7e752a192a7a9ff96fa167b
parent aa290e46f19c74bb34de33e5f7b2bf91da81f8c0
Author: Martin Ashby <martin@ashbysoft.com>
Date: Tue, 31 Dec 2024 01:34:12 +0000
Day 9 pt2
Diffstat:
1 file changed, 59 insertions(+), 0 deletions(-)
diff --git a/src/main/java/day9_pt2.java b/src/main/java/day9_pt2.java
@@ -0,0 +1,59 @@
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.*;
+
+public class day9_pt2 {
+ public static void main(String[] args) throws IOException {
+ var input = Files.readString(Path.of(args[0]));
+ var dm = new ArrayList<Integer>();
+ int label = 0;
+ boolean block = true;
+ var it = input.chars().iterator();
+ while (it.hasNext()) {
+ var ct = it.next() - '0';
+ var add = block ? label : -1;
+ for (int i=0;i<ct;i++) dm.add(add);
+ label += block ? 1 : 0;
+ block = !block;
+ }
+ label--;
+ //System.out.printf("dm [%s]\n", dm);
+
+
+ while (label >= 0) {
+ var fStart = dm.indexOf(label);
+ var fEnd = dm.lastIndexOf(label)+1;
+ var fLen = fEnd-fStart;
+
+ // find first free space
+ var sStart = 0;
+ while (sStart < dm.size() && dm.get(sStart) != -1) sStart++;
+
+ while (sStart < dm.size() && sStart < fStart) {
+ var sEnd = sStart;
+ while (dm.get(sEnd) == -1) sEnd++;
+ var sLen = sEnd-sStart;
+ if (sLen >= fLen) {
+ //System.out.printf("moving label %d sLen %d sStart %d sEnd %d fStart %d fEnd %d\n", label, sLen, sStart, sEnd, fStart, fEnd);
+ for (var j=sStart; j<sStart+fLen; j++) dm.set(j, label);
+ for (var j=fStart; j<fEnd; j++) dm.set(j, -1);
+ break;
+ } else {
+ // space wasnt big enough, find the next free space
+ sStart = sEnd;
+ while (sStart < dm.size() && dm.get(sStart) != -1) sStart++;
+ }
+ }
+ label--;
+ }
+ //System.out.printf("dm [%s]\n", dm);
+ long ck = 0;
+ for (int i=0;i<dm.size();i++){
+ long ch = dm.get(i);
+ if (ch != -1) ck += (long)i * ch;
+ }
+ System.out.printf("day9, pt2: %d\n", ck);
+ }
+}