#include <iostream>
#include <vector>
#include <ctime>
#include <bitset>
#include <limits>
#include <unordered_set>
using namespace std;
const int number_of_suits = 4;
const int number_of_rand_cards = 30;
const int number_of_ranks = 13;
//types of card
typedef enum suit_t {
spade = 0,
club,
diamond,
heart
}suit_t;
//value each card holds
typedef enum rank_t {
ace = 0,
two,
three,
four,
five,
six,
seven,
eight,
nine,
ten,
jack,
king,
queen
}rank_t;
typedef struct poker_card {
suit_t suit;
rank_t rank;
poker_card(suit_t suit_, rank_t rank_) : suit(suit_), rank(rank_) {}
}poker_card;
class Poker {
vector<poker_card> cards;
private:
void inc_count(const bitset<number_of_ranks> &bs,
int count[number_of_suits],
suit_t suit,
int index) {
if (bs.test(index)) {
count[suit]++;
}
else {
count[suit] = 0;
}
}
bool detect_street(const bitset<number_of_ranks> &spade_bs,
const bitset<number_of_ranks> &club_bs,
const bitset<number_of_ranks> &diamond_bs,
const bitset<number_of_ranks> &heart_bs) {
int count[number_of_suits] = { 0 };
int index = 0; // index starts at 0, bc. the rank 'ace' is assigned to value 0
// iterate number_of_ranks+1 times to cover case: ten, jack, king, queen, ace
for (int i = 0; i <= number_of_ranks; i++) {
inc_count(spade_bs, count, spade, index);
inc_count(club_bs, count, club, index);
inc_count(diamond_bs, count, diamond, index);
inc_count(heart_bs, count, heart, index);
if (count[spade] == 5 ||
count[club] == 5 ||
count[diamond] == 5 ||
count[heart] == 5) {
return true;
}
index++;
index = index % number_of_ranks;
}
return false;
}
public:
void add_card(const poker_card &c) {
cards.push_back(c);
}
bool detect_straight_flush() {
// if cards size is less than 5, we cannot have a flush
if (cards.size() < 5) {
return false;
}
// used space are 16 bytes -> O(1)
bitset<number_of_ranks> spade_bs;
bitset<number_of_ranks> club_bs;
bitset<number_of_ranks> diamond_bs;
bitset<number_of_ranks> heart_bs;
// O(n)
for (int i = 0; i < cards.size(); i++) {
switch (cards[i].suit) {
case spade:
spade_bs.set(cards[i].rank);
break;
case club:
club_bs.set(cards[i].rank);
break;
case diamond:
diamond_bs.set(cards[i].rank);
break;
case heart:
heart_bs.set(cards[i].rank);
break;
default:
break;
}
}
// check if one bitsize field is at least 5 cards, otherwize return false
if (spade_bs.size() < 5 &&
club_bs.size() < 5 &&
diamond_bs.size() < 5 &&
heart_bs.size() < 5) {
return false;
}
// O(1)
return detect_street(spade_bs, club_bs, diamond_bs, heart_bs);
}
};
int main() {
// your code goes here
Poker p1;
Poker p2;
Poker p3;
p1.add_card(poker_card(heart, ten));
p1.add_card(poker_card(heart, king));
p1.add_card(poker_card(heart, ace));
p1.add_card(poker_card(heart, queen));
p1.add_card(poker_card(heart, jack));
p2.add_card(poker_card(heart, two));
p2.add_card(poker_card(heart, three));
p2.add_card(poker_card(heart, ace));
p2.add_card(poker_card(heart, four));
p2.add_card(poker_card(heart, five));
p3.add_card(poker_card(heart, two));
p3.add_card(poker_card(heart, three));
p3.add_card(poker_card(heart, seven));
p3.add_card(poker_card(heart, four));
p3.add_card(poker_card(heart, five));
cout << p1.detect_straight_flush() << endl;
cout << p2.detect_straight_flush() << endl;
cout << p3.detect_straight_flush() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG51bWJlcl9vZl9zdWl0cyA9IDQ7CmNvbnN0IGludCBudW1iZXJfb2ZfcmFuZF9jYXJkcyA9IDMwOwpjb25zdCBpbnQgbnVtYmVyX29mX3JhbmtzID0gMTM7CgovL3R5cGVzIG9mIGNhcmQKdHlwZWRlZiBlbnVtIHN1aXRfdCB7CglzcGFkZSA9IDAsCgljbHViLAoJZGlhbW9uZCwKCWhlYXJ0Cn1zdWl0X3Q7CgovL3ZhbHVlIGVhY2ggY2FyZCBob2xkcyAKdHlwZWRlZiBlbnVtIHJhbmtfdCB7CglhY2UgPSAwLAoJdHdvLAoJdGhyZWUsCglmb3VyLAoJZml2ZSwKCXNpeCwKCXNldmVuLAoJZWlnaHQsCgluaW5lLAoJdGVuLAoJamFjaywKCWtpbmcsCglxdWVlbgp9cmFua190OwoKCnR5cGVkZWYgc3RydWN0IHBva2VyX2NhcmQgewoJc3VpdF90IHN1aXQ7CglyYW5rX3QgcmFuazsKCXBva2VyX2NhcmQoc3VpdF90IHN1aXRfLCByYW5rX3QgcmFua18pIDogc3VpdChzdWl0XyksIHJhbmsocmFua18pIHt9Cn1wb2tlcl9jYXJkOwoKY2xhc3MgUG9rZXIgewoJdmVjdG9yPHBva2VyX2NhcmQ+IGNhcmRzOwoKcHJpdmF0ZToKCXZvaWQgaW5jX2NvdW50KGNvbnN0IGJpdHNldDxudW1iZXJfb2ZfcmFua3M+ICZicywgCgkgICAgICAgICAgICAgICBpbnQgY291bnRbbnVtYmVyX29mX3N1aXRzXSwgCgkgICAgICAgICAgICAgICBzdWl0X3Qgc3VpdCwgCgkgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKCQlpZiAoYnMudGVzdChpbmRleCkpIHsKCQkJY291bnRbc3VpdF0rKzsKCQl9CgkJZWxzZSB7CgkJCWNvdW50W3N1aXRdID0gMDsKCQl9Cgl9CgoJYm9vbCBkZXRlY3Rfc3RyZWV0KGNvbnN0IGJpdHNldDxudW1iZXJfb2ZfcmFua3M+ICZzcGFkZV9icywgCgkgICAgICAgICAgICAgICAgICAgY29uc3QgYml0c2V0PG51bWJlcl9vZl9yYW5rcz4gJmNsdWJfYnMsCgkJICAgICAgICAgICAgICAgY29uc3QgYml0c2V0PG51bWJlcl9vZl9yYW5rcz4gJmRpYW1vbmRfYnMsIAoJCSAgICAgICAgICAgICAgIGNvbnN0IGJpdHNldDxudW1iZXJfb2ZfcmFua3M+ICZoZWFydF9icykgewoJCWludCBjb3VudFtudW1iZXJfb2Zfc3VpdHNdID0geyAwIH07CgkJaW50IGluZGV4ID0gMDsgLy8gaW5kZXggc3RhcnRzIGF0IDAsIGJjLiB0aGUgcmFuayAnYWNlJyBpcyBhc3NpZ25lZCB0byB2YWx1ZSAwCgkJCgkJLy8gaXRlcmF0ZSBudW1iZXJfb2ZfcmFua3MrMSB0aW1lcyB0byBjb3ZlciBjYXNlOiB0ZW4sIGphY2ssIGtpbmcsIHF1ZWVuLCBhY2UKCQlmb3IgKGludCBpID0gMDsgaSA8PSBudW1iZXJfb2ZfcmFua3M7IGkrKykgewoJCQlpbmNfY291bnQoc3BhZGVfYnMsIGNvdW50LCBzcGFkZSwgaW5kZXgpOwoJCQlpbmNfY291bnQoY2x1Yl9icywgY291bnQsIGNsdWIsIGluZGV4KTsKCQkJaW5jX2NvdW50KGRpYW1vbmRfYnMsIGNvdW50LCBkaWFtb25kLCBpbmRleCk7CgkJCWluY19jb3VudChoZWFydF9icywgY291bnQsIGhlYXJ0LCBpbmRleCk7CgoJCQlpZiAoY291bnRbc3BhZGVdID09IDUgfHwKCQkJCWNvdW50W2NsdWJdID09IDUgfHwKCQkJCWNvdW50W2RpYW1vbmRdID09IDUgfHwKCQkJCWNvdW50W2hlYXJ0XSA9PSA1KSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJaW5kZXgrKzsKCQkJaW5kZXggPSBpbmRleCAlIG51bWJlcl9vZl9yYW5rczsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCnB1YmxpYzoKCXZvaWQgYWRkX2NhcmQoY29uc3QgcG9rZXJfY2FyZCAmYykgewoJCWNhcmRzLnB1c2hfYmFjayhjKTsKCX0KCglib29sIGRldGVjdF9zdHJhaWdodF9mbHVzaCgpIHsKCQkvLyBpZiBjYXJkcyBzaXplIGlzIGxlc3MgdGhhbiA1LCB3ZSBjYW5ub3QgaGF2ZSBhIGZsdXNoCgkJaWYgKGNhcmRzLnNpemUoKSA8IDUpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gdXNlZCBzcGFjZSBhcmUgMTYgYnl0ZXMgLT4gTygxKQoJCWJpdHNldDxudW1iZXJfb2ZfcmFua3M+IHNwYWRlX2JzOwoJCWJpdHNldDxudW1iZXJfb2ZfcmFua3M+IGNsdWJfYnM7CgkJYml0c2V0PG51bWJlcl9vZl9yYW5rcz4gZGlhbW9uZF9iczsKCQliaXRzZXQ8bnVtYmVyX29mX3JhbmtzPiBoZWFydF9iczsKCQkKCQkvLyBPKG4pCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXJkcy5zaXplKCk7IGkrKykgewoJCQlzd2l0Y2ggKGNhcmRzW2ldLnN1aXQpIHsKCQkJY2FzZSBzcGFkZTogCgkJCQlzcGFkZV9icy5zZXQoY2FyZHNbaV0ucmFuayk7CgkJCQlicmVhazsKCgkJCWNhc2UgY2x1YjogCgkJCQljbHViX2JzLnNldChjYXJkc1tpXS5yYW5rKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBkaWFtb25kOiAKCQkJCWRpYW1vbmRfYnMuc2V0KGNhcmRzW2ldLnJhbmspOwoJCQkJYnJlYWs7CgoJCQljYXNlIGhlYXJ0OiAKCQkJCWhlYXJ0X2JzLnNldChjYXJkc1tpXS5yYW5rKTsKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvLyBjaGVjayBpZiBvbmUgYml0c2l6ZSBmaWVsZCBpcyBhdCBsZWFzdCA1IGNhcmRzLCBvdGhlcndpemUgcmV0dXJuIGZhbHNlCgkJaWYgKHNwYWRlX2JzLnNpemUoKSA8IDUgJiYKCQkJY2x1Yl9icy5zaXplKCkgPCA1ICYmCgkJCWRpYW1vbmRfYnMuc2l6ZSgpIDwgNSAmJgoJCQloZWFydF9icy5zaXplKCkgPCA1KSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gTygxKQoJCXJldHVybiBkZXRlY3Rfc3RyZWV0KHNwYWRlX2JzLCBjbHViX2JzLCBkaWFtb25kX2JzLCBoZWFydF9icyk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKICAgIAoJUG9rZXIgcDE7CglQb2tlciBwMjsKCVBva2VyIHAzOwoKCXAxLmFkZF9jYXJkKHBva2VyX2NhcmQoaGVhcnQsIHRlbikpOwoJcDEuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwga2luZykpOwoJcDEuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgYWNlKSk7CglwMS5hZGRfY2FyZChwb2tlcl9jYXJkKGhlYXJ0LCBxdWVlbikpOwoJcDEuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgamFjaykpOwoKCXAyLmFkZF9jYXJkKHBva2VyX2NhcmQoaGVhcnQsIHR3bykpOwoJcDIuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgdGhyZWUpKTsKCXAyLmFkZF9jYXJkKHBva2VyX2NhcmQoaGVhcnQsIGFjZSkpOwoJcDIuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgZm91cikpOwoJcDIuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgZml2ZSkpOwoKCXAzLmFkZF9jYXJkKHBva2VyX2NhcmQoaGVhcnQsIHR3bykpOwoJcDMuYWRkX2NhcmQocG9rZXJfY2FyZChoZWFydCwgdGhyZWUpKTsKCXAzLmFkZF9jYXJkKHBva2VyX2NhcmQoaGVhcnQsIHNldmVuKSk7CglwMy5hZGRfY2FyZChwb2tlcl9jYXJkKGhlYXJ0LCBmb3VyKSk7CglwMy5hZGRfY2FyZChwb2tlcl9jYXJkKGhlYXJ0LCBmaXZlKSk7CgoJY291dCA8PCBwMS5kZXRlY3Rfc3RyYWlnaHRfZmx1c2goKSA8PCBlbmRsOwoJY291dCA8PCBwMi5kZXRlY3Rfc3RyYWlnaHRfZmx1c2goKSA8PCBlbmRsOwoJY291dCA8PCBwMy5kZXRlY3Rfc3RyYWlnaHRfZmx1c2goKSA8PCBlbmRsOwoKCXJldHVybiAwOwp9