#include #include #include #include #include #include #include using namespace std; using dice_type = vector; class Score { public: virtual ~Score() = default; virtual int score(dice_type const &) const = 0; virtual string name() const = 0; }; class Ones : public Score { public: int score(dice_type const & dice) const override { return count(begin(dice), end(dice), 1); } string name() const override { return "1:or"; } }; class Twos : public Score { public: int score(dice_type const & dice) const override { return 2*count(begin(dice), end(dice), 2); } string name() const override { return "2:or"; } }; class Pair : public Score { public: int score(dice_type const & tmp) const override { dice_type dice { tmp }; sort(begin(dice), end(dice), greater{}); auto it = adjacent_find(begin(dice), end(dice)); if ( it == end(dice) ) return 0; return *it * 2; } string name() const override { return "Par"; } }; const array score_types { new Ones{}, new Twos{}, new Pair{} }; void print_results(dice_type const & dice) { for ( int die : dice ) { cout << setw(2) << left << die; } cout << right; for ( auto score_type : score_types ) { cout << setw(6) << score_type->score(dice); } cout << endl; } int main() { cout << "Tärningar " << right; for ( auto score_type: score_types ) { cout << setw(6) << score_type->name(); } cout << '\n'; dice_type dice {1,2,1,3,4}; print_results(dice); dice.assign( {3,3,1,1,1} ); print_results(dice); dice.assign( {5,5,6,6,3} ); print_results(dice); for ( auto p : score_types ) { delete p; } }