Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module test;
- import std.algorithm;
- import std.stdio;
- import std.traits;
- import std.range;
- struct Permutations(R) {
- ElementType!R[] _input, _perm;
- size_t k, n;
- this(R r) {
- _input = array(r);
- _perm = array(r);
- n = _perm.length;
- k = n;
- }
- this(R r, size_t elems) {
- _input = array(r);
- _perm = array(r);
- n = min(elems, _perm.length);
- k = n;
- }
- ElementType!R[] front() { return _perm;}
- bool empty() { return (n == 1 && k == 0 )|| (n>1 && k <=1);}
- @property Permutations save() { return this;}
- void popFront() {
- k = n;
- if (k==0) { n=1;} // permutation of an empty range or of zero elements
- else {
- C3: _perm = _perm[1..k] ~ _perm[0] ~ _perm[k..$];
- if (_perm[k-1] == _input[k-1]) {
- k--;
- if (k > 1) goto C3;
- }
- }
- }
- }
- /// ditto
- Permutations!R permutations(R)(R r) if (isDynamicArray!R) {
- return Permutations!R(r);
- }
- /// ditto
- Permutations!R permutations(R)(R r, size_t n) if (isDynamicArray!R) {
- return Permutations!R(r, n);
- }
- /// ditto
- Permutations!(ElementType!R[]) permutations(R)(R r) if (!isDynamicArray!R && isForwardRange!R && !isInfinite!R) {
- return Permutations!(ElementType!R[])(array(r));
- }
- /// ditto
- Permutations!(ElementType!R[]) permutations(R)(R r, size_t n) if (!isDynamicArray!R && isForwardRange!R && !isInfinite!R) {
- return Permutations!(ElementType!R[])(array(r), n);
- }
- void main()
- {
- string[] words = ["foo", "bar", "doo"];
- auto p1 = permutations(words);
- writeln(p1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement