Set puzzle: Difference between revisions

2,435 bytes added ,  9 years ago
+ second D entry
(+ second D entry)
Line 534:
 
=={{header|D}}==
===Basic Version===
<lang d>import std.stdio, std.random, std.array, std.conv, std.traits,
std.exception, std.range;
Line 658 ⟶ 659:
immutable(Card)(purple, two, squiggle, solid)
immutable(Card)(purple, three, oval, open)</pre>
 
===Simpler 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,
std.traits, std.string, combinations3;
 
enum nDraw = 9, nGoal = nDraw / 2;
enum Color {red = octal!1000, green = octal!2000, purple = octal!4000}
enum Count {one = octal!100, two = octal!200, three = octal!400}
enum Shape {oval = octal!10, squiggle = octal!20, diamond = octal!40}
enum Style {solid = octal!1, open = octal!2, striped = octal!4}
 
const deck = cartesianProduct([EnumMembers!Color], [EnumMembers!Count],
[EnumMembers!Shape], [EnumMembers!Style]).array;
alias Card = Unqual!(ForeachType!(typeof(deck)));
 
auto show(in Card[] cards) {
//writefln("%( %-6s %-5s %-8s %s%)", cards);
foreach (immutable c; cards)
writefln(" %-6s %-5s %-8s %s", c[]);
}
 
const combs = nDraw.iota.array.combinations(3).array;
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>Drew 9 cards:
red two squiggle solid
purple two squiggle solid
green two diamond solid
purple one squiggle open
purple two squiggle open
purple three squiggle open
green one diamond open
red one oval striped
red three oval striped
 
Set 1:
purple one squiggle open
purple two squiggle open
purple three squiggle open
 
Set 2:
green two diamond solid
purple three squiggle open
red one oval striped
 
Set 3:
green two diamond solid
purple one squiggle open
red three oval striped
 
Set 4:
purple two squiggle solid
green one diamond open
red three oval striped
</pre>
 
=={{header|Erlang}}==