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"); }

aliasselectPrintFunc(alias selectPrintFunc(type T) { if (isInteger(T))returnprintInt;if(isInteger(T)) return printInt; 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];

}