mirror of
https://github.com/jcreek/advent-of-code.git
synced 2026-07-12 18:53:47 +00:00
179 lines
8.3 KiB
C#
179 lines
8.3 KiB
C#
namespace Day03
|
|
{
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
//Part1();
|
|
Part2();
|
|
}
|
|
|
|
|
|
static void Part1()
|
|
{
|
|
// Part 1
|
|
string[] lines = File.ReadAllLines("input.txt");
|
|
List<BinaryData> binaryDataList = new List<BinaryData>();
|
|
|
|
foreach (string line in lines)
|
|
{
|
|
BinaryData binaryData = new BinaryData()
|
|
{
|
|
Digit0 = Int32.Parse(line[0].ToString()),
|
|
Digit1 = Int32.Parse(line[1].ToString()),
|
|
Digit2 = Int32.Parse(line[2].ToString()),
|
|
Digit3 = Int32.Parse(line[3].ToString()),
|
|
Digit4 = Int32.Parse(line[4].ToString()),
|
|
Digit5 = Int32.Parse(line[5].ToString()),
|
|
Digit6 = Int32.Parse(line[6].ToString()),
|
|
Digit7 = Int32.Parse(line[7].ToString()),
|
|
Digit8 = Int32.Parse(line[8].ToString()),
|
|
Digit9 = Int32.Parse(line[9].ToString()),
|
|
Digit10 = Int32.Parse(line[10].ToString()),
|
|
Digit11 = Int32.Parse(line[11].ToString()),
|
|
};
|
|
|
|
binaryDataList.Add(binaryData);
|
|
}
|
|
|
|
// for first digit find most common, 2nd digit most common, etc to get the gamma rate
|
|
int mostOccurred0 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit0).ToList());
|
|
int mostOccurred1 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit1).ToList());
|
|
int mostOccurred2 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit2).ToList());
|
|
int mostOccurred3 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit3).ToList());
|
|
int mostOccurred4 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit4).ToList());
|
|
int mostOccurred5 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit5).ToList());
|
|
int mostOccurred6 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit6).ToList());
|
|
int mostOccurred7 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit7).ToList());
|
|
int mostOccurred8 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit8).ToList());
|
|
int mostOccurred9 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit9).ToList());
|
|
int mostOccurred10 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit10).ToList());
|
|
int mostOccurred11 = GetMostOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit11).ToList());
|
|
|
|
string mostOccurred = "" + mostOccurred0 + mostOccurred1 + mostOccurred2 + mostOccurred3 + mostOccurred4 + mostOccurred5 + mostOccurred6 + mostOccurred7 + mostOccurred8 + mostOccurred9 + mostOccurred10 + mostOccurred11;
|
|
|
|
// for first digit find least common, 2nd digit least common, etc to get the epsilon rate
|
|
int leastOccurred0 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit0).ToList());
|
|
int leastOccurred1 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit1).ToList());
|
|
int leastOccurred2 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit2).ToList());
|
|
int leastOccurred3 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit3).ToList());
|
|
int leastOccurred4 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit4).ToList());
|
|
int leastOccurred5 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit5).ToList());
|
|
int leastOccurred6 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit6).ToList());
|
|
int leastOccurred7 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit7).ToList());
|
|
int leastOccurred8 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit8).ToList());
|
|
int leastOccurred9 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit9).ToList());
|
|
int leastOccurred10 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit10).ToList());
|
|
int leastOccurred11 = GetLeastOccurredCharacterAtPosition(binaryDataList.Select(x => x.Digit11).ToList());
|
|
|
|
string leastOccurred = "" + leastOccurred0 + leastOccurred1 + leastOccurred2 + leastOccurred3 + leastOccurred4 + leastOccurred5 + leastOccurred6 + leastOccurred7 + leastOccurred8 + leastOccurred9 + leastOccurred10 + leastOccurred11;
|
|
|
|
Console.WriteLine($"MO: {mostOccurred} LO: {leastOccurred}");
|
|
|
|
string gammaRate = string.Join("", mostOccurred);
|
|
int gammaRateDenary = Convert.ToInt32(gammaRate, 2);
|
|
string epsilonRate = string.Join("", leastOccurred);
|
|
int epsilonRateDenary = Convert.ToInt32(epsilonRate, 2);
|
|
|
|
// multiply gamma rate by epislon rate to get power consumption
|
|
int powerConsumption = gammaRateDenary * epsilonRateDenary;
|
|
|
|
Console.WriteLine($"Gamma rate: {gammaRate} Epsilon rate: {epsilonRate} Power consumption: {powerConsumption}");
|
|
}
|
|
|
|
static void Part2()
|
|
{
|
|
string[] lines = File.ReadAllLines("input.txt");
|
|
List<string> linesForOxygen = lines.ToList();
|
|
List<string> linesForCo2 = lines.ToList();
|
|
|
|
for (int i = 0; i < lines[0].Length; i++)
|
|
{
|
|
if (linesForOxygen.Count > 1)
|
|
{
|
|
int mostCommon = GetMostOccurredCharacterAtPositionWithEqualHandling(linesForOxygen.Select(x => Int32.Parse(x[i].ToString())).ToList());
|
|
linesForOxygen = linesForOxygen.Where(x => x[i] == mostCommon.ToString()[0]).ToList();
|
|
}
|
|
|
|
if (linesForCo2.Count > 1)
|
|
{
|
|
int leastCommon = GetLeastOccurredCharacterAtPositionWithEqualHandling(linesForCo2.Select(x => Int32.Parse(x[i].ToString())).ToList());
|
|
linesForCo2 = linesForCo2.Where(x => x[i] == leastCommon.ToString()[0]).ToList();
|
|
}
|
|
}
|
|
|
|
Console.WriteLine($"Oxygen: {linesForOxygen[0]} CO2: {linesForCo2[0]}");
|
|
|
|
int oxygenDenary = Convert.ToInt32(linesForOxygen[0], 2);
|
|
int co2Denary = Convert.ToInt32(linesForCo2[0], 2);
|
|
|
|
// life support rating = oxygen generator rating * co2 scrubber rating
|
|
int lifeSupportRating = oxygenDenary * co2Denary;
|
|
|
|
Console.WriteLine($"Oxygen: {oxygenDenary} CO2: {co2Denary} Life support rating: {lifeSupportRating}");
|
|
}
|
|
|
|
|
|
public static int GetMostOccurredCharacterAtPositionWithEqualHandling(List<int> list)
|
|
{
|
|
var count0 = list.Where(x => x == 0).Count();
|
|
var count1 = list.Where(x => x == 1).Count();
|
|
|
|
if (count0 == count1)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
if (count0 > count1)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static int GetLeastOccurredCharacterAtPositionWithEqualHandling(List<int> list)
|
|
{
|
|
var count0 = list.Where(x => x == 0).Count();
|
|
var count1 = list.Where(x => x == 1).Count();
|
|
|
|
if (count0 == count1)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
if (count0 > count1)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static int GetMostOccurredCharacterAtPosition(List<int> list)
|
|
{
|
|
return list
|
|
.GroupBy(x => x)
|
|
.OrderByDescending(group => group.Count())
|
|
.Select(x => x.Key)
|
|
.First();
|
|
}
|
|
|
|
public static int GetLeastOccurredCharacterAtPosition(List<int> list)
|
|
{
|
|
return list
|
|
.GroupBy(x => x)
|
|
.OrderBy(group => group.Count())
|
|
.Select(x => x.Key)
|
|
.First();
|
|
}
|
|
}
|
|
} |