68 lines
1.9 KiB
C#
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 |