fannkuch-redux F# .NET program
source code
(* The Computer Language Benchmarks Game
https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
from Scala version by Otto Bommer, August 2010
*)
let fannkuch n =
begin
let perm1 = Array.create n 0 in for i = 0 to (n-1) do perm1.[i] <- i done;
let perm = Array.create n 0
let count = Array.create n 0
let mutable flips = 0
let mutable maxflips = 0
let mutable checksum = 0
let mutable nperm = 0
let mutable r = n
while r > 0 do
for i = 0 to n-1 do perm.[i] <- perm1.[i] done;
while r <> 1 do count.[r-1] <- r; r <- r - 1; done;
flips <- 0;
let k = ref perm.[0] in
while !k <> 0 do
let t = ref 0 in
for i = 0 to !k / 2 do
t := perm.[i];
perm.[i] <- perm.[!k - i];
perm.[!k - i] <- !t;
done;
k := perm.[0];
flips <- flips + 1;
done;
maxflips <- max maxflips flips;
if nperm &&& 1 = 0 then checksum <- checksum + flips else checksum <- checksum - flips
let mutable go = true in
let mutable t = 0 in
while go do
if r = n then begin go <- false; r <- 0; end
else
begin
t <- perm1.[0];
for i = 0 to r - 1 do perm1.[i] <- perm1.[i+1] done;
perm1.[r] <- t;
count.[r] <- count.[r] - 1;
if count.[r] > 0 then go <- false
else r <- r + 1;
end
done;
nperm <- nperm + 1;
done;
(maxflips, checksum);
end
let _ =
let n = try int((System.Environment.GetCommandLineArgs()).[1]) with _ -> 7
let (maxflips, checksum) = fannkuch n
Printf.printf "%d\nPfannkuchen(%d) = %d\n" checksum n maxflips
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
.NET SDK 8.0.301
Host Version: 8.0.6
Commit: 3b8b000a0e
<ServerGarbageCollection>true
F# 8.0
<OutputType>Exe
<TargetFramework>net8.0
<ImplicitUsings>enable
<Nullable>enable
<AllowUnsafeBlocks>true
<ServerGarbageCollection>true
<ConcurrentGarbageCollection>true
<PublishAot>false
Tue, 04 Jun 2024 04:39:01 GMT
MAKE:
cp fannkuchredux.fsharpcore Program.fs
cp Include/fsharpcore/program.fsproj .
mkdir obj
cp Include/fsharpcore/project.assets.json ./obj
~/dotnet/dotnet build -c Release --use-current-runtime
Determining projects to restore...
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/program.fsproj : warning NU1900: Error occurred while getting package vulnerability data: Unable to load the service index for source https://api.nuget.org/v3/index.json.
Restored /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/program.fsproj (in 6.24 sec).
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/program.fsproj : warning NU1900: Error occurred while getting package vulnerability data: Unable to load the service index for source https://api.nuget.org/v3/index.json.
program -> /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/bin/Release/net8.0/linux-x64/program.dll
Build succeeded.
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/program.fsproj : warning NU1900: Error occurred while getting package vulnerability data: Unable to load the service index for source https://api.nuget.org/v3/index.json.
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fannkuchredux/tmp/program.fsproj : warning NU1900: Error occurred while getting package vulnerability data: Unable to load the service index for source https://api.nuget.org/v3/index.json.
2 Warning(s)
0 Error(s)
Time Elapsed 00:00:14.63
17.04s to complete and log all make actions
COMMAND LINE:
./bin/Release/net8.0/linux-x64/program 12
PROGRAM OUTPUT:
3968050
Pfannkuchen(12) = 65