Playing cards: Difference between revisions

Shorter first D entry (to show more contrast with the second version).
(Updated to work for Go Fish)
(Shorter first D entry (to show more contrast with the second version).)
Line 786:
 
=={{header|D}}==
<lang d>import std.stdio, std.randomtypecons, std.stringalgorithm, std.traits, std.array;,
std.range, std.random;
 
enum Pip {Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten,
struct Card {
enum suits = ["Clubs" Jack, "Hearts"Queen, "Spades"King, "Diamonds"];Ace}
enum Suit {Diamonds, Spades, Hearts, Clubs}
enum pips = ["2", "3", "4", "5", "6", "7", "8", "9", "10",
alias Card = Tuple!(Pip, Suit);
"Jack", "Queen", "King", "Ace"];
string pip, suit;
 
Card[] newDeck() /*pure nothrow*/ {
string toString() {
return cartesianProduct([EnumMembers!Pip], [EnumMembers!Suit])
return pip ~ " of " ~ suit;
} .array;
}
 
alias shuffleDeck = randomShuffle;
class Deck {
Card[] deck;
 
Card dealCard(ref Card[] deck) pure nothrow {
this() {
immutable card = deck.back;
foreach (suit; Card.suits)
deck.popBack;
foreach (pip; Card.pips)
return card;
deck ~= Card(pip, suit);
}
}
 
void show(in Card[] deck) {
void shuffle() {
writefln("Deck:\n%(%s\n%)\n", deck);
deck.randomShuffle();
}
 
Card deal() {
auto card = deck.back;
deck.popBack();
return card;
}
 
override string toString() {
return format("%(%s\n%)", deck);
}
}
 
void main() {
auto deckd = new DecknewDeck; // Make A new deck.
d.show;
deck.shuffle(); // Shuffle the deck.
d.shuffleDeck;
writeln("Card: ", deck.deal()); // Deal from the deck.
while (!d.empty)
writeln(deck); // Print the current contents of the deck.
d.dealCard.writeln;
}</lang>
{{out}}
<pre>CardDeck: 8 of Spades
const(Tuple!(Pip, Suit))(Two, Diamonds)
10 of Clubs
const(Tuple!(Pip, Suit))(Three, Diamonds)
Queen of Hearts
const(Tuple!(Pip, Suit))(Four, Diamonds)
3 of Clubs
const(Tuple!(Pip, Suit))(Five, Diamonds)
Ace of Clubs
const(Tuple!(Pip, Suit))(Six, Diamonds)
7 of Clubs
const(Tuple!(Pip, Suit))(Seven, Diamonds)
2 of Hearts
const(Tuple!(Pip, Suit))(Eight, Diamonds)
6 of Clubs
const(Tuple!(Pip, Suit))(Nine, Diamonds)
Jack of Spades
const(Tuple!(Pip, Suit))(Ten, Diamonds)
King of Clubs
const(Tuple!(Pip, Suit))(Jack, Diamonds)
Ace of Spades
const(Tuple!(Pip, Suit))(Queen, Diamonds)
3 of Hearts
const(Tuple!(Pip, Suit))(King, Diamonds)
7 of Spades
const(Tuple!(Pip, Suit))(Ace, Diamonds)
6 of Hearts
const(Tuple!(Pip, Suit))(Two, Spades)
King of Diamonds
const(Tuple!(Pip, Suit))(Three, Spades)
10 of Diamonds
const(Tuple!(Pip, Suit))(Four, Spades)
8 of Diamonds
const(Tuple!(Pip, Suit))(Five, Spades)
Jack of Diamonds
const(Tuple!(Pip, Suit))(Six, Spades)
Queen of Diamonds
const(Tuple!(Pip, Suit))(Seven, Spades)
King of Hearts
const(Tuple!(Pip, Suit))(Eight, Spades)
4 of Diamonds
const(Tuple!(Pip, Suit))(Nine, Spades)
4 of Clubs
const(Tuple!(Pip, Suit))(Ten, Spades)
Jack of Hearts
const(Tuple!(Pip, Suit))(Jack, Spades)
4 of Hearts
const(Tuple!(Pip, Suit))(Queen, Spades)
7 of Hearts
9const(Tuple!(Pip, ofSuit))(King, Spades)
3const(Tuple!(Pip, ofSuit))(Ace, Spades)
const(Tuple!(Pip, Suit))(Two, Hearts)
King of Spades
const(Tuple!(Pip, Suit))(Three, Hearts)
Jack of Clubs
Aceconst(Tuple!(Pip, ofSuit))(Four, Hearts)
const(Tuple!(Pip, Suit))(Five, Hearts)
6 of Diamonds
5const(Tuple!(Pip, ofSuit))(Six, Hearts)
const(Tuple!(Pip, Suit))(Seven, Hearts)
5 of Diamonds
const(Tuple!(Pip, Suit))(Eight, Hearts)
10 of Spades
const(Tuple!(Pip, Suit))(Nine, Hearts)
6 of Spades
const(Tuple!(Pip, Suit))(Ten, Hearts)
8 of Clubs
const(Tuple!(Pip, Suit))(Jack, Hearts)
2 of Clubs
const(Tuple!(Pip, Suit))(Queen, Hearts)
Queen of Clubs
10const(Tuple!(Pip, ofSuit))(King, Hearts)
const(Tuple!(Pip, Suit))(Ace, Hearts)
Ace of Diamonds
const(Tuple!(Pip, Suit))(Two, Clubs)
2 of Spades
const(Tuple!(Pip, Suit))(Three, Clubs)
2 of Diamonds
const(Tuple!(Pip, Suit))(Four, Clubs)
4 of Spades
const(Tuple!(Pip, Suit))(Five, Clubs)
8 of Hearts
const(Tuple!(Pip, Suit))(Six, Clubs)
7 of Diamonds
const(Tuple!(Pip, Suit))(Seven, Clubs)
3 of Diamonds
const(Tuple!(Pip, Suit))(Eight, Clubs)
9 of Diamonds
const(Tuple!(Pip, Suit))(Nine, Clubs)
9 of Hearts
const(Tuple!(Pip, Suit))(Ten, Clubs)
5 of Clubs
const(Tuple!(Pip, Suit))(Jack, Clubs)
9 of Clubs
const(Tuple!(Pip, Suit))(Queen, Clubs)
Queen of Spades
const(Tuple!(Pip, Suit))(King, Clubs)
5 of Spades</pre>
const(Tuple!(Pip, Suit))(Ace, Clubs)
 
Tuple!(Pip, Suit)(Eight, Diamonds)
Tuple!(Pip, Suit)(Nine, Hearts)
Tuple!(Pip, Suit)(Four, Hearts)
Tuple!(Pip, Suit)(King, Hearts)
Tuple!(Pip, Suit)(Two, Hearts)
Tuple!(Pip, Suit)(King, Clubs)
Tuple!(Pip, Suit)(Two, Spades)
Tuple!(Pip, Suit)(Seven, Clubs)
Tuple!(Pip, Suit)(Ten, Spades)
Tuple!(Pip, Suit)(King, Spades)
Tuple!(Pip, Suit)(Four, Spades)
Tuple!(Pip, Suit)(Ten, Clubs)
Tuple!(Pip, Suit)(Ace, Diamonds)
Tuple!(Pip, Suit)(Six, Clubs)
Tuple!(Pip, Suit)(Six, Spades)
Tuple!(Pip, Suit)(Ten, Hearts)
Tuple!(Pip, Suit)(Seven, Diamonds)
Tuple!(Pip, Suit)(Queen, Clubs)
Tuple!(Pip, Suit)(Seven, Spades)
Tuple!(Pip, Suit)(Queen, Spades)
Tuple!(Pip, Suit)(Ace, Spades)
Tuple!(Pip, Suit)(Five, Spades)
Tuple!(Pip, Suit)(Ace, Hearts)
Tuple!(Pip, Suit)(Nine, Spades)
Tuple!(Pip, Suit)(Jack, Clubs)
Tuple!(Pip, Suit)(Three, Spades)
Tuple!(Pip, Suit)(Jack, Diamonds)
Tuple!(Pip, Suit)(Queen, Diamonds)
Tuple!(Pip, Suit)(Three, Hearts)
Tuple!(Pip, Suit)(Five, Clubs)
Tuple!(Pip, Suit)(Three, Clubs)
Tuple!(Pip, Suit)(Two, Diamonds)
Tuple!(Pip, Suit)(Jack, Hearts)
Tuple!(Pip, Suit)(King, Diamonds)
Tuple!(Pip, Suit)(Eight, Spades)
Tuple!(Pip, Suit)(Eight, Hearts)
Tuple!(Pip, Suit)(Five, Diamonds)
Tuple!(Pip, Suit)(Four, Clubs)
Tuple!(Pip, Suit)(Ten, Diamonds)
Tuple!(Pip, Suit)(Eight, Clubs)
Tuple!(Pip, Suit)(Queen, Hearts)
Tuple!(Pip, Suit)(Four, Diamonds)
Tuple!(Pip, Suit)(Six, Diamonds)
Tuple!(Pip, Suit)(Jack, Spades)
Tuple!(Pip, Suit)(Ace, Clubs)
Tuple!(Pip, Suit)(Nine, Clubs)
Tuple!(Pip, Suit)(Seven, Hearts)
Tuple!(Pip, Suit)(Three, Diamonds)
Tuple!(Pip, Suit)(Nine, Diamonds)
Tuple!(Pip, Suit)(Five, Hearts)
Tuple!(Pip, Suit)(Six, Hearts)
Tuple!(Pip, Suit)(Two, Clubs)</pre>
 
===More Refined Version===
<lang d>import std.stdio, std.random, std.algorithm, std.string, std.range;