Procházet zdrojové kódy

Day 6 part 2 with larger numbers

Lukas Angerer před 2 roky
rodič
revize
6a863b0352
3 změnil soubory, kde provedl 23 přidání a 7 odebrání
  1. 15 1
      Day6/Program.cs
  2. 6 4
      Day6/RaceStats.cs
  3. 2 2
      Day6/RaceTimeParser.cs

+ 15 - 1
Day6/Program.cs

@@ -10,7 +10,7 @@ var inputFile = args[0];
 var parser = new RaceTimeParser();
 
 var races = parser.Parse(inputFile);
-var total = 1;
+var total = 1L;
 
 foreach (var race in races)
 {
@@ -25,4 +25,18 @@ foreach (var race in races)
 Console.WriteLine();
 Console.WriteLine($"Total: {total}");
 
+var combinedTime = 0L;
+var combinedDistance = 0L;
+foreach (var race in races)
+{
+    combinedTime = combinedTime * (long)Math.Pow(10, (int)Math.Ceiling(Math.Log10(race.Duration))) + race.Duration;
+    combinedDistance = combinedDistance * (long)Math.Pow(10, (int)Math.Ceiling(Math.Log10(race.Distance))) + race.Distance;
+}
+
+var actualRace = new RaceStats(combinedTime, combinedDistance);
+var actualBound = actualRace.LowerBound();
+Console.WriteLine($"{actualRace.Duration} / {actualRace.Distance} => {actualBound}");
+var actualOptions = actualRace.Duration - 2 * actualBound + 1;
+Console.WriteLine($"Options: {actualOptions}");
+
 return 0;

+ 6 - 4
Day6/RaceStats.cs

@@ -1,11 +1,13 @@
 namespace Day6;
 
-public record RaceStats(int Duration, int Distance)
+public record RaceStats(long Duration, long Distance)
 {
-    public int LowerBound()
+    public long LowerBound()
     {
-        var lowerBound = (-Duration + Math.Sqrt(Duration * Duration - 4 * Distance)) / (-2.0);
-        var nextWhole = (int)Math.Ceiling(lowerBound);
+        var duration = (double)Duration;
+        var distance = (double)Distance;
+        var lowerBound = (-duration + Math.Sqrt(duration * duration - 4 * distance)) / (-2.0);
+        var nextWhole = (long)Math.Ceiling(lowerBound);
         return nextWhole > lowerBound ? nextWhole : nextWhole + 1;
     }
 }

+ 2 - 2
Day6/RaceTimeParser.cs

@@ -12,9 +12,9 @@ public partial class RaceTimeParser
         using var reader = File.OpenText(inputFile);
 
         var timesLine = reader.ReadLine()!;
-        var times = NumberList().Matches(timesLine.Substring("Time:".Length)).Cast<Match>().Select(x => int.Parse(x.Value)).ToList();
+        var times = NumberList().Matches(timesLine.Substring("Time:".Length)).Cast<Match>().Select(x => long.Parse(x.Value)).ToList();
         var durationsLine = reader.ReadLine()!;
-        var durations = NumberList().Matches(durationsLine.Substring("Distance:".Length)).Cast<Match>().Select(x => int.Parse(x.Value)).ToList();
+        var durations = NumberList().Matches(durationsLine.Substring("Distance:".Length)).Cast<Match>().Select(x => long.Parse(x.Value)).ToList();
 
         if (times.Count != durations.Count)
         {