Кресты / Говнокод #24632 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

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

    • Перевёл, проверь:
      <?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, ни циклы:

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

          http://u.to/FC8rEw
          Ответить
          • Никогда не гнался за размерами. Слишком большой хуй - это даже вульгарно.
            15-17 см - самое то.
            Ответить
            • Тут я спорить с тобой не буду, Сетртор
              Уж чего-чего, а хуёв ты перевидал больше чем мы все вместе взятые
              Ответить
          • Мемоизация в 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 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)
                Ответить
            • 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 на
                  Ответить
  • А что, "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;
    }
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8