RosettaCodeData/Task/Man-or-boy-test/D/man-or-boy-test-5.d
2014-04-02 16:56:35 +00:00

57 lines
1.6 KiB
D

import std.bigint, std.functional;
// Adapted from C code by Goran Weinholt, adapted from Knuth code.
BigInt A(in int k, in int x1, in int x2, in int x3,
in int x4, in int x5) {
static struct Inner {
static BigInt c1_(in int k) {
if (k > 5)
return c1(k - 1) + c2(k - 1);
static immutable t = [0, 0, 0, 1, 2, 3];
return t[k].BigInt;
}
alias c1 = memoize!c1_;
static BigInt c2_(in int k) {
if (k > 5)
return c2(k - 1) + c3(k - 1);
static immutable t = [0, 0, 1, 1, 1, 2];
return t[k].BigInt;
}
alias c2 = memoize!c2_;
static BigInt c3_(in int k) {
if (k > 5)
return c3(k - 1) + c4(k);
static immutable t = [0, 1, 1, 0, 0, 1];
return t[k].BigInt;
}
alias c3 = memoize!c3_;
static BigInt c4_(in int k) {
if (k > 5)
return c1(k - 1) + c4(k - 1) - 1;
static immutable t = [1, 1, 0, 0, 0, 0];
return t[k].BigInt;
}
alias c4 = memoize!c4_;
static int c5(in int k) pure nothrow {
return !!k;
}
}
with (Inner)
return c1(k) * x1 + c2(k) * x2 + c3(k) * x3 +
c4(k) * x4 + c5(k) * x5;
}
void main() {
import std.stdio, std.conv, std.range;
foreach (immutable i; 0 .. 40)
writeln(i, " ", A(i, 1, -1, -1, 1, 0));
writefln("...\n500 %-(%s\\\n %)",
A(500, 1, -1, -1, 1, 0).text.chunks(60));
}