Skip to content

Instantly share code, notes, and snippets.

@MrSmith33
Last active January 7, 2021 15:37
Show Gist options
  • Save MrSmith33/ac14e66a83b9d047793adede464ca1ef to your computer and use it in GitHub Desktop.
Save MrSmith33/ac14e66a83b9d047793adede464ca1ef to your computer and use it in GitHub Desktop.
Vox programs
// 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");
}
$alias selectPrintFunc($type T) {
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];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment