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", не тормозим.
      Ответить
      • Перевёл, проверь:
        <?php 
        
        function map_impl($arr, $f, $idx)
        {
            return array_map($f, array_intersect_key($arr, $idx));
        }
        
        function map($arr, $f)
        {
            return map_impl($arr, $f, range(0, count($arr) - 1));
        }
        
        function MyFunctor($arg)
            {
                return floatval($arg * $arg) / 2.0;
            };
        
        function main()
        {
            $arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
            $arrMappedFunctor = map($arr, "MyFunctor");
            $arrMappedLambda = map($arr, function($x) { return floatval($x * $x) / 2.0; });
        
            foreach ($arrMappedFunctor as $x) {
                echo strval($x) . ' ';
            }
            echo PHP_EOL;
            foreach ($arrMappedLambda as $x) {
                echo strval($x) . ' ';
            }
            echo PHP_EOL;
            return 0;
        }
        
        main();


        https://ideone.com/74xRnR

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

          https://tio.run/##y/r/P7fSrTQvuSS/SMHWSkH[email protected]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 =: [email protected][email protected]:@# 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
      Ответить
    • Продублируй на "gvforum".
      Ответить
    • А что, "using namespace std" религия не позволяет использовать?
      Ответить
      • Это как PHP -- один раз используешь и всю жизнь потом руки не отмоешь.
        Ответить
        • Я один раз использовал "using namespace std", больше не хочу. То ли дело "PHP", от которого пока не получается отмыться. Может быть, дегтярное мыло попробовать?
          Ответить
        • Я построил дом, но разве кто-то называет меня "строитель"?
          Я варю отличное пиво, но разве кто-то называет меня "пивовар"?
          Но стоило один раз написать что-то на PHP...
          Ответить
          • Нет, в жизни мне не повезло,
            Однажды я разбил стекло.
            Оно под солнечным лучом
            Сверкало и горело,
            А я нечаянно - мячом!
            Уж как мне нагорело!

            И вот с тех пор,
            С тех самых пор,
            Как только выбегу
            Во двор,
            Кричит вдогонку кто-то:
            - Стекло разбить охота?

            Воды немало утекло
            С тех пор, как я разбил стекло.
            Но стоит только мне вздохнуть,
            Сейчас же спросит кто-нибудь:
            - Вздыхаешь из-за стекол?
            Опять стекло раскокал?
            Ответить
    • Вот бы в 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;
      }
      Ответить

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