// #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(Listscans, Func, HashSet, bool> check) { var toCheck = Enumerable.Range(0, scans.Count).ToHashSet(); int index = 0; while (toCheck.Count() > 1) { var ones = new HashSet(); var zeros = new HashSet(); 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