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}}== |
||
⚫ | |||
{{works with|D|2}} |
|||
⚫ | |||
// From http://rosettacode.org/wiki/Permutations#D |
|||
T[][] permutations(T)(T[] items) { |
|||
auto seq = array(iota(n)); |
|||
T[][] result; |
|||
void perms( |
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 |
perms(s[0 .. i] ~ s[i+1 .. $], prefix ~ c); |
||
else |
|||
result ~= prefix; |
|||
} |
} |
||
perms( |
perms(items); |
||
return |
return result; |
||
} |
} |
||
T[] solve(T, F...)(T[] items, F predicates) { |
|||
foreach (perm; permutations(items)) { |
|||
⚫ | |||
outer: |
|||
if (!pred(perm)) |
|||
⚫ | |||
break; |
|||
⚫ | |||
if (!fn(cast(int[])p)) |
|||
⚫ | |||
continue outer; |
|||
return []; |
|||
⚫ | |||
⚫ | |||
} |
} |
||
void main() { |
void main() { |
||
⚫ | |||
enum Floors = 5u; |
|||
⚫ | |||
⚫ | |||
auto c2= (P[] s){ return s[P.Cooper] != 0; }; |
|||
auto c3= (P[] s){ return s[P.Fletcher] && s[P.Fletcher] != s.length-1; }; |
|||
auto c4= (P[] s){ return s[P.Miller] > s[P.Cooper]; }; |
|||
auto c5= (P[] s){ return abs(s[P.Smith] - s[P.Fletcher]) != 1; }; |
|||
auto c6= (P[] s){ return abs(s[P.Cooper] - s[P.Fletcher]) != 1; }; |
|||
⚫ | |||
// c1, c2, ... can't be an array |
|||
auto solution = solve([EnumMembers!P], c1, c2, c3, c4, c5, c6); |
|||
if (solution.length) |
|||
writeln(solution); |
|||
}</lang> |
}</lang> |
||
Output: |
|||
<pre>[ |
<pre>[Baker, Cooper, Fletcher, Miller, Smith]</pre> |
||
=={{header|Haskell}}== |
=={{header|Haskell}}== |