Skip to content

Instantly share code, notes, and snippets.

@Leanny

Leanny/stonks.cs Secret

Created April 19, 2020 13:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Leanny/dfde4f885631c51318c7f145e45a7e83 to your computer and use it in GitHub Desktop.
Save Leanny/dfde4f885631c51318c7f145e45a7e83 to your computer and use it in GitHub Desktop.
Turnip Bruteforcer GPU
using Alea;
using Alea.Parallel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stonks
{
class Program
{
[GpuManaged]
public static float FromFloatSafe(uint fb)
{
int sign = (int)((fb >> 31) & 1);
int exponent = (int)((fb >> 23) & 0xFF);
int mantissa = (int)(fb & 0x7FFFFF);
float fMantissa;
float fSign = sign == 0 ? 1.0f : -1.0f;
if (exponent != 0)
{
exponent -= 127;
fMantissa = 1.0f + (mantissa / (float)0x800000);
}
else
{
if (mantissa != 0)
{
// denormal
exponent -= 126;
fMantissa = 1.0f / (float)0x800000;
}
else
{
// +0 and -0 cases
fMantissa = 0;
}
}
float fExponent = (float)DeviceFunction.Pow(2.0, exponent);
float ret = fSign * fMantissa * fExponent;
return ret;
}
[GpuManaged]
static void Main(string[] args)
{
var gpu = Gpu.Get(0);
const int oldBasePrice = 102;
const int whatPattern = 0;
const int currentPattern = 3;
int[] knownVals = new int[] { 102, 0, 79, 75, 71, 68, 64, 129, 138, 145, 164, 151, 71, 66 }; // sunday am, pm, monday am, pm, etc
long[] res = { 0, 0 };
for (int advances = 0; res[1] == 0; advances++)
{
Console.WriteLine(advances);
{
gpu.LongFor(0, (long)uint.MaxValue + 1, seed =>
{
if (res[1] == 0)
{
for (int q = 0; q < 1; q++)
{
bool breakNext = false;
uint val;
float fval, randfloat;
uint id0, id1, id2, id3;
uint v1, v2, v3, randint;
id0 = 0x6C078965 * ((uint)seed ^ ((uint)seed >> 30)) + 1;
id1 = 0x6C078965 * ((uint)id0 ^ ((uint)id0 >> 30)) + 2;
id2 = 0x6C078965 * ((uint)id1 ^ ((uint)id1 >> 30)) + 3;
id3 = 0x6C078965 * ((uint)id2 ^ ((uint)id2 >> 30)) + 4;
for (int i = 0; i < advances; i++)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
}
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
int basePrice = (int)((((ulong)randint * (ulong)(110 - 90 + 1)) >> 32) + 90);
if (basePrice != oldBasePrice) break;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
int chance = (int)((((ulong)randint * (ulong)(99 - 0 + 1)) >> 32) + 0);
int nextPattern = 0;
if (whatPattern == 0)
{
if (chance < 20)
{
nextPattern = 0;
}
else if (chance < 50)
{
nextPattern = 1;
}
else if (chance < 65)
{
nextPattern = 2;
}
else
{
nextPattern = 3;
}
}
else if (whatPattern == 1) {
if (chance < 50)
{
nextPattern = 0;
}
else if (chance < 55)
{
nextPattern = 1;
}
else if (chance < 75)
{
nextPattern = 2;
}
else
{
nextPattern = 3;
}
} else if (whatPattern == 2) {
if (chance < 25)
{
nextPattern = 0;
}
else if (chance < 70)
{
nextPattern = 1;
}
else if (chance < 75)
{
nextPattern = 2;
}
else
{
nextPattern = 3;
}
} else if (whatPattern == 3) {
if (chance < 45)
{
nextPattern = 0;
}
else if (chance < 70)
{
nextPattern = 1;
}
else if (chance < 85)
{
nextPattern = 2;
}
else
{
nextPattern = 3;
}
}
if (nextPattern != currentPattern)
{
break;
}
int work;
int decPhaseLen1, decPhaseLen2, peakStart;
int hiPhaseLen1, hiPhaseLen2and3, hiPhaseLen3;
float rate;
switch (currentPattern)
{
case 0:
// PATTERN 0: high, decreasing, high, decreasing, high
work = 2;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
decPhaseLen1 = (randint & 0x80000000) > 0 ? 3 : 2;
decPhaseLen2 = 5 - decPhaseLen1;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
hiPhaseLen1 = (int)((((ulong)randint * (ulong)(6 - 0 + 1)) >> 32) + 0);
hiPhaseLen2and3 = 7 - hiPhaseLen1;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
hiPhaseLen3 = (int)((((ulong)randint * (ulong)(hiPhaseLen2and3 - 1 - 0 + 1)) >> 32) + 0);
// high phase 1
for (int i = 0; i < hiPhaseLen1; i++)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
}
if (breakNext) break;
// decreasing phase 1
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.8f + ((fval - 1.0f) * (0.6f - 0.8f));
rate = randfloat;
for (int i = 0; i < decPhaseLen1; i++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
rate -= 0.04f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.06f - 0));
rate -= randfloat;
}
if (breakNext) break;
// high phase 2
for (int i = 0; i < (hiPhaseLen2and3 - hiPhaseLen3); i++)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
}
if (breakNext) break;
// decreasing phase 2
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.8f + ((fval - 1.0f) * (0.6f - 0.8f));
rate = randfloat;
for (int i = 0; i < decPhaseLen2; i++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
rate -= 0.04f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0f + ((fval - 1.0f) * (0.06f - 0f));
rate -= randfloat;
}
if (breakNext) break;
// high phase 3
for (int i = 0; i < hiPhaseLen3; i++)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
}
break;
case 1:
// PATTERN 1: decreasing middle, high spike, random low
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
peakStart = (int)((((ulong)randint * (ulong)(9 - 3 + 1)) >> 32) + 3);
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (0.85f - 0.9f));
rate = randfloat;
for (work = 2; work < peakStart; work++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work]) { breakNext = true; break; }
rate -= 0.03f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.02f - 0));
rate -= randfloat;
}
if (breakNext) break;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 1.4f + ((fval - 1.0f) * (2.0f - 1.4f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 2.0f + ((fval - 1.0f) * (6.0f - 2.0f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 1.4f + ((fval - 1.0f) * (2.0f - 1.4f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
for (; work < 14; work++)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.4f + ((fval - 1.0f) * (0.9f - 0.4f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work]) { breakNext = true; break; }
}
break;
case 2:
// PATTERN 2: consistently decreasing
rate = 0.9f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.05f - 0));
rate -= randfloat;
for (work = 2; work < 14; work++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work]) { breakNext = true; break; }
rate -= 0.03f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.02f - 0));
rate -= randfloat;
}
break;
case 3:
// PATTERN 3: decreasing, spike, decreasing
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
peakStart = (int)((((ulong)randint * (ulong)(9 - 2 + 1)) >> 32) + 2);
// decreasing phase before the peak
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (0.4f - 0.9f));
rate = randfloat;
for (work = 2; work < peakStart; work++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work]) { breakNext = true; break; }
rate -= 0.03f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.02f - 0));
rate -= randfloat;
}
if (breakNext) break;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * (float)basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (1.4f - 0.9f));
if ((int)(randfloat * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 1.4f + ((fval - 1.0f) * (2.0f - 1.4f));
rate = randfloat;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 1.4f + ((fval - 1.0f) * (rate) * basePrice - 1.4f);
if ((int)(0.99f + randfloat - 1) != knownVals[work++]) { breakNext = true; break; }
if ((int)(rate * basePrice + 0.99f) != knownVals[work++]) { breakNext = true; break; }
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 1.4f + ((fval - 1.0f) * (rate) * basePrice - 1.4f);
if ((int)(0.99f + randfloat - 1) != knownVals[work++]) { breakNext = true; break; }
// decreasing phase after the peak
if (work < 14)
{
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0.9f + ((fval - 1.0f) * (0.4f - 0.9f));
rate = randfloat;
for (; work < 14; work++)
{
if ((int)(rate * basePrice + 0.99f) != knownVals[work]) { breakNext = true; break; }
rate -= 0.03f;
v1 = id0 ^ (id0 << 11);
id0 = id1;
v2 = id3;
v3 = v1 ^ (v1 >> 8) ^ v2 ^ (v2 >> 19);
id1 = id2;
id2 = v2;
id3 = v3;
randint = v3;
val = 0x3F800000 | (randint >> 9);
fval = FromFloatSafe(val);
randfloat = 0 + ((fval - 1.0f) * (0.02f - 0));
rate -= randfloat;
}
if (breakNext) break;
}
break;
}
if (!breakNext)
{
res[0] = seed;
res[1] = 1;
}
}
}
}
); gpu.Synchronize();
if (res[1] == 1)
{
Console.WriteLine(res[0]);
Console.WriteLine(advances);
return;
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment