1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#include <iostream>
#include <string>
const std::string uppercase_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
const std::string lowercase_letters = "abcdefghijklmnopqrstuvwxyz" ;
std::string encode( const std::string& str, std::size_t offset_upper_case, std::size_t offset_lower_case )
{
std::string result ;
for( char c : str ) // for each character in the input string
{
// check if it is an upper case letter
auto pos = uppercase_letters.find(c) ;
if( pos != std::string::npos ) // upper case letter, found at position pos
{
pos += offset_upper_case ; // add offset for upper case letters
pos %= uppercase_letters.size() ; // adjust pos if it is beyond end of string
result += uppercase_letters[pos] ; // add encoded character to result
}
// otherwise check if it is a lower case letter
else if( ( pos = lowercase_letters.find(c)) != std::string::npos ) // lower case letter, found at position pos
{
pos += offset_lower_case ; // add offset for lower case letters
pos %= lowercase_letters.size() ; // adjust pos if it is beyond end of string
result += lowercase_letters[pos] ; // add encoded character to result
}
// not an alpha character, add it as it is to the result
else result += c ;
}
return result ;
}
std::string decode( const std::string& str, std::size_t offset_upper_case, std::size_t offset_lower_case )
{
std::string result ;
for( char c : str ) // for each character in the input string
{
// check if it is an upper case letter
auto pos = uppercase_letters.find(c) ;
if( pos != std::string::npos ) // upper case letter, found at position pos
{
pos += uppercase_letters.size() ; // to make sure it does not become less than zero
pos -= offset_upper_case ; // subtract offset for upper case letters
pos %= uppercase_letters.size() ; // adjust pos if it is beyond end of string
result += uppercase_letters[pos] ; // add encoded character to result
}
// otherwise check if it is a lower case letter
else if( ( pos = lowercase_letters.find(c)) != std::string::npos ) // lower case letter, found at position pos
{
pos += uppercase_letters.size() ; // to make sure it does not become less than zero
pos -= offset_lower_case ; // subtract offset for lower case letters
pos %= lowercase_letters.size() ; // adjust pos if it is beyond end of string
result += lowercase_letters[pos] ; // add encoded character to result
}
// not an alpha character, add it as it is to the result
else result += c ;
}
return result ;
}
int main()
{
const std::size_t offset_ucase = 9 ;
const std::size_t offset_lcase = 6 ;
// note: 123 etc. would remain unchanged during the encode/decode process
// xyz would overflow 'z' when offset is added
const std::string str = "Hello 123 World xyz!" ;
std::cout << "original: " << str << '\n' ;
const std::string encoded_str = encode( str, offset_ucase, offset_lcase ) ;
std::cout << " encoded: " << encoded_str << '\n' ;
const std::string decoded_str = decode( encoded_str, offset_ucase, offset_lcase ) ;
std::cout << " decoded: " << decoded_str << '\n' ;
}
|