aoc2024

Advent of Code 2024
Log | Files | Refs | README

commit 303748ab9224157ee7e752a192a7a9ff96fa167b
parent aa290e46f19c74bb34de33e5f7b2bf91da81f8c0
Author: Martin Ashby <martin@ashbysoft.com>
Date:   Tue, 31 Dec 2024 01:34:12 +0000

Day 9 pt2

Diffstat:
Asrc/main/java/day9_pt2.java | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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); + } +}