Skip to content

Commit 4ce45ed

Browse files
committed
Productize getting different stones
1 parent 746fbed commit 4ce45ed

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

src/2024/11/Program.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,57 @@
66
.SplitToNumbers(" ")
77
.Select(v => new Stone((ulong)v, 0));
88

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>();
1060
1161
var maxGenerations = 75;
1262
var total = 0UL;
@@ -77,6 +127,6 @@ void Enqueue(Stone stone)
77127
}
78128
79129
Console.WriteLine($"Part 1: {total}");
80-
Console.WriteLine($"Part 2: {""}");
130+
Console.WriteLine($"Part 2: {""}");*/
81131

82132
readonly file record struct Stone(ulong Number, int Generation);

0 commit comments

Comments
 (0)