Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <functional>
- using namespace std;
- typedef std::pair<bool, int> li_t;
- typedef std::function<li_t()> fi_t;
- int main() {
- fi_t nil = []() -> li_t {return std::make_pair(false, 0);};
- auto null = [](li_t a) -> bool {return !a.first;};
- auto val = [](li_t a) -> int {return a.second;};
- auto cons = [](int a, const fi_t& l) -> fi_t {
- int p=0; return [=]() mutable -> li_t {
- if (p) return l(); else {p=1; return std::make_pair(true, a);}};};
- auto foldl = [cons,nil,null,val](const auto& f, auto a, const fi_t& l) -> fi_t {
- auto go = [f,cons,nil,null,val](auto a, const fi_t& l, const auto& la) -> fi_t {
- li_t e=l(); return null(e) ? a : la(f(val(e),a), l, la);};
- return go(a, l, go);};
- auto foldr = [cons,nil,null,val](const auto& f, auto a, const fi_t& l) -> fi_t {
- auto go = [f,cons,nil,null,val](auto a, const fi_t& l, const auto& la) -> fi_t {
- li_t e=l(); return null(e) ? a : f(val(e), la(a, l, la));};
- return go(a, l, go);};
- auto reverse = [cons,nil,foldl](const fi_t& l) -> fi_t {return foldl(cons, nil, l);};
- auto num2list = [cons, nil](int n, const auto& la) -> fi_t {
- return n ? cons(n%10, la(n/10, la)) : nil;};
- auto list2num = [cons,nil,val,foldr](const fi_t& l) -> int {
- auto go = [cons,nil,val](int a, const fi_t& l) -> fi_t {
- return cons(val(l())*10 + a,nil);};
- return val(foldr(go, nil, l)()); };
- int n; cout<<"Input n: "; cin>>n;
- cout<<"Inverse n = ";
- cout<<(list2num(reverse(num2list(n, num2list))))<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement