From e52031d3df9a0671ef6c9109708d5406fc9d73b7 Mon Sep 17 00:00:00 2001 From: rasmus Date: Tue, 18 Mar 2025 15:39:43 +0100 Subject: [PATCH 1/2] Initial implementation of calculation of the score --- rolls.txt | 2 +- rolls1.txt | 1 + src/main.cpp | 48 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 rolls1.txt diff --git a/rolls.txt b/rolls.txt index aadbdc8..2daa3f9 100644 --- a/rolls.txt +++ b/rolls.txt @@ -1 +1 @@ -2, 3, 5, 4, 9, 1, 2, 5, 3, 2, 4, 2, 3, 3, 4, 6, 10, 3, 2 +10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 diff --git a/rolls1.txt b/rolls1.txt new file mode 100644 index 0000000..3b81674 --- /dev/null +++ b/rolls1.txt @@ -0,0 +1 @@ +10, 3, 2, 2, 3, 5, 4, 9, 1, 2, 5, 3, 2, 4, 2, 3, 3, 4, 6 diff --git a/src/main.cpp b/src/main.cpp index c150522..1ea631c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,24 +4,58 @@ #include "../Include/FileHelper.h" #include "../Include/NumberHelper.h" +using namespace std; + int main(int argc, char *argv[]) { - if(argc < 2) { + if (argc < 2) { std::cerr << "Please provide a CSV formatted file."; return 0; } - if(!FileHelper::FileExists(argv[1])) { - std::cerr << "Filepath: " << argv[1] << " doesn't exist."; + if (!FileHelper::FileExists(argv[1])) { + cerr << "Filepath: " << argv[1] << " doesn't exist."; return 0; } - std::string file = FileReader::GetFile(argv[1]); + string file = FileReader::GetFile(argv[1]); - std::vector numbers = NumberHelper::GetNumbers(file); + vector rolls = NumberHelper::GetNumbers(file); - for(int i = 0; i < numbers.size(); i++) { - std::cout << numbers[i] << ' '; + + // Calculate score + int score = 0; + int frame = 0; + + while (true) { + if (rolls[frame] == 10) { + if (frame + 3 == rolls.size() && rolls[frame - 3] == 10) { + score += 10 + rolls[frame + 1] + rolls[frame + 2]; + break; + } + + score += 10 + rolls[frame + 1] + rolls[frame + 2]; + frame += 1; + continue; + } + + // Spare + if (rolls[frame] + rolls[frame + 1] == 10) { + score += 10 + rolls[frame + 2]; + frame += 2; + continue; + } + + // Open Frame + score += rolls[frame] + rolls[frame + 1]; + frame += 2; + + if (frame == rolls.size()) { + break; + } } + cout << "Score: " << score << std::endl; + + return 0; } -- 2.43.0 From 43cd0101f33bf89f8c4983cf2893d74187a77997 Mon Sep 17 00:00:00 2001 From: rasmus Date: Tue, 18 Mar 2025 16:40:31 +0100 Subject: [PATCH 2/2] Score calculation has been moved to it's own file --- Include/NumberHelper.h | 4 +++- Include/ScoreCalculator.h | 18 +++++++++++++++ rolls.txt | 2 ++ src/NumberHelper.cpp | 2 +- src/ScoreCalculator.cpp | 47 +++++++++++++++++++++++++++++++++++++++ src/main.cpp | 37 ++++-------------------------- 6 files changed, 75 insertions(+), 35 deletions(-) create mode 100644 Include/ScoreCalculator.h create mode 100644 src/ScoreCalculator.cpp diff --git a/Include/NumberHelper.h b/Include/NumberHelper.h index ab37786..9c4da23 100644 --- a/Include/NumberHelper.h +++ b/Include/NumberHelper.h @@ -4,13 +4,15 @@ #include #include +using namespace std; + class NumberHelper { public: NumberHelper(); ~NumberHelper(); - static std::vector GetNumbers(const std::string csv); + static vector GetNumbers(string csv); }; #endif \ No newline at end of file diff --git a/Include/ScoreCalculator.h b/Include/ScoreCalculator.h new file mode 100644 index 0000000..a49dc10 --- /dev/null +++ b/Include/ScoreCalculator.h @@ -0,0 +1,18 @@ +#ifndef SCORECALCULATOR_H +#define SCORECALCULATOR_H + +#include +#include + +using namespace std; + +class ScoreCalculator { + public: + ScoreCalculator(); + + ~ScoreCalculator(); + + static int GetScore(vector rolls); +}; + +#endif \ No newline at end of file diff --git a/rolls.txt b/rolls.txt index 2daa3f9..ef0a92e 100644 --- a/rolls.txt +++ b/rolls.txt @@ -1 +1,3 @@ +2, 3, 5, 4, 9, 1, 2, 5, 3, 2, 4, 2, 3, 3, 4, 6, 10, 3, 2 +5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 diff --git a/src/NumberHelper.cpp b/src/NumberHelper.cpp index 0cf7378..3a4a366 100644 --- a/src/NumberHelper.cpp +++ b/src/NumberHelper.cpp @@ -6,7 +6,7 @@ NumberHelper::NumberHelper() {}; NumberHelper::~NumberHelper() {}; -std::vector NumberHelper::GetNumbers(const std::string csv){ +std::vector NumberHelper::GetNumbers(std::string csv){ std::vector rolls; std::stringstream ss(csv); std::string number; diff --git a/src/ScoreCalculator.cpp b/src/ScoreCalculator.cpp new file mode 100644 index 0000000..bdff0ee --- /dev/null +++ b/src/ScoreCalculator.cpp @@ -0,0 +1,47 @@ +#include "../Include/ScoreCalculator.h" + +ScoreCalculator::ScoreCalculator() {}; +ScoreCalculator::~ScoreCalculator() {}; + +int ScoreCalculator::GetScore(vector rolls) { + // Calculate score + int score = 0; + int frame = 0; + + while (true) { + if (rolls[frame] == 10) { + // If we're on our last frame, and roll a 10. + if (frame + 3 == rolls.size() && rolls[frame - 3] == 10) { + score += 10 + rolls[frame + 1] + rolls[frame + 2]; + break; + } + + score += 10 + rolls[frame + 1] + rolls[frame + 2]; + frame += 1; + continue; + } + + // Spare + if (rolls[frame] + rolls[frame + 1] == 10) { + if (frame + 3 == rolls.size() && rolls[frame] + rolls[frame + 1] == 10) + { + score += 10 + rolls[frame + 1]; + break; + } + + score += 10 + rolls[frame + 2]; + frame += 2; + continue; + } + + // Open Frame + score += rolls[frame] + rolls[frame + 1]; + frame += 2; + + if (frame == rolls.size()) { + break; + } + } + + return score; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 1ea631c..3cca3c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,12 +3,13 @@ #include "../Include/FileReader.h" #include "../Include/FileHelper.h" #include "../Include/NumberHelper.h" +#include "../Include/ScoreCalculator.h" using namespace std; int main(int argc, char *argv[]) { if (argc < 2) { - std::cerr << "Please provide a CSV formatted file."; + cerr << "Please provide a CSV formatted file."; return 0; } @@ -18,44 +19,14 @@ int main(int argc, char *argv[]) { } string file = FileReader::GetFile(argv[1]); - + vector rolls = NumberHelper::GetNumbers(file); + int score = ScoreCalculator::GetScore(rolls); - // Calculate score - int score = 0; - int frame = 0; - while (true) { - if (rolls[frame] == 10) { - if (frame + 3 == rolls.size() && rolls[frame - 3] == 10) { - score += 10 + rolls[frame + 1] + rolls[frame + 2]; - break; - } - - score += 10 + rolls[frame + 1] + rolls[frame + 2]; - frame += 1; - continue; - } - - // Spare - if (rolls[frame] + rolls[frame + 1] == 10) { - score += 10 + rolls[frame + 2]; - frame += 2; - continue; - } - - // Open Frame - score += rolls[frame] + rolls[frame + 1]; - frame += 2; - - if (frame == rolls.size()) { - break; - } - } cout << "Score: " << score << std::endl; - return 0; } -- 2.43.0