2009-06-12

以下について教えてあげよう☠☢☣☤

我、不知其宿題與課題也。そも、宿題と課題とは、同じ義には候はずや。ただし、これ易き文字列処理問題にて候。

・大文字は小文字に、数字は'0','1','2'...を'9','8','7'...と反転させる。
・ただし、'#'以降の文字は変換しない。
・例として "Abc012_59F_#012Gh"を渡した場合の戻り値は "abc987_40f_#012Gh"となる。

僭越ながら、ユーザー定義リテラルを用ひ候。

// 名前空間に入れること肝要なり。
namespace udl
{
        // ユーザー定義リテラルてふものなり。
        std::string operator "" _conv( char const *ptr )
        {
                std::string temp(ptr) ;

                std::transform(
                        temp.begin, std::find(temp.begin, temp.end, '#')
                        , temp.begin()
                          // ラムダてふ便利な無名関数なり。
                        , [] (char const c ) -> char 
                          {
                                if ( c >= '0' && c <= '9') return '9' - c + '0' ;
                                if ( c >= 'A' && c <= 'Z' ) return c - 'A' + 'a' ;
                                return c ;
                          } ) ;

                return temp ;
        }
}



int main()
{
        //使う際には、using declarationにて指定する必要有之候。
        using udl::operator "" _conv ;
        std::cout << "Abc012_59F_#012Gh"_conv << std::endl ;
}

げにユーザー定義リテラルてふものは、その易きこと如此。

No comments: