2021aoc/Day3.cs

68 lines
1.9 KiB
C#

// #define Day3
#if Day3
using AoC2021;
var scans = File.ReadAllLines("day3/input").ToList();
var significantBitsList = scans.First().Select(c => c == '0' ? new SignificantBits() { zeros = 1 } : new SignificantBits() { ones = 1 }).ToList();
var indices = Enumerable.Range(0, significantBitsList.Count).ToList();
scans.Skip(1).ForEachAsList(bits =>
bits.ForEachIndex((b, i) => {
if (b == '0') {
significantBitsList[i].zeros++;
}
else {
significantBitsList[i].ones++;
}
}));
var gammaStr = String.Join("", significantBitsList.Select(s => s.ones > s.zeros ? "1" : "0"));
var epsilonStr= String.Join("", significantBitsList.Select(s => s.ones < s.zeros ? "1" : "0"));
var gamma = Convert.ToInt32(gammaStr, 2);
var epsilon = Convert.ToInt32(epsilonStr, 2);
Console.WriteLine(gamma * epsilon);
//Part2
int PartTwo(List<string>scans, Func<HashSet<int>, HashSet<int>, bool> check) {
var toCheck = Enumerable.Range(0, scans.Count).ToHashSet();
int index = 0;
while (toCheck.Count() > 1) {
var ones = new HashSet<int>();
var zeros = new HashSet<int>();
foreach (var o in toCheck) {
if (scans[o][index] == '1') {
ones.Add(o);
}
else {
zeros.Add(o);
}
}
if (check(ones, zeros)) {
toCheck.ExceptWith(zeros);
}
else {
toCheck.ExceptWith(ones);
}
index++;
}
return toCheck.First();
}
int oxygenLine = PartTwo(scans, (ones, zeros) => ones.Count >= zeros.Count);
int scrubberLine = PartTwo(scans, (ones, zeros) => ones.Count < zeros.Count);
int oxygen = Convert.ToInt32(scans[oxygenLine], 2);
int scrubber = Convert.ToInt32(scans[scrubberLine], 2);
Console.WriteLine(oxygen * scrubber); //400894
class SignificantBits {
public int zeros { get; set; }
public int ones { get; set; }
}
#endif