2025-06-16 18:28:08 +05:00

46 lines
1.2 KiB
Plaintext
Executable File

// https://github.com/sCrypt-Inc/boilerplate/blob/master/contracts/ackermann.scrypt
contract Ackermann {
int a; // a = 2
int b; // b = 1
static const int LOOPCOUNT = 14;
function ackermann(int m, int n) : int {
bytes stk = num2bin(m, 1);
// run this function off chain to get the loop count and set it here
// e.g., (2, 1) requires 14 loops, (3, 5) 42438
loop (LOOPCOUNT) {
if (len(stk) > 0) {
bytes top = stk[0 : 1];
m = unpack(top);
// pop
stk = stk[1 : len(stk)];
if (m == 0) {
n = n + m + 1;
}
else if (n == 0) {
n++;
m--;
// push
stk = num2bin(m, 1) + stk;
}
else {
stk = num2bin(m - 1, 1) + stk;
stk = num2bin(m, 1) + stk;
n--;
}
}
}
return n;
}
// y = 5
public function unlock(int y) {
require(y == this.ackermann(this.a, this.b));
}
}