import static java.util.stream.IntStream.rangeClosed class Superpermutation { final static int nMax = 12 static char[] superperm static int pos static int[] count = new int[nMax] static int factSum(int n) { return rangeClosed(1, n) .map({ m -> rangeClosed(1, m).reduce(1, { a, b -> a * b }) }).sum() } static boolean r(int n) { if (n == 0) { return false } char c = superperm[pos - n] if (--count[n] == 0) { count[n] = n if (!r(n - 1)) { return false } } superperm[pos++] = c return true } static void superPerm(int n) { String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" pos = n superperm = new char[factSum(n)] for (int i = 0; i < n + 1; i++) { count[i] = i } for (int i = 1; i < n + 1; i++) { superperm[i - 1] = chars.charAt(i) } while (r(n)) { } } static void main(String[] args) { for (int n = 0; n < nMax; n++) { superPerm(n) printf("superPerm(%2d) len = %d", n, superperm.length) println() } } }