Complete day 9

This commit is contained in:
2024-12-18 20:06:39 -05:00
parent 239980309e
commit f0e2b05deb
4 changed files with 265 additions and 1 deletions

View File

@@ -15,6 +15,8 @@ import com.mattrixwv.adventOfCode24.days.Problem13;
import com.mattrixwv.adventOfCode24.days.Problem14;
import com.mattrixwv.adventOfCode24.days.Problem15;
import com.mattrixwv.adventOfCode24.days.Problem16;
import com.mattrixwv.adventOfCode24.days.Problem17;
import com.mattrixwv.adventOfCode24.days.Problem18;
import com.mattrixwv.adventOfCode24.days.Problem2;
import com.mattrixwv.adventOfCode24.days.Problem3;
import com.mattrixwv.adventOfCode24.days.Problem4;
@@ -30,7 +32,7 @@ public class ProblemSelector{
//Holds the valid problem numbers
protected static final List<Integer> PROBLEM_NUMBERS = List.of(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16
10, 11, 12, 13, 14, 15, 16, 17, 18
);
@@ -59,6 +61,8 @@ public class ProblemSelector{
case 14 : day = new Problem14(); break;
case 15 : day = new Problem15(); break;
case 16 : day = new Problem16(); break;
case 17 : day = new Problem17(); break;
case 18 : day = new Problem18(); break;
default: throw new InvalidParameterException();
}
return day;

View File

@@ -0,0 +1,119 @@
package com.mattrixwv.adventOfCode24.days;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.mattrixwv.Stopwatch;
public class Problem17 extends Problem{
private static final String inputFileName = "days/Problem17.txt";
private String rawInput;
private List<Integer> prettyInput;
public Problem17(){
super();
description = "Find the filesystem checksum after compacting the files.";
result = "Unresolved";
}
public String runSolution(){
Stopwatch timer = new Stopwatch();
timer.start();
//Read the file
/* */
try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){
scanner.useDelimiter("\n");
rawInput = scanner.next();
}
/* */
/*
rawInput = "2333133121414131402";
/* */
//Change the raw into into pretty input
generatePrettyInput();
//printPrettyInput();
//Compact the files
compactInput();
//printPrettyInput();
//Generate sum
long sum = generateCheckSum();
//Save the results
timer.stop();
result = "The filesystem checksum is " + sum + ".\nIt took " + timer.toString() + " to run this algorithm.";
return result;
}
private void generatePrettyInput(){
prettyInput = new ArrayList<>();
int fileNumber = 0;
boolean isFile = true;
for(int loc = 0;loc < rawInput.length();++loc){
//Get the next number
int num = Integer.parseInt(rawInput.charAt(loc) + "");
//If this number represents a file size then add the file number to the pretty input
if(isFile){
for(int cnt = 0;cnt < num;++cnt){
prettyInput.add(fileNumber);
}
++fileNumber;
}
//If this number represents free space then add -1 to the pretty input
else{
for(int cnt = 0;cnt < num;++cnt){
prettyInput.add(-1);
}
}
isFile = !isFile;
}
}
private void compactInput(){
int forwardCnt = 0;
int backwardCnt = prettyInput.size() - 1;
while(forwardCnt < backwardCnt){
if(prettyInput.get(forwardCnt) != -1){
++forwardCnt;
}
else if(prettyInput.get(backwardCnt) == -1){
--backwardCnt;
}
else{
Integer temp = prettyInput.get(backwardCnt);
prettyInput.set(backwardCnt, -1);
prettyInput.set(forwardCnt, temp);
--backwardCnt;
++forwardCnt;
}
}
}
private long generateCheckSum(){
long sum = 0;
for(int loc = 0;loc < prettyInput.size();++loc){
if(prettyInput.get(loc) != -1){
sum += (loc * prettyInput.get(loc));
}
}
return sum;
}
}
/*
Find the filesystem checksum after compacting the files.
The filesystem checksum is 6370402949053.
It took 23.980 milliseconds to run this algorithm.
*/

View File

@@ -0,0 +1,140 @@
package com.mattrixwv.adventOfCode24.days;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.mattrixwv.Stopwatch;
public class Problem18 extends Problem{
private static final String inputFileName = "days/Problem17.txt";
private String rawInput;
private List<Integer> prettyInput;
public Problem18(){
super();
description = "Find the filesystem checksum after compacting the files.";
result = "Unresolved";
}
public String runSolution(){
Stopwatch timer = new Stopwatch();
timer.start();
//Read the file
/* */
try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){
scanner.useDelimiter("\n");
rawInput = scanner.next();
}
/* */
/*
rawInput = "2333133121414131402";
/* */
//Change the raw into into pretty input
generatePrettyInput();
//Compact the files
compactInput();
//Generate sum
long sum = generateCheckSum();
//Save the results
timer.stop();
result = "The filesystem checksum is " + sum + ".\nIt took " + timer.toString() + " to run this algorithm.";
return result;
}
private void generatePrettyInput(){
prettyInput = new ArrayList<>();
int fileNumber = 0;
boolean isFile = true;
for(int loc = 0;loc < rawInput.length();++loc){
//Get the next number
int num = Integer.parseInt(rawInput.charAt(loc) + "");
//If this number represents a file size then add the file number to the pretty input
if(isFile){
for(int cnt = 0;cnt < num;++cnt){
prettyInput.add(fileNumber);
}
++fileNumber;
}
//If this number represents free space then add -1 to the pretty input
else{
for(int cnt = 0;cnt < num;++cnt){
prettyInput.add(-1);
}
}
isFile = !isFile;
}
}
private void compactInput(){
//Get the last file id
int currentFileId = 0;
for(int cnt = prettyInput.size() - 1;(currentFileId == 0) && (cnt >= 0);--cnt){
if(prettyInput.get(cnt) != -1){
currentFileId = prettyInput.get(cnt);
}
}
while(currentFileId >= 0){
//Get the last file size
int startIndex = prettyInput.indexOf(currentFileId);
int size = 1 + prettyInput.lastIndexOf(currentFileId) - startIndex;
int indexOfBlankSpace = findBlankSpace(size, startIndex);
//Check if any blank spaces are large enough to fit the file
if(indexOfBlankSpace >= 0){
//Move the entire file to that space and blank out the file's current location
for(int cnt = 0;cnt < size;++cnt){
prettyInput.set(indexOfBlankSpace + cnt, currentFileId); //Move file
prettyInput.set(startIndex + cnt, -1); //Blank file's old location
}
}
--currentFileId;
}
}
private int findBlankSpace(int size, int finalIndex){
int currentBlankSize = 0;
for(int cnt = 0;(cnt < finalIndex) && (cnt < prettyInput.size());++cnt){
if(prettyInput.get(cnt) == -1){
++currentBlankSize;
}
else{
currentBlankSize = 0;
}
if(currentBlankSize >= size){
return 1 + cnt - size;
}
}
return -1;
}
private long generateCheckSum(){
long sum = 0;
for(int loc = 0;loc < prettyInput.size();++loc){
if(prettyInput.get(loc) != -1){
sum += (loc * prettyInput.get(loc));
}
}
return sum;
}
}
/*
Find the filesystem checksum after compacting the files.
The filesystem checksum is 6398096697992.
It took 617.157 milliseconds to run this algorithm.
*/

File diff suppressed because one or more lines are too long