diff --git a/tests/guessnumber.d b/tests/guessnumber.d new file mode 100644 index 0000000..45b470a --- /dev/null +++ b/tests/guessnumber.d @@ -0,0 +1,31 @@ +import std.stdio, std.random, std.typecons, std.conv, std.string, + std.range; + +void main() { + immutable interval = tuple(1, 100); + writefln("Guess my target number that is between " ~ + "%d and %d (inclusive).\n", interval[]); + immutable target = uniform!"[]"(interval[]); + + foreach (immutable i; sequence!q{n}) { + writef("Your guess #%d: ", i + 1); + immutable txt = stdin.readln.strip; + + Nullable!int answer; + try { + answer = txt.to!int; + } catch (ConvException e) { + writefln(" I don't understand your input '%s'", txt); + continue; + } + if (answer < interval[0] || answer > interval[1]) { + writeln(" Out of range!"); + continue; + } + if (answer == target) { + writeln(" Well guessed."); + break; + } + writeln(answer < target ? " Too low." : " Too high."); + } +} diff --git a/tests/guessnumber.d.ref b/tests/guessnumber.d.ref new file mode 100644 index 0000000..9ff51c1 --- /dev/null +++ b/tests/guessnumber.d.ref @@ -0,0 +1,36 @@ +import std.stdio, std.random, std.typecons, std.conv, std.string, std.range; + +void main() +{ + immutable interval = tuple(1, 100); + writefln("Guess my target number that is between " + ~ "%d and %d (inclusive).\n", + interval[]); + immutable target = uniform!"[]"(interval[]); + foreach (immutable i; sequence!q{n}) + { + writef("Your guess #%d: ", i + 1); + immutable txt = stdin.readln.strip; + Nullable!int answer; + try + { + answer = txt.to!int; + } + catch(ConvException e) + { + writefln(" I don't understand your input '%s'", txt); + continue; + } + if (answer < interval[0] || answer > interval[1]) + { + writeln(" Out of range!"); + continue; + } + if (answer == target) + { + writeln(" Well guessed."); + break; + } + writeln(answer < target ? " Too low.":" Too high."); + } +} diff --git a/tests/heronian.d b/tests/heronian.d new file mode 100644 index 0000000..ffe6334 --- /dev/null +++ b/tests/heronian.d @@ -0,0 +1,45 @@ +import std.stdio, std.math, std.range, std.algorithm, std.numeric, std.traits, std.typecons; + +double hero(in uint a, in uint b, in uint c) pure nothrow @safe @nogc { + immutable s = (a + b + c) / 2.0; + immutable a2 = s * (s - a) * (s - b) * (s - c); + return (a2 > 0) ? a2.sqrt : 0.0; +} + +bool isHeronian(in uint a, in uint b, in uint c) pure nothrow @safe @nogc { + immutable h = hero(a, b, c); + return h > 0 && h.floor == h.ceil; +} + +T gcd3(T)(in T x, in T y, in T z) pure nothrow @safe @nogc { + return gcd(gcd(x, y), z); +} + +void main() /*@safe*/ { + enum uint maxSide = 200; + + // Sort by increasing area, perimeter, then sides. + //auto h = cartesianProduct!3(iota(1, maxSide + 1)) + auto r = iota(1, maxSide + 1); + const h = cartesianProduct(r, r, r) + //.filter!({a, b, c} => ... + .filter!(t => t[0] <= t[1] && t[1] <= t[2] && + t[0] + t[1] > t[2] && + t[].gcd3 == 1 && t[].isHeronian) + .array + .schwartzSort!(t => tuple(t[].hero, t[].only.sum, t.reverse)) + .release; + + static void showTriangles(R)(R ts) @safe { + "Area Perimeter Sides".writeln; + foreach (immutable t; ts) + writefln("%3s %8d %3dx%dx%d", t[].hero, t[].only.sum, t[]); + } + + writefln("Primitive Heronian triangles with sides up to %d: %d", maxSide, h.length); + "\nFirst ten when ordered by increasing area, then perimeter,then maximum sides:".writeln; + showTriangles(h.take(10)); + + "\nAll with area 210 subject to the previous ordering:".writeln; + showTriangles(h.filter!(t => t[].hero == 210)); +} diff --git a/tests/heronian.d.ref b/tests/heronian.d.ref new file mode 100644 index 0000000..f7334ff --- /dev/null +++ b/tests/heronian.d.ref @@ -0,0 +1,48 @@ +import std.stdio, std.math, std.range, std.algorithm, std.numeric, std.traits, + std.typecons; + +double hero(in uint a, in uint b, in uint c) pure nothrow @safe@nogc +{ + immutable s = (a + b + c) / 2.0; + immutable a2 = s * (s - a) * (s - b) * (s - c); + return (a2 > 0) ? a2.sqrt : 0.0; +} + +bool isHeronian(in uint a, in uint b, in uint c) pure nothrow @safe @nogc +{ + immutable h = hero(a, b, c); + return h > 0 && h.floor == h.ceil; +} + +T gcd3(T)(in T x, in T y, in T z) pure nothrow @safe @nogc +{ + return gcd(gcd(x, y), z); +} + +void main() /*@safe*/ +{ + enum uint maxSide = 200; + // Sort by increasing area, perimeter, then sides. + //auto h = cartesianProduct!3(iota(1, maxSide + 1)) + auto r = iota(1, maxSide + 1); + const h = cartesianProduct(r, r, r) + //.filter!({a, b, c} => ... + .filter!(t => t[0] <= t[1] && t[1] <= t[2] && t[0] + t[1] > t[2] && + t[].gcd3 == 1 && t[].isHeronian) + .array.schwartzSort!(t => tuple(t[].hero, t[].only.sum, t.reverse)) + .release; + + static void showTriangles(R)(R ts) @safe + { + "Area Perimeter Sides".writeln; + foreach (immutable t; ts) + writefln("%3s %8d %3dx%dx%d", t[].hero, t[].only.sum, t[]); + } + + writefln("Primitive Heronian triangles with sides up to %d: %d", maxSide, + h.length); + "\nFirst ten when ordered by increasing area, then perimeter,then maximum sides:".writeln; + showTriangles(h.take(10)); + "\nAll with area 210 subject to the previous ordering:".writeln; + showTriangles(h.filter!(t => t[].hero == 210)); +} diff --git a/tests/higherorder.d b/tests/higherorder.d new file mode 100644 index 0000000..56d2c35 --- /dev/null +++ b/tests/higherorder.d @@ -0,0 +1,9 @@ +int hof(int a, int b, int delegate(int, int) f) { + return f(a, b); +} + +void main() { + import std.stdio; + writeln("Add: ", hof(2, 3, (a, b) => a + b)); + writeln("Multiply: ", hof(2, 3, (a, b) => a * b)); +} diff --git a/tests/higherorder.d.ref b/tests/higherorder.d.ref new file mode 100644 index 0000000..be9b953 --- /dev/null +++ b/tests/higherorder.d.ref @@ -0,0 +1,12 @@ +int hof(int a, int b, int delegate(int, int) f) +{ + return f(a, b); +} + +void main() +{ + import std.stdio; + + writeln("Add: ", hof(2, 3, (a, b) => a + b)); + writeln("Multiply: ", hof(2, 3, (a, b) => a * b)); +}