===Short Version===
This requires the third solution module of the Combinations Task.
{{trans|Perl6}}
<lang d>void main() {
import std.stdio, std.algorithm, std.range, std.random, std.conv,combinations3;
std.traits, std.string, combinations3;
enum nDraw = 9, nGoal = nDraw / 2;
constauto deck = cartesianProduct( [EnumMembers!Color],"red [EnumMembers!Count]green purple".split, ▼
enum Color {red = octal!1000, green = octal!2000, purple = octal!4000}
enum Count {one = octal!100, two = octal!200, three = octal!400} "one two three".split,
"oval [EnumMembers!Shape],squiggle [EnumMembers!Style])diamond". array;split,▼
enum Shape {oval = octal!10, squiggle = octal!20, diamond = octal!40}
"solid open striped".split).array;
enum Style {solid = octal!1, open = octal!2, striped = octal!4}
const(Card)string[][] draw; ▼
▲ const deck = cartesianProduct([EnumMembers!Color], [EnumMembers!Count],
const(Card)string[][][] sets; ▼
▲ [EnumMembers!Shape], [EnumMembers!Style]).array;
} while (sets.length != nGoal) ; {▼
alias Card = Unqual!(ForeachType!(typeof(deck)));
draw = deck [].randomSample(nDraw ).map!(t => [t[]]).array; ▼
sets = draw.combinations(3).array.filter!((string[][] cs) =>
auto show(in Card[] cards) {
cs.array.transposed.all!(t => t.array.sort().uniq.count % 2)).array;
//writefln("%( %-6s %-5s %-8s %s%)", cards); ▼
foreach (immutable c; cards)
writefln(" %-6s %-5s %-8s %s", c[]);
}
writefln("Dealt %d cards:\n%(%-(%8s %)\n%)\n", draw.length, draw);
const combs = nDraw.iota.array.combinations(3).array;
▲ //writefln(" Containing:\n%( % -6s (%- 5s (% -8s % s)\n%)\n\n%)", cardssets);
do {
▲ draw = deck[].randomSample(nDraw).array;
//const bits = draw.map!(c => [c[]].sum).array;
const bits = draw.map!(c => c[0] + c[1] + c[2] + c[3]).array;
sets = combs
.filter!(ci => "%o".format(bits.indexed(ci).reduce!q{a | b}).countchars("1247") == 4)
.map!(ci => draw.indexed(ci).array).array;
▲ } while (sets.length != nGoal);
writeln("Drew ", nDraw, " cards:");
show(draw);
foreach (immutable i, const cards; sets) {
writefln("\nSet %d:", i + 1);
show(cards);
}
}</lang>
{{out}}
<pre>DrewDealt 9 cards:
purple red twoone oval squiggle solid
purple twored three squiggle solid
purple green two three diamond solid
green purple one one squiggle open
green purple two two squiggle open
red one two oval oval striped ▼
purple three squiggle open ▼
purple green one one diamondsquiggle openstriped
purple red one oval two squiggle striped
redgreen three oval diamond striped
Containing:
Set 1:
redpurple three oval diamond stripedsolid▼
purple one squiggle open ▼
green purple two one squiggle open
red three oval two oval striped ▼
purple three squiggle open
▲ purple red three squiggle open solid
Set 2:
green two squiggle diamond solidopen
purple purple three one squiggle open striped
▲ purple onered three squiggle open solid
Set 3:
green two diamond one squiggle solidopen
purple purple one two squiggle open striped
red two oval striped
Set 4:
purple purple two one squiggle solid striped
green one three diamond openstriped</pre>
</pre>
=={{header|Erlang}}==
|