You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
TrustPilotChallenge/dotnet/WhiteRabbit/PrecomputedPermutationsGene...

62 lines
1.9 KiB

namespace WhiteRabbit
{
using System.Collections.Generic;
using System.Linq;
internal static class PrecomputedPermutationsGenerator
{
private static long[][] Permutations { get; } = Enumerable.Range(0, 9).Select(GeneratePermutations).ToArray();
private static long[] PermutationsNumbers { get; } = GeneratePermutationsNumbers().Take(19).ToArray();
public static long[] HamiltonianPermutations(int n) => Permutations[n];
public static long GetPermutationsNumber(int n) => PermutationsNumbers[n];
private static long[] GeneratePermutations(int n)
{
var result = PermutationsGenerator.HamiltonianPermutations(n)
.Select(FormatPermutation)
.ToArray();
return PadToWholeChunks(result, Constants.PhrasesPerSet);
}
private static T[] PadToWholeChunks<T>(T[] original, int chunkSize)
{
if (original.Length % chunkSize == 0)
{
return original;
}
return original.Concat(Enumerable.Repeat(original[0], chunkSize - (original.Length % chunkSize))).ToArray();
}
private static long FormatPermutation(PermutationsGenerator.Permutation permutation)
{
System.Diagnostics.Debug.Assert(permutation.PermutationData.Length <= 16);
long result = 0;
for (var i = 0; i < permutation.PermutationData.Length; i++)
{
result |= (long)(permutation.PermutationData[i]) << (4 * i);
}
return result;
}
private static IEnumerable<long> GeneratePermutationsNumbers()
{
long result = 1;
yield return result;
var i = 1;
while (true)
{
result *= i;
yield return result;
i++;
}
}
}
}