Set puzzle: Difference between revisions

695 bytes removed ,  10 years ago
Better second D entry
m (Better section name for second D entry)
(Better second D entry)
Line 662:
===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);
const(Card)[] draw;
const(Card)[][] sets;
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
red one oval striped
 
purple onered three squiggle open solid
Set 3:
green two diamond one squiggle solidopen
purple purple one two squiggle open striped
red three oval striped
 
red two oval striped
Set 4:
purple purple two one squiggle solid striped
green one three diamond openstriped</pre>
red three oval striped
</pre>
 
=={{header|Erlang}}==