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 { |
|||
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 |
foreach (immutable i; 0 .. deck.length) |
||
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 |
return deck[].randomSample(numCards).array(); |
||
} |
} |
||