80 lines
1.8 KiB
C#
80 lines
1.8 KiB
C#
namespace AOC2022.Puzzles;
|
|
|
|
internal class Day3 : IPuzzle
|
|
{
|
|
private readonly string[] _linesFromFile;
|
|
private readonly int _noOfRuckSacks;
|
|
|
|
public Day3(string[] linesFromFile)
|
|
{
|
|
_linesFromFile = linesFromFile;
|
|
_noOfRuckSacks = linesFromFile.Length;
|
|
}
|
|
|
|
public void SolveFirstPuzzle()
|
|
{
|
|
var leftCompartments = new string[_noOfRuckSacks];
|
|
var rightCompartments = new string[_noOfRuckSacks];
|
|
var index = 0;
|
|
foreach (var line in _linesFromFile)
|
|
{
|
|
var ruckSack = line.Trim();
|
|
|
|
leftCompartments[index] = ruckSack[..(ruckSack.Length / 2)];
|
|
rightCompartments[index] = ruckSack[(ruckSack.Length / 2)..];
|
|
|
|
index++;
|
|
}
|
|
|
|
var prioritySum = 0;
|
|
for (var i = 0; i < _noOfRuckSacks; i++)
|
|
{
|
|
var duplicateItem = ' ';
|
|
foreach (var item in leftCompartments[i].Where(item => rightCompartments[i].Contains(item)))
|
|
{
|
|
duplicateItem = item;
|
|
break;
|
|
}
|
|
|
|
prioritySum += EvaluatePriority(duplicateItem);
|
|
}
|
|
|
|
Console.WriteLine($"Priority sum of duplicate items in compartments: {prioritySum}");
|
|
}
|
|
|
|
public void SolveSecondPuzzle()
|
|
{
|
|
var prioritySum = 0;
|
|
for (var i = 0; i < _noOfRuckSacks; i += 3)
|
|
{
|
|
var elf1Sack = _linesFromFile[i].Trim();
|
|
var elf2Sack = _linesFromFile[i + 1].Trim();
|
|
var elf3Sack = _linesFromFile[i + 2].Trim();
|
|
var authenticItem = ' ';
|
|
foreach (var item in elf1Sack.Where(item => elf2Sack.Contains(item) && elf3Sack.Contains(item)))
|
|
{
|
|
authenticItem = item;
|
|
break;
|
|
}
|
|
|
|
prioritySum += EvaluatePriority(authenticItem);
|
|
}
|
|
|
|
Console.WriteLine($"Priority sum of authentic items groups of 3 elves: {prioritySum}");
|
|
}
|
|
|
|
private static int EvaluatePriority(char ruckSackItem)
|
|
{
|
|
if (char.IsUpper(ruckSackItem))
|
|
{
|
|
return ruckSackItem - 'A' + 27;
|
|
}
|
|
|
|
if (char.IsLower(ruckSackItem))
|
|
{
|
|
return ruckSackItem - 'a' + 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
} |