Newer
Older
exercism-cpp / atbash-cipher / atbash_cipher.cpp
#include "atbash_cipher.h"

#include <iostream>
#include <string>

namespace atbash_cipher {
std::string encode(const std::string raw) {
    std::string encoded;
    int cnt = 0;

    for (auto iter = raw.begin(); iter != raw.end(); ++iter) {
        if (*iter == ' ' || *iter == ',' || *iter == '.')
            continue;

        if (cnt != 0 && cnt % 5 == 0) {
            encoded += ' ';
        }
        if ((*iter >= 'a' && *iter <= 'z') || (*iter >= 'A' && *iter <= 'Z')) {
            int idx;

            idx = static_cast<int>(*iter - 'a');
            idx = (idx >= 0 && idx < 26 ? idx : static_cast<int>(*iter - 'A'));
            encoded += static_cast<char>(static_cast<int>('z') - idx);
        } else {
            encoded += *iter;
        }

        cnt++;
    }

    return encoded;
}
std::string decode(const std::string encoded) {
    std::string decoded;

    for (auto iter = encoded.begin(); iter != encoded.end(); ++iter) {
        if (*iter == ' ')
            continue;

        if (*iter >= 'a' && *iter <= 'z') {
            decoded += ('z' - *iter + 'a');
        } else {
            decoded += *iter;
        }
    }

    return decoded;
}
} // namespace atbash_cipher