Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "BowlingScore.h"
- BowlingScore::BowlingScore()
- {}
- void BowlingScore::ParseInput(const std::string& p_input)
- {
- std::copy(p_input.begin(), p_input.end(), std::back_inserter(sequence));
- }
- unsigned BowlingScore::Calculate()
- {
- for(auto iterator = sequence.begin(); iterator != sequence.end(); ++iterator)
- {
- score.push_back(GetSymbolValue(iterator));
- }
- auto score_iterator = score.begin();
- int weak_symbol_counter = 0, steps = 0, sum = 0;
- auto nextStep = [&](){
- ++steps;
- weak_symbol_counter = 0;
- };
- for(auto symbol_iterator = sequence.begin(); symbol_iterator != sequence.end() && steps != 10; ++score_iterator, ++symbol_iterator)
- {
- if(*symbol_iterator == 'X')
- {
- Strike(score_iterator);
- nextStep();
- }
- else if(*symbol_iterator == '/')
- {
- Spare(score_iterator);
- nextStep();
- }
- else if(weak_symbol_counter == 1)
- {
- nextStep();
- }
- else
- {
- ++weak_symbol_counter;
- }
- sum += *score_iterator;
- }
- return sum;
- }
- unsigned BowlingScore::GetSymbolValue(std::vector<char>::iterator iterator) {
- if(*iterator == '-')
- return 0;
- else if(*iterator == '/')
- return 10 - GetSymbolValue(std::prev(iterator));
- else if(*iterator == 'X')
- return 10;
- else
- return (unsigned)(*iterator - '0');
- }
- void BowlingScore::Spare(std::vector<int>::iterator score_iterator)
- {
- *score_iterator += *std::next(score_iterator);
- }
- void BowlingScore::Strike(std::vector<int>::iterator score_iterator)
- {
- *score_iterator += *std::next(score_iterator);
- *score_iterator += *std::next(score_iterator, 2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement