作ってみました。
最後と最初がつながってなかったり、最後が「ん」の文字列が入力されたらその後の処理はしません。
#include <iostream> #include <string> #include <locale> #include <shand/maybe.hpp> using namespace std; using namespace shand; inline maybe<wstring>::type last_and_first(const wstring& last) { return monad_return(last); } struct next { wstring first_; public: typedef maybe<wstring>::type result_type; next(const wstring& first) : first_(first) {} result_type operator()(const wstring& last) const { if (is_last_and_first(last, first_)) return monad_return(first_); return nothing(); } private: bool is_last_and_first(const wstring& last, const wstring& first) const { // 2文字以上ないとしりとりにならない if (last.length() < 2 || first.length() < 2) return false; if (first[first.length() - 1] == L'ん') return false; return last[last.length() - 1] == first[0]; } }; int main() { locale::global(locale("japanese")); ((last_and_first(L"しりとり") >>= next(L"りす")) >>= next(L"すいか")) >>= next(L"おしまい"); }
ちなみに、Haskellの処理系(GHC)では日本語使うと化けるのでできないのです。。。