Complete day 10
This commit is contained in:
@@ -17,7 +17,9 @@ 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.Problem19;
|
||||
import com.mattrixwv.adventOfCode24.days.Problem2;
|
||||
import com.mattrixwv.adventOfCode24.days.Problem20;
|
||||
import com.mattrixwv.adventOfCode24.days.Problem3;
|
||||
import com.mattrixwv.adventOfCode24.days.Problem4;
|
||||
import com.mattrixwv.adventOfCode24.days.Problem5;
|
||||
@@ -32,7 +34,8 @@ 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, 17, 18
|
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
);
|
||||
|
||||
|
||||
@@ -63,6 +66,8 @@ public class ProblemSelector{
|
||||
case 16 : day = new Problem16(); break;
|
||||
case 17 : day = new Problem17(); break;
|
||||
case 18 : day = new Problem18(); break;
|
||||
case 19 : day = new Problem19(); break;
|
||||
case 20 : day = new Problem20(); break;
|
||||
default: throw new InvalidParameterException();
|
||||
}
|
||||
return day;
|
||||
|
||||
177
src/main/java/com/mattrixwv/adventOfCode24/days/Problem19.java
Normal file
177
src/main/java/com/mattrixwv/adventOfCode24/days/Problem19.java
Normal file
@@ -0,0 +1,177 @@
|
||||
package com.mattrixwv.adventOfCode24.days;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
|
||||
import com.mattrixwv.Stopwatch;
|
||||
import com.mattrixwv.Triple;
|
||||
|
||||
public class Problem19 extends Problem{
|
||||
private static final String inputFileName = "days/Problem19.txt";
|
||||
private List<List<Integer>> map;
|
||||
private List<Triple<Integer, Integer, Integer>> trailHeadScores;
|
||||
|
||||
|
||||
public Problem19(){
|
||||
super();
|
||||
description = "Find the sum of the trail head scores.";
|
||||
result = "Unresolved";
|
||||
}
|
||||
|
||||
|
||||
public String runSolution(){
|
||||
Stopwatch timer = new Stopwatch();
|
||||
timer.start();
|
||||
|
||||
|
||||
//Read the file
|
||||
map = new ArrayList<>();
|
||||
try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){
|
||||
scanner.useDelimiter("\n");
|
||||
while(scanner.hasNext()){
|
||||
String mapLine = scanner.next();
|
||||
if(!mapLine.isBlank()){
|
||||
List<Integer> mapArray = new ArrayList<>();
|
||||
for(char ch : mapLine.toCharArray()){
|
||||
mapArray.add(Integer.parseInt(Character.toString(ch)));
|
||||
}
|
||||
map.add(mapArray);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Calculate the trail head scores
|
||||
trailHeadScores = new ArrayList<>();
|
||||
for(int rowCnt = 0;rowCnt < map.size();++rowCnt){
|
||||
for(int colCnt = 0;colCnt < map.get(rowCnt).size();++colCnt){
|
||||
if(map.get(rowCnt).get(colCnt) == 0){
|
||||
Set<Triple<Integer, Integer, Integer>> foundEndpoints = new HashSet<>();
|
||||
foundEndpoints.addAll(checkAllDirections(new Triple<Integer, Integer, Integer>(rowCnt, colCnt, 0)));
|
||||
trailHeadScores.add(new Triple<Integer, Integer, Integer>(rowCnt, colCnt, foundEndpoints.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Sum the trail head scores
|
||||
int sum = 0;
|
||||
for(Triple<Integer, Integer, Integer> trailHeadScore : trailHeadScores){
|
||||
sum += trailHeadScore.getC();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Save the results
|
||||
timer.stop();
|
||||
result = "The sum of the trail head scores is " + sum + ".\nIt took " + timer.toString() + " to run this algorithm.";
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private Set<Triple<Integer, Integer, Integer>> checkAllDirections(Triple<Integer, Integer, Integer> loc){
|
||||
Set<Triple<Integer, Integer, Integer>> foundEndpoints = new HashSet<>();
|
||||
foundEndpoints.addAll(moveUp(loc));
|
||||
foundEndpoints.addAll(moveRight(loc));
|
||||
foundEndpoints.addAll(moveDown(loc));
|
||||
foundEndpoints.addAll(moveLeft(loc));
|
||||
return foundEndpoints;
|
||||
}
|
||||
|
||||
private Set<Triple<Integer, Integer, Integer>> moveUp(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() <= 0) || (loc.getA() >= map.size()) || (loc.getB() < 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
Set<Triple<Integer, Integer, Integer>> finishSet = new HashSet<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA() - 1).get(loc.getB()) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA() - 1, loc.getB(), loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishSet.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishSet.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty set
|
||||
//Return any values we found
|
||||
return finishSet;
|
||||
}
|
||||
|
||||
private Set<Triple<Integer, Integer, Integer>> moveRight(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= map.size()) || (loc.getB() < 0) || (loc.getB() >= (map.get(loc.getA()).size() - 1))){
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
Set<Triple<Integer, Integer, Integer>> finishSet = new HashSet<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA()).get(loc.getB() + 1) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA(), loc.getB() + 1, loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishSet.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishSet.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty set
|
||||
//Return any values we found
|
||||
return finishSet;
|
||||
}
|
||||
|
||||
private Set<Triple<Integer, Integer, Integer>> moveDown(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= (map.size() - 1)) || (loc.getB() < 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
Set<Triple<Integer, Integer, Integer>> finishSet = new HashSet<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA() + 1).get(loc.getB()) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA() + 1, loc.getB(), loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishSet.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishSet.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty set
|
||||
//Return any values we found
|
||||
return finishSet;
|
||||
}
|
||||
|
||||
private Set<Triple<Integer, Integer, Integer>> moveLeft(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= map.size()) || (loc.getB() <= 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
Set<Triple<Integer, Integer, Integer>> finishSet = new HashSet<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA()).get(loc.getB() - 1) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA(), loc.getB() - 1, loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishSet.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishSet.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty set
|
||||
//Return any values we found
|
||||
return finishSet;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Find the sum of the trail head scores.
|
||||
The sum of the trail head scores is 510.
|
||||
It took 16.725 milliseconds to run this algorithm.
|
||||
*/
|
||||
176
src/main/java/com/mattrixwv/adventOfCode24/days/Problem20.java
Normal file
176
src/main/java/com/mattrixwv/adventOfCode24/days/Problem20.java
Normal file
@@ -0,0 +1,176 @@
|
||||
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 Problem20 extends Problem{
|
||||
private static final String inputFileName = "days/Problem19.txt";
|
||||
private List<List<Integer>> map;
|
||||
private List<Triple<Integer, Integer, Integer>> trailHeadScores;
|
||||
|
||||
|
||||
public Problem20(){
|
||||
super();
|
||||
description = "Find the sum of the trail head scores.";
|
||||
result = "Unresolved";
|
||||
}
|
||||
|
||||
|
||||
public String runSolution(){
|
||||
Stopwatch timer = new Stopwatch();
|
||||
timer.start();
|
||||
|
||||
|
||||
//Read the file
|
||||
map = new ArrayList<>();
|
||||
try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){
|
||||
scanner.useDelimiter("\n");
|
||||
while(scanner.hasNext()){
|
||||
String mapLine = scanner.next();
|
||||
if(!mapLine.isBlank()){
|
||||
List<Integer> mapArray = new ArrayList<>();
|
||||
for(char ch : mapLine.toCharArray()){
|
||||
mapArray.add(Integer.parseInt(Character.toString(ch)));
|
||||
}
|
||||
map.add(mapArray);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Calculate the trail head scores
|
||||
trailHeadScores = new ArrayList<>();
|
||||
for(int rowCnt = 0;rowCnt < map.size();++rowCnt){
|
||||
for(int colCnt = 0;colCnt < map.get(rowCnt).size();++colCnt){
|
||||
if(map.get(rowCnt).get(colCnt) == 0){
|
||||
List<Triple<Integer, Integer, Integer>> foundEndpoints = new ArrayList<>();
|
||||
foundEndpoints.addAll(checkAllDirections(new Triple<Integer, Integer, Integer>(rowCnt, colCnt, 0)));
|
||||
trailHeadScores.add(new Triple<Integer, Integer, Integer>(rowCnt, colCnt, foundEndpoints.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Sum the trail head scores
|
||||
int sum = 0;
|
||||
for(Triple<Integer, Integer, Integer> trailHeadScore : trailHeadScores){
|
||||
sum += trailHeadScore.getC();
|
||||
}
|
||||
|
||||
|
||||
//Save the results
|
||||
timer.stop();
|
||||
result = "The sum of the trail head scores is " + sum + ".\nIt took " + timer.toString() + " to run this algorithm.";
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private List<Triple<Integer, Integer, Integer>> checkAllDirections(Triple<Integer, Integer, Integer> loc){
|
||||
List<Triple<Integer, Integer, Integer>> foundEndpoints = new ArrayList<>();
|
||||
foundEndpoints.addAll(moveUp(loc));
|
||||
foundEndpoints.addAll(moveRight(loc));
|
||||
foundEndpoints.addAll(moveDown(loc));
|
||||
foundEndpoints.addAll(moveLeft(loc));
|
||||
return foundEndpoints;
|
||||
}
|
||||
|
||||
private List<Triple<Integer, Integer, Integer>> moveUp(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() <= 0) || (loc.getA() >= map.size()) || (loc.getB() < 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
List<Triple<Integer, Integer, Integer>> finishList = new ArrayList<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA() - 1).get(loc.getB()) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA() - 1, loc.getB(), loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishList.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishList.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty list
|
||||
//Return any values we found
|
||||
return finishList;
|
||||
}
|
||||
|
||||
private List<Triple<Integer, Integer, Integer>> moveRight(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= map.size()) || (loc.getB() < 0) || (loc.getB() >= (map.get(loc.getA()).size() - 1))){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
List<Triple<Integer, Integer, Integer>> finishList = new ArrayList<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA()).get(loc.getB() + 1) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA(), loc.getB() + 1, loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishList.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishList.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty list
|
||||
//Return any values we found
|
||||
return finishList;
|
||||
}
|
||||
|
||||
private List<Triple<Integer, Integer, Integer>> moveDown(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= (map.size() - 1)) || (loc.getB() < 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
List<Triple<Integer, Integer, Integer>> finishList = new ArrayList<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA() + 1).get(loc.getB()) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA() + 1, loc.getB(), loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishList.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishList.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty list
|
||||
//Return any values we found
|
||||
return finishList;
|
||||
}
|
||||
|
||||
private List<Triple<Integer, Integer, Integer>> moveLeft(Triple<Integer, Integer, Integer> loc){
|
||||
//Check the current and next elements are in bounds
|
||||
if((loc.getA() < 0) || (loc.getA() >= map.size()) || (loc.getB() <= 0) || (loc.getB() >= map.get(loc.getA()).size())){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
List<Triple<Integer, Integer, Integer>> finishList = new ArrayList<>();
|
||||
//Check if we need to continue looking
|
||||
if(map.get(loc.getA()).get(loc.getB() - 1) == (loc.getC() + 1)){
|
||||
Triple<Integer, Integer, Integer> newLoc = new Triple<Integer, Integer, Integer>(loc.getA(), loc.getB() - 1, loc.getC() + 1);
|
||||
if(newLoc.getC() == 9){
|
||||
finishList.add(newLoc);
|
||||
}
|
||||
else{
|
||||
finishList.addAll(checkAllDirections(newLoc));
|
||||
}
|
||||
}
|
||||
//If the next value is not correct, then return an empty list
|
||||
//Return any values we found
|
||||
return finishList;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Find the sum of the trail head scores.
|
||||
The sum of the trail head scores is 1058.
|
||||
It took 8.705 milliseconds to run this algorithm.
|
||||
*/
|
||||
43
src/main/resources/days/Problem19.txt
Normal file
43
src/main/resources/days/Problem19.txt
Normal file
@@ -0,0 +1,43 @@
|
||||
3212345678121056780310106543218765210109876
|
||||
7301106769012349891210237858909650987212345
|
||||
8943219878734217894354345997434501896398730
|
||||
7654306765025606765969876786521432345485621
|
||||
1233456834110715610870945431010676541014678
|
||||
0321067923230894320101234894321289239823549
|
||||
7450478810301129831230128765045658178101630
|
||||
8964329234532034761945219652136789017652721
|
||||
7875012187645695610876106543221054787243890
|
||||
4976701094556786921065987233234565692104323
|
||||
3289898763216547836976856100149874563495414
|
||||
4122305603407436545885445765454703454386901
|
||||
5001414512518921056794039870363212325677842
|
||||
6980523347676545121603128981278101210543234
|
||||
7879601258989236730512789974329892105601100
|
||||
0968708769076107845676697865012783416782321
|
||||
1651219940145045912389546521323676545699450
|
||||
2340367831231236705489030430654541236598769
|
||||
4565456328900987876018121046543010167894378
|
||||
3678995417811432980127630198672187098765298
|
||||
2980987606321501676534548767981096523030167
|
||||
1011876545450650101456759854102345614123454
|
||||
9872345034968763212321876543201298705323456
|
||||
8960101123879454789410989812120398676311237
|
||||
1051211012567345673508989401032367985200398
|
||||
2340349873498212232679876501001456810123478
|
||||
1232456780341000141089845432132345210194569
|
||||
0541542191232567657897894012201106761087654
|
||||
5670233088943498766501703025672239872398743
|
||||
4589104567652567898432612134984346765489232
|
||||
5498010988961043765430543210789655159896101
|
||||
4321023870870152896321432323658705014765012
|
||||
2349834561431161067816521874503216723454101
|
||||
1056767652521078154907890963212345894323221
|
||||
0148988943652189143878903454503454513411230
|
||||
3297803456789321012363212367696543201500549
|
||||
4586912369878934101454201008987012102676678
|
||||
5675001078767765210323123412108991343989654
|
||||
6784100981059874349014056503234780256978703
|
||||
7693201452342103458005347854345650107869012
|
||||
8543542367033012567176218961259654398054327
|
||||
9232632198124988943287307870568765212167898
|
||||
0101789087235677656896478969876890103456787
|
||||
Reference in New Issue
Block a user