35 lines
911 B
D
35 lines
911 B
D
import std.stdio, std.array, std.range, std.concurrency;
|
|
|
|
Generator!(T[]) ncsub(T)(in T[] seq) {
|
|
return new typeof(return)({
|
|
immutable n = seq.length;
|
|
auto S = new T[n];
|
|
|
|
foreach (immutable i; 1 .. 1 << n) {
|
|
uint lenS = 0;
|
|
bool nc = false;
|
|
foreach (immutable j; 0 .. n + 1) {
|
|
immutable k = i >> j;
|
|
if (k == 0) {
|
|
if (nc)
|
|
yield(S[0 .. lenS]);
|
|
break;
|
|
} else if (k % 2) {
|
|
S[lenS] = seq[j];
|
|
lenS++;
|
|
} else if (lenS)
|
|
nc = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
void main() {
|
|
assert(24.iota.array.ncsub.walkLength == 16_776_915);
|
|
|
|
[1, 2, 3].ncsub.writeln;
|
|
[1, 2, 3, 4].ncsub.writeln;
|
|
foreach (const nc; [1, 2, 3, 4, 5].ncsub)
|
|
nc.writeln;
|
|
}
|