say: in progress

This commit is contained in:
Dmitry Kokorin 2016-04-08 11:10:57 +03:00
parent 75a9e236e2
commit 41ab570e93
2 changed files with 98 additions and 0 deletions

85
cpp/say/say.cpp Normal file
View file

@ -0,0 +1,85 @@
#include "say.h"
#include <unordered_map>
#include <iostream>
namespace say {
using namespace std;
namespace {
const unordered_map<number_t, string> 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);
}
}

13
cpp/say/say.h Normal file
View file

@ -0,0 +1,13 @@
#pragma once
#define EXERCISM_RUN_ALL_TESTS
#include <string>
namespace say {
typedef unsigned long long number_t;
std::string in_english(number_t number);
}