fannkuch-redux PHP #8 program
source code
<? /* The Computer Language Benchmarks Game
https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
Naive transliteration from Rex Kerr's Scala program
contributed by Isaac Gouy
*/
function fannkuch($n) {
$perm1 = new SplFixedArray($n);
for ($i = 0; $i < $n; $i++) $perm1[$i] = $i;
$perm = new SplFixedArray($n);
$count = new SplFixedArray($n);
$f = $flips = $nperm = $checksum = $i = $k = $r = 0;
$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) {
$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
$more = true;
while ($more) {
if ($r == $n) {
echo $checksum, "\n";
return $flips;
}
$p0 = $perm1[0];
$i = 0;
while ($i < $r) {
$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;
}
$n = $argc > 1 ? $argv[1] : 7;
printf("Pfannkuchen(%d) = %d\n", $n, fannkuch($n));
?>
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
PHP 8.3.11 (cli)
(built: Sep 5 2024 12:34:23) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.11,
with Zend OPcache v8.3.11,
Copyright (c) Zend Technologies
Tue, 01 Oct 2024 16:40:17 GMT
COMMAND LINE:
/opt/src/php-8.3.11/bin/php -dzend_extension=/opt/src/php-8.3.11/lib/php/extensions/no-debug-non-zts-20230831/opcache.so -dopcache.enable_cli=1 -dopcache.jit_buffer_size=64M -n fannkuchredux.php-8.php 12
PROGRAM OUTPUT:
3968050
Pfannkuchen(12) = 65