Anonymous user
Set puzzle: Difference between revisions
D entry: removed assumeUnique, added immutable and const, used foreach, shorter lines, and other small changes
m (dealing from a shuffled deck is random enough) |
(D entry: removed assumeUnique, added immutable and const, used foreach, shorter lines, and other small changes) |
||
Line 69:
=={{header|D}}==
<lang d>import std.stdio, std.
const class SetDealer {▼
void main() {▼
auto dealer = new SetPuzzleDealer();▼
auto cards = dealer.deal();▼
writefln("\nDEALT %d CARDS:\n", cards.length);▼
foreach (Unqual!(typeof(cards[0])) c; cards)▼
writeln(c);▼
auto sets = dealer.findSets(cards);▼
auto len = sets.length;▼
writefln("\nFOUND %d %s:\n", len, len == 1 ? "SET" : "SETS");▼
foreach (set; sets) {▼
foreach (Unqual!(typeof(set[0])) c; set)▼
writeln(c);▼
writeln();▼
}▼
}▼
▲class SetDealer {
protected {
enum Color : ubyte {green, purple, red}
enum Number : ubyte {one, two, three}
enum Symbol : ubyte {oval, diamond, squiggle}
enum Fill : ubyte {open, striped, solid}
static struct Card {
Line 104 ⟶ 86:
}
immutable Card[81] deck;
}
this() pure nothrow {
foreach (immutable i
}▼
}
// case because we're printing to stout. Normally you would want
▲ // randomSample produces a sorted output that's convenient in our case
//
immutable(Card)[] deal(in uint numCards) const {
enforce(numCards < deck.length, "number of cards too large");
return
}
// The summed enums of valid sets are always zero or a multiple
bool validSet(in ref Card c1, in ref Card c2, in ref Card c3)
(c1.
}
immutable(Card)[3][] findSets(in Card[] cards, in uint target = 0)
if (len
▲ for (int i = 0; i < len - 2; i++) {
▲ for (int j = i + 1; j < len - 1; j++)
foreach (immutable j; i + 1 .. len -
foreach (immutable k; j + 1 ..
sets ~= [cards[i], cards[j],
▲ return null;
}
}
const final class SetPuzzleDealer : SetDealer {
enum {basic = 9, advanced = 12}
override immutable(Card)[] deal(in uint numCards = basic) const {
typeof(return) cards;
do {
cards = super.deal(numCards);
} while (findSets(cards, numSets).length != numSets);
return
▲ }
▲}
▲void main() {
▲ writeln(cast()c);
▲ foreach (set; sets) {
▲ writeln(cast()c);
}
}</lang>
{{out|Sample output}}
<pre>DEALT 9 CARDS:
Card(green,
Card(green,
Card(green,
Card(
Card(
▲Card(green, three, diamond, solid)
Card(green, three, squiggle, striped)▼
Card(purple, two, squiggle, solid)▼
Card(red, one, squiggle, open)
FOUND 4 SETS:
Card(green, two, diamond, open)
Card(green,
Card(
Card(
Card(green,
Card(
Card(
Card(
Card(
Card(
▲Card(purple, two, squiggle, solid)
▲Card(red, one, squiggle, open)</pre>
=={{header|J}}==
|