diff --git a/aoc2021/Day03.cs b/aoc2021/Day03.cs
index 85e1c81..f8e18dc 100644
--- a/aoc2021/Day03.cs
+++ b/aoc2021/Day03.cs
@@ -25,8 +25,8 @@ public sealed class Day03 : Day
e.Append(ones > l ? '0' : '1');
}
- var gamma = Convert.ToInt32(g.ToString(), 2);
- var epsilon = Convert.ToInt32(e.ToString(), 2);
+ var gamma = g.ToString().BigIntegerFromBinaryString();
+ var epsilon = e.ToString().BigIntegerFromBinaryString();
return $"{gamma * epsilon}";
}
@@ -42,18 +42,20 @@ public sealed class Day03 : Day
var i = 0;
while (o.Count > 1)
{
- o = o.Where(r => r[i] == MostCommon(i, o)).ToList();
+ var most = MostCommon(i, o);
+ o = o.Where(r => r[i] == most).ToList();
i++;
}
- var o2 = Convert.ToInt64(o.Single(), 2);
+ var o2 = o.Single().BigIntegerFromBinaryString();
i = 0;
while (c.Count > 1)
{
- c = c.Where(r => r[i] != MostCommon(i, c)).ToList();
+ var most = MostCommon(i, c);
+ c = c.Where(r => r[i] != most).ToList();
i++;
}
- var co2 = Convert.ToInt64(c.Single(), 2);
+ var co2 = c.Single().BigIntegerFromBinaryString();
return $"{o2 * co2}";
}
diff --git a/aoc2021/Extensions.cs b/aoc2021/Extensions.cs
index 44202c4..84587a4 100644
--- a/aoc2021/Extensions.cs
+++ b/aoc2021/Extensions.cs
@@ -1,4 +1,6 @@
-namespace aoc2021;
+using System.Numerics;
+
+namespace aoc2021;
public static class Extensions
{
@@ -23,4 +25,21 @@ public static class Extensions
///
public static bool Contains(this Range range, int i) =>
i >= range.Start.Value && i <= range.End.Value;
+
+ ///
+ /// Creates a new BigInteger from a binary (Base2) string
+ ///
+ ///
+ public static BigInteger BigIntegerFromBinaryString(this string binaryValue)
+ {
+ BigInteger res = 0;
+ if (binaryValue.Count(b => b == '1') + binaryValue.Count(b => b == '0') != binaryValue.Length) return res;
+ foreach (var c in binaryValue)
+ {
+ res <<= 1;
+ res += c == '1' ? 1 : 0;
+ }
+
+ return res;
+ }
}