Set puzzle: Difference between revisions

Content added Content deleted
m (Better section name for second D entry)
(Better second D entry)
Line 662: Line 662:
===Short Version===
===Short Version===
This requires the third solution module of the Combinations Task.
This requires the third solution module of the Combinations Task.
{{trans|Perl6}}
<lang d>void main() {
<lang d>void main() {
import std.stdio, std.algorithm, std.range, std.random, std.conv,
import std.stdio, std.algorithm, std.range, std.random, combinations3;
std.traits, std.string, combinations3;


enum nDraw = 9, nGoal = nDraw / 2;
enum nDraw = 9, nGoal = nDraw / 2;
auto deck = cartesianProduct("red 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 squiggle diamond".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}


string[][] draw;
const deck = cartesianProduct([EnumMembers!Color], [EnumMembers!Count],
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%(%(%-(%8s %)\n%)\n\n%)", sets);
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>
}</lang>
{{out}}
{{out}}
<pre>Drew 9 cards:
<pre>Dealt 9 cards:
red two squiggle solid
purple one oval solid
purple two squiggle solid
red three squiggle solid
green two diamond solid
purple three diamond solid
purple one squiggle open
green one squiggle open
purple two squiggle open
green two squiggle open
red two oval striped
purple three squiggle open
green one diamond open
purple one squiggle striped
red one oval striped
purple two squiggle striped
red three oval striped
green three diamond striped


Containing:
Set 1:
purple three diamond solid
purple one squiggle open
purple two squiggle open
green one squiggle open
red two oval striped
purple three squiggle open


red three squiggle solid
Set 2:
green two diamond solid
green two squiggle open
purple three squiggle open
purple one squiggle striped
red one oval striped


red three squiggle solid
Set 3:
green two diamond solid
green one squiggle open
purple one squiggle open
purple two squiggle striped
red three oval striped


red two oval striped
Set 4:
purple two squiggle solid
purple one squiggle striped
green one diamond open
green three diamond striped</pre>
red three oval striped
</pre>


=={{header|Erlang}}==
=={{header|Erlang}}==