Just another update

This commit is contained in:
Ingy döt Net 2015-02-20 00:35:01 -05:00
parent a25938f123
commit 00a190b0a6
6591 changed files with 94363 additions and 23227 deletions

View file

@ -1,4 +1,4 @@
T[][] powerSet(T)(in T[] s) pure nothrow {
T[][] powerSet(T)(in T[] s) pure nothrow @safe {
auto r = new typeof(return)(1, 0);
foreach (e; s) {
typeof(return) rs;
@ -11,5 +11,6 @@ T[][] powerSet(T)(in T[] s) pure nothrow {
void main() {
import std.stdio;
[1, 2, 3].powerSet.writeln;
}

View file

@ -1,23 +1,32 @@
auto powerSet(T)(T[] xs) pure nothrow {
auto output = new T[xs.length];
immutable size_t len = 1U << xs.length;
struct Result {
auto powerSet(T)(T[] xs) pure nothrow @safe {
static struct Result {
T[] xsLocal, output;
size_t len;
size_t bits;
@property empty() const pure nothrow { return bits == len; }
void popFront() pure nothrow { bits++; }
@property save() pure nothrow { return this; }
T[] front() nothrow {
this(T[] xs_) pure nothrow @safe {
this.xsLocal = xs_;
this.output.length = xs_.length;
this.len = 1U << xs_.length;
}
@property empty() const pure nothrow @safe {
return bits == len;
}
void popFront() pure nothrow @safe { bits++; }
@property save() pure nothrow @safe { return this; }
T[] front() pure nothrow @safe {
size_t pos = 0;
foreach (immutable size_t i; 0 .. xs.length)
foreach (immutable size_t i; 0 .. xsLocal.length)
if (bits & (1 << i))
output[pos++] = xs[i];
output[pos++] = xsLocal[i];
return output[0 .. pos];
}
}
return Result();
return Result(xs);
}
version (power_set2_main) {