mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
70 lines
1.2 KiB
Plaintext
70 lines
1.2 KiB
Plaintext
module fannkuch;
|
|
import std::io;
|
|
import std::math;
|
|
|
|
fn int fannkuchredux(int n)
|
|
{
|
|
int[] perm = mem::alloc_array(int, n);
|
|
int[] perm1 = mem::alloc_array(int, n);
|
|
int* count = mem::alloc_array(int, n);
|
|
int max_flips_count;
|
|
int perm_count;
|
|
int checksum;
|
|
|
|
foreach (int i, &v : perm1) *v = i;
|
|
|
|
int r = n;
|
|
|
|
while (true)
|
|
{
|
|
for (; r != 1; r--) count[r - 1] = r;
|
|
|
|
perm[..] = perm1[..];
|
|
|
|
int flips_count = 0;
|
|
int k;
|
|
|
|
while (!((k = perm[0]) == 0))
|
|
{
|
|
int k2 = (k + 1) >> 1;
|
|
for (int i = 0; i < k2; i++)
|
|
{
|
|
@swap(perm[i], perm[k - i]);
|
|
}
|
|
flips_count++;
|
|
}
|
|
|
|
max_flips_count = max(max_flips_count, flips_count);
|
|
checksum += perm_count % 2 == 0 ? flips_count : -flips_count;
|
|
|
|
/* Use incremental change to generate another permutation */
|
|
while (true)
|
|
{
|
|
if (r == n)
|
|
{
|
|
io::printf("%d\n", checksum);
|
|
return max_flips_count;
|
|
}
|
|
|
|
int perm0 = perm1[0];
|
|
int i = 0;
|
|
while (i < r)
|
|
{
|
|
int j = i + 1;
|
|
perm1[i] = perm1[j];
|
|
i = j;
|
|
}
|
|
perm1[r] = perm0;
|
|
count[r] -= 1;
|
|
if (count[r] > 0) break;
|
|
r++;
|
|
}
|
|
perm_count++;
|
|
}
|
|
}
|
|
|
|
fn void main(String[] argv)
|
|
{
|
|
int n = argv.len > 1 ? argv[1].to_int()!! : 7;
|
|
io::printf("Pfannkuchen(%d) = %d\n", n, fannkuchredux(n));
|
|
} |