Vox programs
January 7, 2021 ยท View on GitHub
// vox fannkuch.vx C:\Windows\System32\kernel32.dll // https://benchmarksgame-team.pages.debian.net/benchmarksgame/description/fannkuchredux.html
void main() { i32 n = 12; Result res = fannkuch(n); println("fannkuch(", n, ") = ", res.sum, " ", res.maxflips); ExitProcess(0); }
struct Result { i32 sum; i32 maxflips; }
Result fannkuch(i32 n) { i32 signx; i32 maxflips; i32 sum; i32 i; i32 j; i32 k; i32 q1; i32 flips; i32 qq; i32 t; i32 sx; i32 tt; i32[100] p; i32[100] q; i32[100] s;
signx = 1;
maxflips = 0;
sum = 0;
for (i=1; i<=n; ++i) {
p[i-1] = i;
q[i-1] = i;
s[i-1] = i;
}
while (true) {
q1 = p[1-1];
if (q1 != 1) {
for (i=2; i<=n; ++i) {
q[i-1] = p[i-1];
}
flips = 1;
while (true) {
qq = q[q1-1];
if (qq == 1) {
sum += signx*flips;
if (flips > maxflips) {
maxflips = flips;
}
break;
}
q[q1-1] = q1;
if (q1 >= 4) {
i = 2;
j = q1-1;
while (true) {
{
i32 temp = q[i-1];
q[i-1] = q[j-1];
q[j-1] = temp;
}
++i;
--j;
if (i >= j) break;
}
}
q1 = qq;
++flips;
}
}
if (signx == 1) {
{
i32 temp = p[2-1];
p[2-1] = p[1-1];
p[1-1] = temp;
}
signx = -1;
}
else {
{
i32 temp = p[2-1];
p[2-1] = p[3-1];
p[3-1] = temp;
}
signx = 1;
for (i=3; i<=n; ++i) {
sx = s[i-1];
if (sx != 1) {
s[i-1] = sx-1;
break;
}
if (i == n) {
return Result(sum, maxflips);
}
s[i-1] = i;
tt = p[1-1];
for (j=1; j<=i; ++j) {
p[j-1] = p[j+1-1];
}
p[i+1-1] = tt;
}
}
}
}
// lib functions void ExitProcess(u32 uExitCode);
u8 WriteConsoleA( void* hConsoleOutput, u8* lpBuffer, u32 nNumberOfCharsToWrite, u32* lpNumberOfCharsWritten, void* lpReserved );
void* GetStdHandle(u32 nStdHandle);
enum : u32 { STD_INPUT_HANDLE = 0xFFFFFFF6, STD_OUTPUT_HANDLE = 0xFFFFFFF5, STD_ERROR_HANDLE = 0xFFFFFFF4 }
void print[Args...](Args... args) { #foreach(i, arg; args) { alias func = selectPrintFunc(Args[i]); func(arg); } }
void println[Args...](Args... args) { #foreach(i, arg; args) { alias func = selectPrintFunc(Args[i]); func(arg); } printString("\n"); }
type T) { if (isSlice(T)) return printString; $compileError("Invalid type"); }
void printString(u8[] str) { void* handle = GetStdHandle(STD_OUTPUT_HANDLE); u32 numWritten; WriteConsoleA( handle, str.ptr, cast(u32)str.length, &numWritten, null); }
void setRangeu8(u8[] slice, u8 value) { for (u64 i = 0; i < slice.length; ++i) { slice[i] = value; } }
void printInt(i64 i) { u8[21] buf; u8[] res = formatInt(i, &buf, 1); print(res); }
u8[] formatInt(i64 i, u8[21]* output, u32 minSize) { u32 numDigits = 0; if (i == 0) { if (minSize == 0) minSize = 1; setRangeu8((*output)[21 - minSize..21], ' '); (*output)[20] = '0'; numDigits = minSize; } else { bool neg = i < 0; if (neg) { i = -i; } bool overflow = i < 0; if (overflow) i = i64.max;
while (i)
{
u8 c = cast(u8)('0' + i % 10);
(*output)[21 - ++numDigits] = c;
i /= 10;
}
while (numDigits < minSize) {
(*output)[21 - ++numDigits] = ' ';
}
if (neg) {
(*output)[21 - ++numDigits] = '-';
}
if (overflow) {
++(*output)[20];
}
}
return (*output)[21 - numDigits..21];
}