my advent of code solutions
1namespace Solutions;
2
3public static class Util
4{
5 /// <summary>
6 /// Naive least common multiple implementation.
7 /// </summary>
8 /// <param name="a"></param>
9 /// <param name="b"></param>
10 /// <returns></returns>
11 public static long Lcm(long a, long b) => a * b / Gcd(a, b);
12
13 /// <summary>
14 /// Naive greatest common denominator implementation.
15 /// </summary>
16 /// <param name="a"></param>
17 /// <param name="b"></param>
18 /// <returns></returns>
19 public static long Gcd(long a, long b)
20 {
21 while (true)
22 {
23 if (b == 0) return a;
24 var a1 = a;
25 a = b;
26 b = a1 % b;
27 }
28 }
29
30 /// <summary>
31 /// Quickly parse an integer from a ReadOnlySpan by ascii index and radix shifting.
32 /// </summary>
33 /// <param name="span"></param>
34 /// <returns></returns>
35 public static int ParseIntFast(ReadOnlySpan<char> span)
36 {
37 var result = 0;
38 for (var i = 0; i < span.Length; i++)
39 result = result * 10 + span[i] - '0';
40 return result;
41 }
42
43 /// <summary>
44 /// Quickly parse a long from a ReadOnlySpan by ascii index and radix shifting.
45 /// </summary>
46 /// <param name="span"></param>
47 /// <returns></returns>
48 public static long ParseLongFast(ReadOnlySpan<char> span)
49 {
50 var result = 0L;
51 for (var i = 0; i < span.Length; i++)
52 result = result * 10 + span[i] - '0';
53 return result;
54 }
55}