1. C++ / Говнокод #24632

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    #include <iostream>
    #include <type_traits>
    #include <utility>
    #include <array>
    
    template<size_t Size, typename T, typename FunctorType, size_t... idx>
    constexpr std::array<decltype(std::declval<FunctorType>().operator()(std::declval<T>())), Size>
                  map_impl(const std::array<T, Size> & arr, FunctorType && f, std::index_sequence<idx...>)
    {
        return std::array{ f(std::get<idx>(arr))... };
    }
    
    template<size_t Size, typename T, typename FunctorType>
    constexpr std::array<decltype(std::declval<FunctorType>().operator()(std::declval<T>())), Size>
                  map(const std::array<T, Size> & arr, FunctorType && f)
    {
        return map_impl(arr, f, std::make_index_sequence<Size>{});
    }
    
    struct MyFunctor {
        constexpr float operator()(int arg)
        {
            return static_cast<float>(arg * arg) / 2.0f;
        }
    };
    
    int main()
    {
        constexpr std::array arr{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
        auto arrMappedFunctor = map(arr, MyFunctor{});
        auto arrMappedLambda = map(arr, [](int x) constexpr { return static_cast<float>(x * x) / 2.0f; });
    
        for (auto && x : arrMappedFunctor) {
            std::cout << x << ' ';
        }
        std::cout << std::endl;
        for (auto && x : arrMappedLambda ) {
            std::cout << x << ' ';
        }
        std::cout << std::endl;
        return 0;
    }

    0.5 2 4.5 8 12.5 18 24.5 32 40.5 50
    0.5 2 4.5 8 12.5 18 24.5 32 40.5 50


    Метушня выходит на новый уровень: полноценный map в compile-time. Поддерживает как ручные функторы с перегруженным operator(), так и constexpr-лямбды. При помощи небольшой модификации возможно реализовать поддержку кортежей с произвольными типами.

    Запостил: gost, 18 Августа 2018

    Комментарии (28) RSS

    • Сразу переводим на "PHP", не тормозим.
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • То ли дело J – не нужны ни лямбды, ни map, ни циклы:
          myFunctor =: -:@*:
          a =: }.i.11
          arrMappedFunctor =: myFunctor a
          arrMappedLambda =: -:*:a
          echo arrMappedFunctor
          echo arrMappedLambda

          https://tio.run/##y/r/P7fSrTQvuSS/SMHWSkHXykHLiisRxKzVy9QzNORKLCryTSwoSE1BUoXQkoiQ90nMTUpJhBiiZZXIlZqcka@ArhtNFKLn/38A
          Ответить
          • @То ли дело J – не нужны ни лямбды, ни map, ни циклы:

            Вставил тебе свой "J" в задний проход, задев внутренние органы, и сделал пару мощных толчков, проверь?

            http://u.to/FC8rEw
            Ответить
            • Никогда не гнался за размерами. Слишком большой хуй - это даже вульгарно.
              15-17 см - самое то.
              Ответить
              • Тут я спорить с тобой не буду, Сетртор
                Уж чего-чего, а хуёв ты перевидал больше чем мы все вместе взятые
                Ответить
          • NB. Ух ты! Оптимизация!
               .(}[email protected])
             .(1+i.10)
            Ответить
            • f =: {. , }.
                 f i.10
              0 1 2 3 4 5 6 7 8 9
                 a =: ]&(f i.10)
                 a
              ]&(i.10)
              Ответить
            • Мемоизация в J:
              fib=: 3 : 0 M.
               if. 1>:y do. y else. (fib y-1)+fib y-2 end.
              )
              
              fibx=: 3 : 0
               if. 1>:y do. y else. (fibx y-1)+fibx y-2 end.
              )
              
                 timer=: 6!:2
              
                 timer 'fib 32'
              0.000479377
                 timer 'fibx 32'
              43.696
              Как с этим у других йэзыгов?
              Ответить
            • А нет, он просто вычисляет что может при определении голгола:
              a =: ]&(*:i.10)
                 a
              ]&0 1 4 9 16 25 36 49 64 81
              А i.10 это просто краткая запись.
              Ответить
              • a =: ]&(>:>:>:i.10)
                   a
                ]&(3+i.10)
                Ответить
              • Тут уже не может сократить
                a =: ]&(}.}.}.i.10)
                   a
                ]&3 4 5 6 7 8 9

                Вру:
                a =: ]&(}.}.}.i.100)
                   a
                ]&(3+i.97)
                Ответить
                • 99-i.100
                  99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 1...
                     i._100
                  99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 1...
                     a =: ]&(99-i.100)
                     a
                  ]&(i._100)
                  Ответить
            • Но всё равно умеет:
              f =: */@:>:@i."0
                 (6!:2)'f 10000x'
              3.24234
                 (6!:2)'! 10000x'
              3.33157
              Ответить
              • NB. произведение целых чисел от 1 до x
                   f1 =: */@:>:@i."0
                   
                   NB. рекурсивный факториал
                   f2 =: (*$:@:<:)`1:@.(0&=)"0
                   
                   f1 i. 10
                1 1 2 6 24 120 720 5040 40320 362880
                   
                   f2 i. 10
                1 1 2 6 24 120 720 5040 40320 362880
                   
                   ! i.10
                1 1 2 6 24 120 720 5040 40320 362880
                   
                   NB. время:
                   a =: i. 1000x
                   (6!:2)'f1 a'
                7.54239
                   
                   (6!:2)'f2 a'
                9.17621
                   
                   (6!:2)'! a'
                7.33401
                Ответить
                • Прямо сильно на вореции похоже.

                  Они так и начинались зожатием 1 1 2 6 баты 24 120 720 лесные время 9 17 621 fi i. 10 кобе
                  Ответить
                  • clockCointer =: 6!:9
                    setSeed =: 9!:1
                    
                    setSeed (2^31) | clockCounter''
                    
                    splitBy =: [: <;._1 ] , [
                    join =: (>@[ , >@])/
                    joinBy =: [: }:@join [ ,each ]
                    shuffle =: ?@!@x:@# A. ]
                    shuffleByDelimeter =: ] joinBy [: shuffle [ splitBy ]
                    bubu =: shuffleByDelimeter&' '@u:~&7
                    
                    a =: noun define
                    Прямо сильно на вореции похоже.
                    
                    Они так и начинались зожатием 1 1 2 6 баты 24 120 720 лесные время 9 17 621 fi i. 10 кобе
                    )
                    
                    echo bubu a
                    621 баты 9 120 так время зожатием 6 1 кобе
                    Прямо и i. вореции сильно лесные похоже.

                    Они 10 2 24 начинались fi 17 720 на
                    Ответить
      • Преводим тебе в гланды
        Ответить
    • Я просто оставлю это здесь: https://github.com/bormand/ct_aes
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • Вот бы в C++ работали псевдонимы типов... Конечно, typedef и template...using - это уже хорошо, но явно нужна возможность делать это для типов в объявлении/определении функции - чтоб ещё в контексте параметров шаблона.

      Иначе читать такую питушню невозможно.

      template<size_t Size, typename T, typename FunctorType, size_t... idx>
      constexpr array<FunctorResultType> map_impl(const array<T> & arr, FunctorType && f, SeqFromIdx)
      {
          return std::array{ f(std::get<idx>(arr))... };
      }
      where
      {
        template <typename T> using array = std::array<T, Size>;
        typedef decltype(std::declval<FunctorType>().operator()(std::declval<T>())) FunctorResultType;
        typedef std::index_sequence<idx...> SeqFromIdx;
      }
      Ответить

    Добавить комментарий