aoc2021/aoc2021/Day03.cs

63 lines
1.6 KiB
C#
Raw Permalink Normal View History

2021-12-03 06:05:45 +00:00
namespace aoc2021;
/// <summary>
/// Day 3: <see href="https://adventofcode.com/2021/day/3"/>
/// </summary>
public sealed class Day03 : Day
{
private readonly List<string> _report;
public Day03() : base(3, "Binary Diagnostic")
{
_report = Input.ToList();
}
2021-12-12 20:09:41 +00:00
public override object Part1()
2021-12-03 06:05:45 +00:00
{
var l = _report.Count / 2;
var g = new StringBuilder();
var e = new StringBuilder();
foreach (var i in Enumerable.Range(0, _report[0].Length))
{
var ones = _report.Select(r => r[i]).Count(c => c == '1');
g.Append(ones > l ? '1' : '0');
e.Append(ones > l ? '0' : '1');
}
var gamma = g.ToString().BigIntegerFromBinaryString();
var epsilon = e.ToString().BigIntegerFromBinaryString();
2021-12-03 06:05:45 +00:00
2021-12-12 20:09:41 +00:00
return gamma * epsilon;
2021-12-03 06:05:45 +00:00
}
2021-12-12 20:09:41 +00:00
public override object Part2()
2021-12-03 06:05:45 +00:00
{
2021-12-03 16:59:54 +00:00
var o = _report;
var c = _report;
2021-12-03 17:08:15 +00:00
char MostCommon(int i, IReadOnlyCollection<string> report) =>
report.Count(r => r[i] == '1') >= report.Count / 2.0 ? '1' : '0';
2021-12-03 16:59:54 +00:00
var i = 0;
while (o.Count > 1)
{
var most = MostCommon(i, o);
o = o.Where(r => r[i] == most).ToList();
2021-12-03 16:59:54 +00:00
i++;
}
var o2 = o.Single().BigIntegerFromBinaryString();
2021-12-03 16:59:54 +00:00
i = 0;
while (c.Count > 1)
{
var most = MostCommon(i, c);
c = c.Where(r => r[i] != most).ToList();
2021-12-03 16:59:54 +00:00
i++;
}
var co2 = c.Single().BigIntegerFromBinaryString();
2021-12-03 16:59:54 +00:00
2021-12-12 20:09:41 +00:00
return o2 * co2;
2021-12-03 06:05:45 +00:00
}
}