#include #include #include #include #include #include const std::vector MAYAN_DIGITS = { " Θ ", " ∙ ", " ∙∙ ", "∙∙∙ ", "∙∙∙∙", "────" }; const std::string BLANK = " "; std::unordered_map BORDER { { "horizontal_beam", "═" }, { "vertical_beam", "║" }, { "lower_left", "╚" }, { "lower_central", "╩" }, { "lower_right", "╝" }, { "upper_left", "╔" }, { "upper_central", "╦" }, { "upper_right", "╗" } }; std::vector to_base20(const int32_t& number) { std::vector result; result.emplace_back(number % 20); int32_t n = number / 20; while ( n != 0 ) { result.emplace_back(n % 20); n /= 20; } std::reverse(result.begin(), result.end()); return result; } std::vector to_mayan_numeral(int32_t digit) { std::vector result(4, BLANK); if ( digit == 0 ) { result[3] = MAYAN_DIGITS[0]; return result; } for ( int32_t i = 3; i >= 0; --i ) { if ( digit >= 5 ) { result[i] = MAYAN_DIGITS[5]; digit -= 5; } else { result[i] = ( digit == 0 ) ? BLANK : MAYAN_DIGITS[digit]; break; } } return result; } void display(const std::vector>& numerals) { const int32_t index = numerals.size() - 1; std::cout << BORDER["upper_left"]; for ( int32_t i = 0; i <= index; ++i ) { for ( int32_t j = 0; j <= 3; ++j ) { std::cout << BORDER["horizontal_beam"]; } if ( i < index ) { std::cout << BORDER["upper_central"]; } else { std::cout << BORDER["upper_right"] << std::endl; } } for ( int32_t i = 1; i <= 4; ++i ) { std::cout << BORDER["vertical_beam"]; for ( int32_t j = 0; j <= index; ++j ) { std::cout << numerals[j][i - 1] + BORDER["vertical_beam"]; } std::cout << std::endl; } std::cout << BORDER["lower_left"]; for ( int32_t i = 0; i <= index; ++i ) { for ( int32_t j = 0; j <= 3; ++j ) { std::cout << BORDER["horizontal_beam"]; } if ( i < index ) { std::cout << BORDER["lower_central"]; } else { std::cout << BORDER["lower_right"] << std::endl; } } } int main() { for ( const int32_t& base10 : { 4'005, 8'017, 326'205, 886'205, 1'081'439'556 } ) { std::cout << "Base 10 number, " << base10 << " to Mayan:" << std::endl; std::vector digits = to_base20(base10); std::vector> mayans; for ( const int32_t& digit : digits ) { std::vector mayan = to_mayan_numeral(digit); mayans.push_back(mayan); } display(mayans); std::cout << std::endl; } }