Files
AdventOfCode2024/src/main/java/com/mattrixwv/adventOfCode24/days/Problem14.java
2024-12-18 19:42:59 -05:00

125 lines
3.3 KiB
Java

package com.mattrixwv.adventOfCode24.days;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.mattrixwv.Stopwatch;
import com.mattrixwv.Triple;
public class Problem14 extends Problem{
private static final String inputFileName = "days/Problem13.txt";
private List<Triple<Long, List<Long>, List<Character>>> values;
public Problem14(){
super();
description = "Find the sum of the answers of the equations that have solutions.";
result = "Unresolved";
}
public String runSolution(){
Stopwatch timer = new Stopwatch();
timer.start();
//Read the file
values = new ArrayList<>();
try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){
scanner.useDelimiter("\n");
while(scanner.hasNext()){
String inputLine = scanner.next();
if(inputLine.isBlank()){
continue;
}
long answer = Long.parseLong(inputLine.split(":")[0]);
List<Long> elements = new ArrayList<>();
String elementsString = inputLine.split(":")[1];
for(String elementString : elementsString.split(" ")){
if(elementString.isBlank()){
continue;
}
long element = Long.parseLong(elementString);
elements.add(element);
}
List<Character> equations = new ArrayList<>();
for(int cnt = 0;cnt < elements.size() - 1;++cnt){
equations.add('+');
}
values.add(new Triple<Long, List<Long>, List<Character>>(answer, elements, equations));
}
}
long sum = 0;
for(Triple<Long, List<Long>, List<Character>> value : values){
if(hasSolution(value)){
sum += value.getA();
}
}
//Save the result
timer.stop();
result = "The sum of the answers of the equations that have solutions is " + sum + ".\nIt took " + timer.toString() + " to run the algorithm.";
return result;
}
private boolean hasSolution(Triple<Long, List<Long>, List<Character>> value){
//Loop through all possibilities for the equations and return true if one matches
for(int cnt = 0;cnt < (Math.pow(3, value.getC().size()));++cnt){
long equationValue = value.getB().get(0);
for(int eqnCnt = 0;eqnCnt < value.getC().size();++eqnCnt){
Character eqnIndicator = value.getC().get(eqnCnt);
if(eqnIndicator == '+'){
equationValue += value.getB().get(eqnCnt + 1);
}
else if(eqnIndicator == '*'){
equationValue *= value.getB().get(eqnCnt + 1);
}
else if(eqnIndicator == '|'){
equationValue = Long.parseLong(Long.toString(equationValue) + Long.toString(value.getB().get(eqnCnt + 1)));
}
}
//If the values match then return true
if(equationValue == value.getA()){
return true;
}
//If they don't match, advance to the next equation
else{
advanceEquations(value.getC());
}
}
return false;
}
private void advanceEquations(List<Character> eqn){
advanceEquations(eqn, 0);
}
private void advanceEquations(List<Character> eqn, int index){
if(index >= eqn.size()){
return;
}
if(eqn.get(index) == '+'){
eqn.set(index, '*');
}
else if(eqn.get(index) == '*'){
eqn.set(index, '|');
}
else if(eqn.get(index) == '|'){
eqn.set(index, '+');
advanceEquations(eqn, index + 1);
}
}
}
/*
Find the sum of the answers of the equations that have solutions.
The sum of the answers of the equations that have solutions is 1026766857276279.
It took 1.238 seconds to run the algorithm.
*/