|
6 | 6 | .SplitToNumbers(" ") |
7 | 7 | .Select(v => new Stone((ulong)v, 0)); |
8 | 8 |
|
9 | | -var queue = new ConcurrentQueue<Stone>(); |
| 9 | +Console.WriteLine(string.Join(", ", stones.Select(s => ReturnDifferentStones(s.Number).Count))); |
| 10 | + |
| 11 | +static HashSet<ulong> ReturnDifferentStones(ulong number) |
| 12 | +{ |
| 13 | + HashSet<ulong> differentStones = [ number ]; |
| 14 | + var queue = new ConcurrentQueue<ulong>(); |
| 15 | + queue.Enqueue(number); |
| 16 | + var previousCount = 0; |
| 17 | + |
| 18 | + while (!queue.IsEmpty && previousCount != differentStones.Count) |
| 19 | + { |
| 20 | + previousCount = differentStones.Count; |
| 21 | + |
| 22 | + if (!queue.TryDequeue(out ulong n)) continue; |
| 23 | + |
| 24 | + var (first, second) = Blink(n); |
| 25 | + |
| 26 | + queue.Enqueue(first); |
| 27 | + differentStones.Add(first); |
| 28 | + |
| 29 | + if (second.HasValue) |
| 30 | + { |
| 31 | + queue.Enqueue(second.Value); |
| 32 | + differentStones.Add(second.Value); |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + return differentStones; |
| 37 | +} |
| 38 | + |
| 39 | +static (ulong, ulong?) Blink(ulong number) |
| 40 | +{ |
| 41 | + if (number == 0) |
| 42 | + { |
| 43 | + return (1, null); |
| 44 | + } |
| 45 | + |
| 46 | + var digits = (int)(Math.Log10(number) + 1); |
| 47 | + if (digits % 2 != 0) |
| 48 | + { |
| 49 | + return (number * 2024, null); |
| 50 | + } |
| 51 | + |
| 52 | + var div = (ulong)Math.Pow(10, digits / 2); |
| 53 | + var left = number / div; |
| 54 | + var right = number - left * div; |
| 55 | + |
| 56 | + return (left, right); |
| 57 | +} |
| 58 | + |
| 59 | +/*var queue = new ConcurrentQueue<Stone>(); |
10 | 60 |
|
11 | 61 | var maxGenerations = 75; |
12 | 62 | var total = 0UL; |
@@ -77,6 +127,6 @@ void Enqueue(Stone stone) |
77 | 127 | } |
78 | 128 |
|
79 | 129 | Console.WriteLine($"Part 1: {total}"); |
80 | | -Console.WriteLine($"Part 2: {""}"); |
| 130 | +Console.WriteLine($"Part 2: {""}");*/ |
81 | 131 |
|
82 | 132 | readonly file record struct Stone(ulong Number, int Generation); |
0 commit comments