Anonymous user
Non-continuous subsequences: Difference between revisions
→{{header|D}}
Line 15:
=={{header|D}}==
A short version adapted from the Python code:
<d>
Line 93 ⟶ 44:
[1,4,5],[1,4],[1,5],[2,3,5],[2,4,5],[2,4],[2,5],[3,5]]
</pre>
A fast lazy version, it doesn't copy the generated sub-arrays, so if you want to keep them you have to copy (dup) them:
<d>
import std.conv: toInt;
import std.stdio: writefln;
struct Ncsub(T) {
T[] seq;
int opApply(int delegate(ref int[]) dg) {
int result, n = seq.length;
auto S = new int[n];
OUTER:
for (int i = 1; i < (1 << seq.length); i++) {
int len_S;
bool nc = false;
for (int j; j < seq.length + 1; j++) {
int k = i >> j;
if (k == 0) {
if (nc) {
T[] auxS = S[0 .. len_S];
result = dg(auxS);
if (result)
break OUTER;
}
break;
} else if (k % 2)
S[len_S++] = seq[j];
else if (len_S)
nc = true;
}
}
return result;
}
}
void main(string[] args) {
int n = args.length == 2 ? toInt(args[1]) : 10;
auto range = new int[n - 1];
foreach (i, ref el; range)
el = i + 1;
int count;
foreach (sub; Ncsub!(int)(range))
count++;
writefln(count);
}
</d>
=={{header|Haskell}}==
|