1
0
Fork 0
mirror of https://github.com/luau-lang/luau.git synced 2025-03-05 11:41:40 +00:00
luau/bench/tests/sunspider/fannkuch.lua
Vyacheslav Egorov aafea36235
Fixed the backwards compatible benchmark support library require ()
Previous benchmark require fix wasn't actually working correctly for the
old style require (or running in Lua).
2023-12-04 12:48:31 -08:00

91 lines
2.2 KiB
Lua

--[[
The Great Computer Language Shootout
http://shootout.alioth.debian.org/
contributed by Isaac Gouy
]]
local function prequire(name) local success, result = pcall(require, name); return if success then result else nil end
local bench = script and require(script.Parent.bench_support) or prequire("bench_support") or require("../../bench_support")
function test()
local function fannkuch(n)
local check = 0;
local perm = {};
local perm1 = {};
local count = {};
local maxPerm = {};
local maxFlipsCount = 0;
local m = n - 1;
for i = 1,n do perm1[i] = i - 1; end
local r = n;
while (true) do
-- write-out the first 30 permutations
if (check < 30) then
local s = "";
for i = 1,n do s = s .. tostring(perm1[i]+1); end
check = check + 1;
end
while (r ~= 1) do count[r] = r; r = r - 1; end
if (not (perm1[1] == 0 or perm1[m + 1] == m)) then
for i = 1,n do perm[i] = perm1[i]; end
local flipsCount = 0;
local k;
k = perm[1]
while (not (k == 0)) do
local k2 = math.floor((k + 1) / 2);
for i = 0,k2-1 do
local temp = perm[i + 1];
perm[i + 1] = perm[k - i + 1];
perm[k - i + 1] = temp;
end
flipsCount = flipsCount + 1;
k = perm[1]
end
if (flipsCount > maxFlipsCount) then
maxFlipsCount = flipsCount;
for i = 1,n do maxPerm[i] = perm1[i]; end
end
end
while (true) do
if (r == n) then return maxFlipsCount; end
local perm0 = perm1[1];
local i = 0;
while (i < r) do
local j = i + 1;
perm1[i + 1] = perm1[j + 1];
i = j;
end
perm1[r + 1] = perm0;
count[r + 1] = count[r + 1] - 1;
if (count[r + 1] > 0) then break; end
r = r + 1;
end
end
return 0
end
local n = 8;
local ret = fannkuch(n);
local expected = 22;
if (ret ~= expected) then
assert(false, "ERROR: bad result: expected " .. expected .. " but got " .. ret);
end
end
bench.runCode(test, "fannkuch")