#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
/* generate 52 card poker deck and shuffle it */
#define SUITS 4
#define RANKS 13
#define TOTAL (SUITS * RANKS)
typedef unsigned char card_t;
const char *const suit[] = {
"♠", "♥", "♦", "♣"
};
const char *const rank[] = {
"A", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "J", "Q", "K"
};
int main(void)
{
card_t
*deck
= malloc(sizeof(card_t
) * TOTAL
); unsigned i, j, k = 0;
for (i = 0; i < SUITS; i++) /* generate */
for (j = 0; j < RANKS; j++)
deck[k++] = (i << (CHAR_BIT / 2)) | j;
for (i = 0; i < TOTAL; i++) /* shuffle */
{
retry
: k
= rand() % TOTAL
; card_t sel = deck[k];
for (j = 0; j < i; j++)
if (sel == deck[j])
goto retry;
deck[k] = deck[i];
deck[i] = sel;
}
for (i = 0; i < TOTAL; i++) /* display */
{
unsigned s = deck[i] >> (CHAR_BIT / 2);
unsigned r = deck[i] & 0xF;
printf("%s%s ", rank
[r
], suit
[s
]); if (!((i + 1) % 4))
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8dGltZS5oPgoKLyogZ2VuZXJhdGUgNTIgY2FyZCBwb2tlciBkZWNrIGFuZCBzaHVmZmxlIGl0ICovCgojZGVmaW5lIFNVSVRTIDQKI2RlZmluZSBSQU5LUyAxMwojZGVmaW5lIFRPVEFMIChTVUlUUyAqIFJBTktTKQoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGNhcmRfdDsKY29uc3QgY2hhciAqY29uc3Qgc3VpdFtdID0gewoJIuKZoCIsICLimaUiLCAi4pmmIiwgIuKZoyIKfTsKY29uc3QgY2hhciAqY29uc3QgcmFua1tdID0gewoJIkEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwKCSI3IiwgIjgiLCAiOSIsICIxMCIsICJKIiwgIlEiLCAiSyIKfTsKCmludCBtYWluKHZvaWQpCnsKCXNyYW5kKHRpbWUoTlVMTCkpOwoJY2FyZF90ICpkZWNrID0gbWFsbG9jKHNpemVvZihjYXJkX3QpICogVE9UQUwpOwoJdW5zaWduZWQgaSwgaiwgayA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgU1VJVFM7IGkrKykgLyogZ2VuZXJhdGUgKi8KCQlmb3IgKGogPSAwOyBqIDwgUkFOS1M7IGorKykKCQkJZGVja1trKytdID0gKGkgPDwgKENIQVJfQklUIC8gMikpIHwgajsKCWZvciAoaSA9IDA7IGkgPCBUT1RBTDsgaSsrKSAvKiBzaHVmZmxlICovCgl7CgkJcmV0cnk6IGsgPSByYW5kKCkgJSBUT1RBTDsKCQljYXJkX3Qgc2VsID0gZGVja1trXTsKCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQoJCQlpZiAoc2VsID09IGRlY2tbal0pCgkJCQlnb3RvIHJldHJ5OwoJCWRlY2tba10gPSBkZWNrW2ldOwoJCWRlY2tbaV0gPSBzZWw7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgVE9UQUw7IGkrKykgLyogZGlzcGxheSAqLwoJewoJCXVuc2lnbmVkIHMgPSBkZWNrW2ldID4+IChDSEFSX0JJVCAvIDIpOwoJCXVuc2lnbmVkIHIgPSBkZWNrW2ldICYgMHhGOwoJCXByaW50ZigiJXMlcyAiLCByYW5rW3JdLCBzdWl0W3NdKTsKCQlpZiAoISgoaSArIDEpICUgNCkpCgkJCXB1dGNoYXIoJ1xuJyk7Cgl9CglmcmVlKGRlY2spOwoJcmV0dXJuIDA7Cn0=