Another update from ingydotnet^djgoku
This commit is contained in:
parent
91df62d461
commit
948b86eafa
7604 changed files with 108452 additions and 22726 deletions
|
|
@ -1,16 +1,27 @@
|
|||
T[][] powerSet(T)(in T[] s) pure nothrow @safe {
|
||||
auto r = new typeof(return)(1, 0);
|
||||
foreach (e; s) {
|
||||
typeof(return) rs;
|
||||
foreach (x; r)
|
||||
rs ~= x ~ [e];
|
||||
r ~= rs;
|
||||
}
|
||||
return r;
|
||||
import std.algorithm;
|
||||
import std.range;
|
||||
|
||||
auto powerSet(R)(R r)
|
||||
{
|
||||
return
|
||||
(1L<<r.length)
|
||||
.iota
|
||||
.map!(i =>
|
||||
r.enumerate
|
||||
.filter!(t => (1<<t[0]) & i)
|
||||
.map!(t => t[1])
|
||||
);
|
||||
}
|
||||
|
||||
void main() {
|
||||
import std.stdio;
|
||||
|
||||
[1, 2, 3].powerSet.writeln;
|
||||
unittest
|
||||
{
|
||||
int[] emptyArr;
|
||||
assert(emptyArr.powerSet.equal!equal([emptyArr]));
|
||||
assert(emptyArr.powerSet.powerSet.equal!(equal!equal)([[], [emptyArr]]));
|
||||
}
|
||||
|
||||
void main(string[] args)
|
||||
{
|
||||
import std.stdio;
|
||||
args[1..$].powerSet.each!writeln;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,42 @@
|
|||
auto powerSet(T)(T[] xs) pure nothrow @safe {
|
||||
static struct Result {
|
||||
T[] xsLocal, output;
|
||||
size_t len;
|
||||
size_t bits;
|
||||
import std.range;
|
||||
|
||||
this(T[] xs_) pure nothrow @safe {
|
||||
this.xsLocal = xs_;
|
||||
this.output.length = xs_.length;
|
||||
this.len = 1U << xs_.length;
|
||||
}
|
||||
struct PowerSet(R)
|
||||
if (isRandomAccessRange!R)
|
||||
{
|
||||
R r;
|
||||
size_t position;
|
||||
|
||||
@property empty() const pure nothrow @safe {
|
||||
return bits == len;
|
||||
}
|
||||
struct PowerSetItem
|
||||
{
|
||||
R r;
|
||||
size_t position;
|
||||
|
||||
void popFront() pure nothrow @safe { bits++; }
|
||||
@property save() pure nothrow @safe { return this; }
|
||||
private void advance()
|
||||
{
|
||||
while (!(position & 1))
|
||||
{
|
||||
r.popFront();
|
||||
position >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
T[] front() pure nothrow @safe {
|
||||
size_t pos = 0;
|
||||
foreach (immutable size_t i; 0 .. xsLocal.length)
|
||||
if (bits & (1 << i))
|
||||
output[pos++] = xsLocal[i];
|
||||
return output[0 .. pos];
|
||||
}
|
||||
}
|
||||
@property bool empty() { return position == 0; }
|
||||
@property auto front()
|
||||
{
|
||||
advance();
|
||||
return r.front;
|
||||
}
|
||||
void popFront()
|
||||
{
|
||||
advance();
|
||||
r.popFront();
|
||||
position >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return Result(xs);
|
||||
@property bool empty() { return position == (1 << r.length); }
|
||||
@property PowerSetItem front() { return PowerSetItem(r.save, position); }
|
||||
void popFront() { position++; }
|
||||
}
|
||||
|
||||
version (power_set2_main) {
|
||||
void main() {
|
||||
import std.stdio;
|
||||
[1, 2, 3].powerSet.writeln;
|
||||
}
|
||||
}
|
||||
auto powerSet(R)(R r) { return PowerSet!R(r); }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue