#include #include #include #include #include #include #include class Hand { static constexpr int HAND{ 5 }; int bet_; int score_{}; std::array cards_; public: Hand(const std::string& cards, int bet) : bet_{ bet } { for (int c = 0; c < HAND; ++c) { switch (cards[c]) { case 'A': cards_[c] = 12; break; case 'K': cards_[c] = 11; break; case 'Q': cards_[c] = 10; break; case 'J': cards_[c] = 9; break; case 'T': cards_[c] = 8; break; default: cards_[c] = cards[c] - '2'; } } std::array mult{}; std::for_each(cards_.begin(), cards_.end(), [&mult](int c) { ++mult[c]; }); std::for_each(mult.begin(), mult.end(), [this](int c) { switch (c) { case 2: this->score_ += 1; break; case 3: this->score_ += 3; break; case 4: this->score_ += 5; break; case 5: this->score_ += 6; break; } }); } inline int bet() const { return bet_; } bool operator<(const Hand& that) const { return this->score_ < that.score_ or (this->score_ == that.score_ and this->cards_ < that.cards_); } static Hand from_string(const std::string& str) { int bet; std::string hand; std::istringstream{ str } >> hand >> bet; return { hand, bet }; } }; int main(void) { int answer{}; std::multiset hands; std::ifstream input{ "resources/input.txt" }; if (input.is_open()) { std::string line; while (not std::getline(input,line).eof()) { hands.insert(Hand::from_string(line)); } } input.close(); int rank{}; for (const auto& h : hands) { answer += ++rank * h.bet(); } std::cout << answer << std::endl; return 0; }