namespace day2; public class Day2 { private static IList> _splitLineToCubeSets(string line) { var cubeSets = new List>(); var cubeSetStrings = line.Split(";"); foreach (var cubeSetString in cubeSetStrings) { var cubeStrings = cubeSetString.Split(","); var newCubeSet = new Dictionary(); foreach (var cubeString in cubeStrings) { var splitCube = cubeString.Trim().Split(" "); newCubeSet.Add(splitCube[1], int.Parse(splitCube[0])); } cubeSets.Add(newCubeSet); } return cubeSets; } private static bool _isGamePossible(string gameLine, IDictionary expectedBag) { var parsedGame = _splitLineToCubeSets(gameLine); foreach (var parsedCubeSet in parsedGame) { var isSetPossible = parsedCubeSet.Aggregate(true, (current, kvp) => current && kvp.Value <= expectedBag[kvp.Key]); if (!isSetPossible) { return false; } } return true; } private static IDictionary _minimumPossibleCubes(string gameLine) { var parsedGame = _splitLineToCubeSets(gameLine); var minimumCubes = new Dictionary(); foreach (var cubeSet in parsedGame) { foreach (var (color, frequency) in cubeSet) { minimumCubes[color] = minimumCubes.ContainsKey(color) ? Math.Max(minimumCubes[color], frequency) : frequency; } } return minimumCubes; } public static int PartOne(string[] lines) { var finalResult = 0; foreach (var line in lines) { var splitLine = line.Split(":").Select(s => s.Trim()).ToList(); var gameNumber = int.Parse(splitLine[0].Split(" ")[1]); var gameLine = splitLine[1]; var expectedBag = new Dictionary() { { "red", 12 }, { "green", 13 }, { "blue", 14 } }; if (_isGamePossible(gameLine, expectedBag)) { finalResult += gameNumber; } } return finalResult; } public static int PartTwo(string[] lines) { var finalResult = 0; foreach (var line in lines) { var splitLine = line.Split(":").Select(s => s.Trim()).ToList(); var gameNumber = int.Parse(splitLine[0].Split(" ")[1]); var gameLine = splitLine[1]; var minimumPossibleCubes = _minimumPossibleCubes(gameLine); var minimumRed = minimumPossibleCubes.ContainsKey("red") ? minimumPossibleCubes["red"] : 0; var minimumGreen = minimumPossibleCubes.ContainsKey("green") ? minimumPossibleCubes["green"] : 0; var minimumBlue = minimumPossibleCubes.ContainsKey("blue") ? minimumPossibleCubes["blue"] : 0; var power = minimumRed * minimumGreen * minimumBlue; finalResult += power; } return finalResult; } }