From 2d4a568ed8ee5d8e5044ed1d48cf4a8a68861e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20C=C3=A1ceres?= Date: Mon, 4 Dec 2023 23:35:13 +0100 Subject: [PATCH] Add Day 4 part 1 solution without Pow --- src/AoC_2023/Day_04.cs | 27 ++++++++++++++++++- .../AoC_2023.Benchmarks/Day_04_Benchmarks.cs | 20 ++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/AoC_2023/Day_04.cs b/src/AoC_2023/Day_04.cs index 83a1bdb..a36a3ae 100644 --- a/src/AoC_2023/Day_04.cs +++ b/src/AoC_2023/Day_04.cs @@ -11,7 +11,7 @@ public Day_04() _input = ParseInput().ToList(); } - public override ValueTask Solve_1() => new($"{Solve_1_Original()}"); + public override ValueTask Solve_1() => new($"{Solve_1_NoPow()}"); public override ValueTask Solve_2() => new($"{Solve_2_NoDictionary()}"); @@ -20,6 +20,31 @@ public int Solve_1_Original() return _input.Sum(card => (int)Math.Pow(2, card.CardNumbers.Intersect(card.WinningNumbers).Count() - 1)); } + public int Solve_1_OptimizedIntersectOrder() + { + return _input.Sum(card => (int)Math.Pow(2, card.WinningNumbers.Intersect(card.CardNumbers).Count() - 1)); + } + + public int Solve_1_NoPow() + { + int result = 0; + + foreach (var card in _input) + { + var winnerThatWeHave = card.WinningNumbers.Intersect(card.CardNumbers).Count(); + + int points = winnerThatWeHave == 0 ? 0 : 1; + for (int i = 1; i < winnerThatWeHave; ++i) + { + points *= 2; + } + + result += points; + } + + return result; + } + public int Solve_2_Original() { Dictionary cards = _input.ToDictionary(card => card, _ => 1); diff --git a/tests/AoC_2023.Benchmarks/Day_04_Benchmarks.cs b/tests/AoC_2023.Benchmarks/Day_04_Benchmarks.cs index c2fbe83..70e6025 100644 --- a/tests/AoC_2023.Benchmarks/Day_04_Benchmarks.cs +++ b/tests/AoC_2023.Benchmarks/Day_04_Benchmarks.cs @@ -1,4 +1,10 @@ /* + * + * | Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio | + * |------------------------------ |---------:|--------:|--------:|------:|--------:|--------:|----------:|------------:| + * | Part1_Original | 211.6 us | 4.18 us | 4.29 us | 1.00 | 0.00 | 49.0723 | 100.53 KB | 1.00 | + * | Part1_OptimizedIntersectOrder | 199.9 us | 3.98 us | 4.59 us | 0.95 | 0.03 | 79.1016 | 161.84 KB | 1.61 | + * | Part1 | 187.9 us | 3.75 us | 3.85 us | 0.89 | 0.02 | 79.1016 | 161.8 KB | 1.61 | * * | Method | Mean | Error | StdDev | Ratio | Gen0 | Allocated | Alloc Ratio | * |------------------- |---------:|--------:|---------:|------:|--------:|----------:|------------:| @@ -9,6 +15,20 @@ namespace AoC_2023.Benchmarks; +public class Day_04_Part1 : BaseDayBenchmark +{ + private readonly Day_04 _problem = new(); + + [Benchmark(Baseline = true)] + public int Part1_Original() => _problem.Solve_1_Original(); + + [Benchmark] + public int Part1_OptimizedIntersectOrder() => _problem.Solve_1_OptimizedIntersectOrder(); + + [Benchmark] + public int Part1() => _problem.Solve_1_NoPow(); +} + public class Day_04_Part2 : BaseDayBenchmark { private readonly Day_04 _problem = new();