Advent Of Code 2022 - Day 3
Day 3 - Rucksack Reorganisation
See Day 3 for a detailed description of the problem.
Continuing to solve the Advent of Code 2022 problems (see Advent of Code - Day 1).
Links:
To run the example code in this post save the code into file such as
advent.jactl
and take your input from the Advent of Code site (e.g.advent.txt
) and run it like this:$ cat advent.txt | java -jar jactl-2.1.0.jar advent.jactl
Part 1
Part 1 involved splitting each input line in half and then finding which letters were in common between the two halves and then generating a “priority” score for the letter (a-z: 1-26, A-Z:27-52) and summing the priorities of these common letters.
The only difficulty was remembering to filter out duplicates.
stream(nextLine).flatMap{
def half1 = it.substring(0,it.size()/2);
def half2 = it.substring(it.size()/2);
half1.filter{ it in half2 }.sort().unique()
}
.map{ /[a-z]/r ? (int)it - (int)'a' + 1 : (int)it - (int)'A' + 27 }
.sum()
Part 2
For part 2 we have to group the input lines into sets of 3 and find the letter in common across each set of 3 lines and then sum their priorities as before.
Using the grouped()
method which groups sets of consecutive elements into a series of lists, this turned out
to be fairly simple to implement.
stream(nextLine).grouped(3)
.flatMap{ a,b,c -> a.filter{ it in b && it in c }.sort().unique() }
.map{ /[a-z]/r ? (int)it - (int)'a' + 1 : (int)it - (int)'A' + 27 }
.sum()