From 41ab570e938b8a77a2537c727d8c23af83432823 Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Fri, 8 Apr 2016 11:10:57 +0300 Subject: [PATCH] say: in progress --- cpp/say/say.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ cpp/say/say.h | 13 ++++++++ 2 files changed, 98 insertions(+) create mode 100644 cpp/say/say.cpp create mode 100644 cpp/say/say.h diff --git a/cpp/say/say.cpp b/cpp/say/say.cpp new file mode 100644 index 0000000..44e2262 --- /dev/null +++ b/cpp/say/say.cpp @@ -0,0 +1,85 @@ +#include "say.h" + +#include + +#include + +namespace say { + +using namespace std; + +namespace { + +const unordered_map numbers_map = { + {0, "zero"}, + {1, "one"}, + {2, "two"}, + {3, "three"}, + {4, "four"}, + {5, "five"}, + {6, "six"}, + {7, "seven"}, + {8, "eight"}, + {9, "nine"}, + {10, "ten"}, + {11, "eleven"}, + {12, "twelve"}, + {13, "thirteen"}, + {20, "twenty"}, + {30, "thirty"}, + {50, "fifty"}, + {80, "eighty"} + }; +} + + +string in_english(number_t number) +{ + if (number > 13 && number < 20) + return numbers_map.at(number - 10) + "teen"; + + if (number >= 20 && number < 100 && (number % 10 == 0)) { + + if (numbers_map.count(number)) + return numbers_map.at(number); + + return numbers_map.at(number / 10) + "ty"; + } + + if (number > 20 && number < 100) { + + number_t ones = number % 10; + number_t tens = number - ones; + + return in_english(tens) + '-' + in_english(ones); + } + + if (number >= 100 && number < 1000) { + + if (number % 100 == 0) + return in_english(number / 100) + " hundred"; + + number_t rest = number % 100; + number_t hundreds = number - rest; + + return in_english(hundreds) + ' ' + in_english(rest); + } + + if (number >= 1000 && number < 1000000) { + + cout << number << endl; + + if (number % 1000 == 0) + return in_english(number / 1000) + " thousand"; + + number_t rest = number % 1000; + number_t thousands = number - rest; + + return in_english(thousands) + ' ' + in_english(rest); + } + + return numbers_map.at(number); +} + + +} diff --git a/cpp/say/say.h b/cpp/say/say.h new file mode 100644 index 0000000..99f9987 --- /dev/null +++ b/cpp/say/say.h @@ -0,0 +1,13 @@ +#pragma once + +#define EXERCISM_RUN_ALL_TESTS + +#include + +namespace say { + +typedef unsigned long long number_t; + +std::string in_english(number_t number); + +}