feat: solve part 1 of puzzle 3

This commit is contained in:
Stevan Freeborn
2023-12-04 10:32:14 -06:00
parent d50b7c75ca
commit 9f2ccdf17f
6 changed files with 250 additions and 13 deletions
+95 -2
View File
@@ -1,2 +1,95 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
namespace Scratchcards;
public class Program
{
public static async Task<int> Main(string[] args)
{
if (args.Length is 0)
{
Console.WriteLine("Please provide a path to the input file.");
return -1;
}
if (File.Exists(args[0]) is false)
{
Console.WriteLine("The provided file does not exist.");
return -2;
}
var puzzleSolver = new PuzzleSolver();
var input = await File.ReadAllLinesAsync(args[0]);
var result = puzzleSolver.SumCardValues(input);
Console.WriteLine($"The sum of all card values is {result}.");
return result;
}
}
public class PuzzleSolver
{
public int SumCardValues(string[] cards) => cards
.Select(Card.Parse)
.Sum(c => c.GetCardValue());
}
public class Card(
int id,
List<int> winningNumbers,
List<int> numbers
)
{
public int Id { get; init; } = id;
public List<int> WinningNumbers { get; init; } = winningNumbers;
public List<int> Numbers { get; init; } = numbers;
public int GetCardValue()
{
var commonNumbers = WinningNumbers.Intersect(Numbers).ToList();
return commonNumbers.Count is 1
? 1
: (int)Math.Pow(2, commonNumbers.Count - 1);
}
public static Card Parse(string input)
{
var parts = input.Split(':');
var cardId = int.Parse(
parts[0].Split(
' ',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
)[1]
);
var numberStrings = parts[1].Trim();
var numberParts = numberStrings
.Split('|')
.Select(s => s.Trim())
.ToArray();
var winningNumbersString = numberParts[0];
var numbersString = numberParts[1];
var winningNumbers = winningNumbersString
.Split(
' ',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
)
.Select(s => s.Trim())
.Select(int.Parse)
.ToList();
var numbers = numbersString
.Split(
' ',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
)
.Select(s => s.Trim())
.Select(int.Parse)
.ToList();
return new Card(cardId, winningNumbers, numbers);
}
}