Last active
August 27, 2019 10:35
-
-
Save jtsagata/933c9d0e537d8653c2a6bed3c6378ec8 to your computer and use it in GitHub Desktop.
Risk Card Set Kata
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <algorithm> | |
#include <cassert> | |
#include <vector> | |
//#include <set> | |
using namespace std; | |
using card_t=char; | |
const card_t Jocker = 'J'; | |
// Check if vector contains element | |
template <typename T> | |
bool contains(const vector<T> &hand, T card) { | |
return find(hand.begin(), hand.end(), card) != hand.end(); | |
} | |
// Get vector cardinality | |
template <typename T> | |
auto getCardinality(vector<T> hand) { | |
// set<T> set(begin(hand), end(hand)); | |
sort(hand.begin(), hand.end()); | |
hand.erase(unique(hand.begin(), hand.end()), hand.end()); | |
return hand.size(); | |
} | |
// Is equal distribution ? | |
bool eqDistr(const vector<card_t> &hand) { | |
assert(hand.size() == 4); | |
// is it X-X-Y-Y or X-Y-Y-Y ? | |
auto cnt = count_if(hand.begin(), hand.end(), [&](char c) { return c == hand[0]; }); | |
return cnt == 2; | |
} | |
auto isValid(const vector<card_t> &hand) { | |
if (hand.size() < 3) return false; | |
if (hand.size() > 4) return true; | |
if (contains(hand, Jocker)) return true; // 3 cards. Did vector contains 'J' ? | |
if ((hand.size() == 4) && (!eqDistr(hand))) return true; | |
auto crd = getCardinality(hand); | |
if (crd >= 3) return true; // different cards | |
if (crd == 1) return true; // all cards the same | |
return false; // X-Y-Y, no jocker case | |
} | |
auto main() -> int { | |
// Invalid: less cards | |
assert(!isValid({})); | |
assert(!isValid({'C', 'C'})); | |
// Valid: different cards | |
assert(isValid({'C', 'S', 'H'})); | |
assert(isValid({'C', 'H', 'J'})); | |
assert(isValid({'C', 'S', 'H', 'J'})); | |
// Valid: same cards | |
assert(isValid({'C', 'C', 'C'})); | |
assert(isValid({'J', 'J', 'J'})); | |
// Use of 'J' | |
assert(isValid({'S', 'S', 'J'})); | |
assert(isValid({'S', 'J', 'S'})); | |
assert(!isValid({'S', 'S', 'C'})); | |
assert(isValid({'S', 'J', 'J'})); | |
assert(isValid({'S', 'H', 'J'})); | |
// Invalid cases | |
assert(!isValid({'S', 'C', 'C'})); | |
// 4 cards | |
assert(isValid({'H', 'H', 'C', 'H'})); | |
assert(isValid({'H', 'H', 'J', 'H'})); | |
assert(isValid({'J', 'H', 'J', 'H'})); | |
assert(!isValid({'H', 'H', 'C', 'C'})); | |
// 5 cards | |
assert(isValid({'H', 'H', 'C', 'H', 'C'})); | |
assert(isValid({'H', 'H', 'C', 'H', 'H'})); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment