using System.Collections.Generic;
using System.Globalization;
public static void Main()
foreach(var permutation in GetPermutations(new[]{"imagine", "how","is","touch","the","sky"}))
Console.WriteLine(string.Join(" ", permutation));
Console.WriteLine(total);
public static void Dump<T>(IEnumerable<T> items)
Console.WriteLine(string.Join(", ",items));
public static IEnumerable<IReadOnlyList<T>> GetPermutations<T>(IReadOnlyList<T> input)
long subSwaps = (input.Count - 2) * (input.Count - 1) - 1;
int subSwapIndexMax = input.Count - 2;
T[] permutation = input.ToArray();
for (long index = 0; index < input.Count; index++)
MoveToFront(index, permutation);
yield return permutation;
int pos = subSwapIndexMax;
for (int s = 0; s < subSwaps; s++)
Swap(ref permutation[pos], ref permutation[pos + 1]);
if (pos == subSwapIndexMax)
yield return permutation;
Swap(ref permutation[pos], ref permutation[pos + 1]);
public static void Swap<T>(ref T a, ref T b)
public static void MoveToFront<T>(long index, T[] array)
for (long k = index; k > 0; k--)