46 lines
1.2 KiB
Plaintext
Executable File
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));
|
|
}
|
|
} |