namespace AOC.Common; public static class Extensions { public static string ToDelimitedString(this IEnumerable enumerable, string delimiter = "") => string.Join(delimiter, enumerable); public static IEnumerable Repeat(this IEnumerable sequence, int? count = null) { while (count == null || count-- > 0) foreach (var item in sequence) yield return item; } /// /// Increased accuracy for stopwatch based on frequency. /// /// /// public static double ScaleMilliseconds(this Stopwatch stopwatch) => 1_000 * stopwatch.ElapsedTicks / (double)Stopwatch.Frequency; /// /// Given an array, it returns a rotated copy. /// /// The two dimensional jagged array to rotate. public static T[][] Rotate(this T[][] array) { var result = new T[array[0].Length][]; for (var i = 0; i < result.Length; i++) result[i] = new T[array.Length]; for (var i = 0; i < array.Length; i++) for (var j = 0; j < array[i].Length; j++) result[i][j] = array[array.Length - j - 1][i]; return result; } /// /// Given a jagged array, it returns a diagonally flipped copy. /// /// The two dimensional jagged array to flip. public static T[][] FlipHorizontally(this IEnumerable array) => array.Select(x => x.Reverse().ToArray()).ToArray(); /// /// Does a include a given int? /// /// /// /// public static bool Contains(this Range range, int i) => i >= range.Start.Value && i <= range.End.Value; /// /// Does contain the entire range of ? /// /// /// /// public static bool Contains(this Range r1, Range r2) => r1.Start.Value <= r2.Start.Value && r1.End.Value >= r2.End.Value; /// /// Do and overlap? /// /// /// /// public static bool Overlaps(this Range r1, Range r2) => r1.Start.Value <= r2.End.Value && r1.End.Value >= r2.Start.Value && r2.Start.Value <= r1.End.Value && r2.End.Value >= r1.Start.Value; /// /// Creates a new BigInteger from a binary (Base2) string /// /// public static BigInteger BigIntegerFromBinaryString(this string binaryValue) { BigInteger res = 0; if (binaryValue.Count(b => b == '1') + binaryValue.Count(b => b == '0') != binaryValue.Length) return res; foreach (var c in binaryValue) { res <<= 1; res += c == '1' ? 1 : 0; } return res; } public static IEnumerable> Permute(this IEnumerable list) { var array = list as T[] ?? list.ToArray(); return array.Length == 1 ? new[] { array } : array.SelectMany(t => Permute(array.Where(x => !x!.Equals(t))), (v, p) => p.Prepend(v)); } public static int Pow(this int i, int power) { var pow = (uint)power; var ret = 1; while (pow != 0) { if ((pow & 1) == 1) ret *= i; i *= i; pow >>= 1; } return ret; } public static IEnumerable> Indexed(this IEnumerable source) => source.Select((t, i) => new KeyValuePair(i, t)); public static IEnumerable> WhereValue( this IEnumerable> source, Func func) => source.Where(pair => func(pair.Value)); public static int HammingDistance(this string s1, string other) { if (s1.Length != other.Length) throw new("Strings must be equal length."); return s1.Zip(other).Count(s => s.First != s.Second); } }