nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Modern_C++_leet文字列変換

#include <string>
#include <iostream>
#include <map>
#include <algorithm> // transform
#include <vector>
#include <numeric> //iota, accumulate

// leetマップ変数 (グローバル変数)
std::map<char, char> leet {
    {'A', '4'},
    {'E', '3'},
    {'G', '6'},
    {'I', '1'},
    {'O', '0'},
    {'S', '5'},
    {'Z', '2'}
};
        
/**
 * @fn
 *  入力文字列をLeet文字列に変換する関数
 * @brief 要約説明
 * @param input 入力文字列
 * @return  Leet変換後の文字列
 * @detail 変換規則はグローバル変数に記載したleetマップ変数に記載
 */
std::string ConvertLeetString(std::string input)
{
    
    std::vector<char> result;
    
    // Map(変換)
    // 入力文字列を1文字ずつLeet文字列に変換する。変換結果はcharを格納するvectorに格納する
    std::transform(input.begin(), input.end(), std::back_inserter(result),
    [=](char item) -> char 
    {
        std::map<char, char>::iterator it;
        
        it = leet.find(item);

        if (it != leet.end())
        {
            // 探索文字(item)と等価なキーがleetマップ変数にある場合はそのvalue値を返す
            return leet[item];
        }
        return item;
    });
    
    // Accumulate(集約)
    return  std::accumulate(result.begin(), result.end(), std::string());
}

int main(void)
{
    // インプット文字列を取得
    std::string input;
    std::cin >> input;
    
    // ConvetLeetStringメソッドを保有するUtilityクラスにしたほうがよかった
    std::string result = ConvertLeetString(input);
    
    std::cout << result << std::endl;

    return EXIT_SUCCESS;
}