Advertisement
AI_UBI

So much cocaine

Jan 7th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4.  
  5. typedef std::pair<bool, int>  li_t;
  6. typedef std::function<li_t()> fi_t;
  7.  
  8. int main() {
  9.     fi_t nil  = []() -> li_t {return std::make_pair(false, 0);};
  10.     auto null = [](li_t a) -> bool {return !a.first;};
  11.     auto val  = [](li_t a) -> int  {return a.second;};
  12.    
  13.     auto cons = [](int a, const fi_t& l) -> fi_t {
  14.         int p=0; return [=]() mutable -> li_t {
  15.                     if (p) return l(); else {p=1; return std::make_pair(true, a);}};};
  16.  
  17.     auto foldl = [cons,nil,null,val](const auto& f, auto a, const fi_t& l) -> fi_t {
  18.         auto go = [f,cons,nil,null,val](auto a, const fi_t& l, const auto& la) -> fi_t {
  19.             li_t e=l(); return null(e) ? a : la(f(val(e),a), l, la);};
  20.         return go(a, l, go);};
  21.        
  22.     auto foldr = [cons,nil,null,val](const auto& f, auto a, const fi_t& l) -> fi_t {
  23.         auto go = [f,cons,nil,null,val](auto a, const fi_t& l, const auto& la) -> fi_t {
  24.             li_t e=l(); return null(e) ? a : f(val(e), la(a, l, la));};
  25.         return go(a, l, go);};
  26.  
  27.     auto reverse = [cons,nil,foldl](const fi_t& l) -> fi_t {return foldl(cons, nil, l);};
  28.  
  29.     auto num2list = [cons, nil](int n, const auto& la) -> fi_t {
  30.         return n ? cons(n%10, la(n/10, la)) : nil;};
  31.        
  32.     auto list2num = [cons,nil,val,foldr](const fi_t& l) -> int {
  33.        auto go = [cons,nil,val](int a, const fi_t& l) -> fi_t {
  34.             return cons(val(l())*10 + a,nil);};
  35.        return val(foldr(go, nil, l)()); };
  36.  
  37.     int n; cout<<"Input n: "; cin>>n;
  38.     cout<<"Inverse n = ";
  39.     cout<<(list2num(reverse(num2list(n, num2list))))<<'\n';
  40.     return 0;
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement