function fannkuch(n) { var perm1 = [n] for (let i = 0; i < n; i++) perm1[i] = i var perm = [n] var count = [n] var f = 0, flips = 0, nperm = 0, checksum = 0 var i, k, r r = n while (r > 0) { i = 0 while (r != 1) { count[r-1] = r; r -= 1 } while (i < n) { perm[i] = perm1[i]; i += 1 } // Count flips and update max and checksum f = 0 k = perm[0] while (k != 0) { i = 0 while (2*i < k) { let t = perm[i]; perm[i] = perm[k-i]; perm[k-i] = t i += 1 } k = perm[0] f += 1 } if (f > flips) flips = f if ((nperm & 0x1) == 0) checksum += f; else checksum -= f // Use incremental change to generate another permutation var more = true while (more) { if (r == n) { log.console( checksum ) return flips } let p0 = perm1[0] i = 0 while (i < r) { let j = i + 1 perm1[i] = perm1[j] i = j } perm1[r] = p0 count[r] -= 1 if (count[r] > 0) more = false; else r += 1 } nperm += 1 } return flips; } var n = arg[0] || 10 log.console(`Pfannkuchen(${n}) = ${fannkuch(n)}`) $_.stop()