Dinesman's multiple-dwelling problem: Difference between revisions

Content added Content deleted
m ({{omit from|GUISS}})
(Improved D version)
Line 98: Line 98:


=={{header|D}}==
=={{header|D}}==
<lang d>import std.stdio, std.range, std.math, std.traits;
{{works with|D|2}}
<lang d>import std.stdio, std.range, std.math;


// From http://rosettacode.org/wiki/Permutations#D
auto permutations(size_t n) {
T[][] permutations(T)(T[] items) {
auto seq = array(iota(n));
size_t[][] res;
T[][] result;

void perms(size_t[] s, size_t[] pre = []) {
void perms(T[] s, T[] prefix=[]) {
if (s.length) {
if (s.length)
foreach (i, c; s) {
foreach (i, c; s)
perms(s[0 .. i] ~ s[i + 1 .. $], pre ~ c);
perms(s[0 .. i] ~ s[i+1 .. $], prefix ~ c);
}
else
} else res ~= pre;
result ~= prefix;
}
}

perms(seq);
perms(items);
return res;
return result;
}
}


size_t[] solve(T...)(size_t len, T fun) {
T[] solve(T, F...)(T[] items, F predicates) {
auto perms = permutations(len);
foreach (perm; permutations(items)) {
foreach (pred; predicates)
outer:
if (!pred(perm))
foreach (p; perms) {
foreach (fn; fun)
break;
return perm;
if (!fn(cast(int[])p))
}
continue outer;
return p;
return [];
}
return null;
}
}


void main() {
void main() {
enum P { Baker, Cooper, Fletcher, Miller, Smith }
enum Floors = 5u;

enum {Baker, Cooper, Fletcher, Miller, Smith};
auto c1= (P[] s){ return s[P.Baker] != s.length-1; };
auto c1 = (int[] s){ return s[Baker] != s.length-1; };
auto c2= (P[] s){ return s[P.Cooper] != 0; };
auto c2 = (int[] s){ return s[Cooper] != 0; };
auto c3= (P[] s){ return s[P.Fletcher] && s[P.Fletcher] != s.length-1; };
auto c3 = (int[] s){ return s[Fletcher] != 0 && s[Fletcher] != s.length-1; };
auto c4= (P[] s){ return s[P.Miller] > s[P.Cooper]; };
auto c4 = (int[] s){ return s[Miller] > s[Cooper]; };
auto c5= (P[] s){ return abs(s[P.Smith] - s[P.Fletcher]) != 1; };
auto c5 = (int[] s){ return abs(s[Smith] - s[Fletcher]) != 1; };
auto c6= (P[] s){ return abs(s[P.Cooper] - s[P.Fletcher]) != 1; };

auto c6 = (int[] s){ return abs(s[Cooper] - s[Fletcher]) != 1; };
// c1, c2, ... can't be an array
if (auto sol = solve(Floors, c1, c2, c3, c4, c5, c6))
auto solution = solve([EnumMembers!P], c1, c2, c3, c4, c5, c6);
if (solution.length)
writeln(sol);
writeln(solution);
}</lang>
}</lang>
Output:
<pre>[2, 1, 3, 4, 0]</pre>
<pre>[Baker, Cooper, Fletcher, Miller, Smith]</pre>


=={{header|Haskell}}==
=={{header|Haskell}}==