Set puzzle: Difference between revisions

Content added Content deleted
(→‎{{header|Perl 6}}: for is prettier than map, add works with)
(solution for immutable issue and optional shuffle)
Line 72: Line 72:
std.exception;
std.exception;


class SetDealer {
const class SetDealer {
protected {
protected {
enum Color : ubyte {green, purple, red}
enum Color : ubyte {green, purple, red}
Line 86: Line 86:
}
}


Card[81] deck;
immutable Card[81] deck;
}
}


this() pure nothrow {
this() pure nothrow {
Card[] tmpdeck;
immutable colors = [EnumMembers!Color];
immutable colors = [EnumMembers!Color];
immutable numbers = [EnumMembers!Number];
immutable numbers = [EnumMembers!Number];
Line 95: Line 97:
immutable fill = [EnumMembers!Fill];
immutable fill = [EnumMembers!Fill];


foreach (immutable i, ref di; deck)
foreach (immutable i; 0 .. deck.length)
di = Card(colors[i / 27],
tmpdeck ~= Card(colors[i / 27],
numbers[(i / 9) % 3],
numbers[(i / 9) % 3],
symbols[(i / 3) % 3],
symbols[(i / 3) % 3],
fill[i % 3]);
fill[i % 3]);
// randomShuffle(tmpdeck); /* not pure nothrow */
deck = assumeUnique(tmpdeck);
}
}


Line 107: Line 113:
immutable(Card)[] deal(in uint numCards) const {
immutable(Card)[] deal(in uint numCards) const {
enforce(numCards < deck.length, "number of cards too large");
enforce(numCards < deck.length, "number of cards too large");
return assumeUnique(deck[].randomSample(numCards).array());
return deck[].randomSample(numCards).array();
}
}