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

    +2

    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
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    #include <tuple>
    #include <utility>
    #include <array>
    
    namespace detail {
    
    template <typename... Types, std::size_t... Indexes>
    auto make_array(const std::tuple<Types...> &t, std::index_sequence<Indexes...>) {
       using Tuple = std::tuple<Types...>;
       using ValueType = typename std::tuple_element<0, Tuple>::type;
       return std::array<ValueType, sizeof...(Types)>{ std::get<Indexes>(t)... };
    }
    
    template <typename Value>
    constexpr Value fib(std::size_t idx) {
      switch (idx) {
      case 0: return 1;
      case 1: return 1;
      default: return fib<Value>(idx - 1) + fib<Value>(idx - 1);
      }
    }
    }
    
    template <class... Args>
    auto to_array(const std::tuple<Args...> &t) {
      return detail::make_array(t, std::index_sequence_for<Args...>{});
    }
    
    template <typename Value, std::size_t size>
    class Fibonacci {
    public:
      constexpr auto as_array() const { return to_array(as_tuple()); }
     
      constexpr operator std::array<Value, size>() const { return as_array(); }
      
    private:
      template <std::size_t offset = 0> 
      constexpr auto as_tuple() const {
        return std::tuple_cat(std::tuple{detail::fib<Value>(offset)}, as_tuple<offset + 1>());
      }
      
      template <>
      constexpr auto as_tuple<size - 1>() const { return std::tuple{detail::fib<Value>(size - 1)}; }
    };
    
    int main() {
      std::array a = Fibonacci<int, 10>().as_array();
      return a[5];
    }

    По мотивам http://govnokod.ru/25401#comment460820. Правда на момент написания я прошляпил, что речь шла о "нельзя возвращать массив"ю

    Запостил: Elvenfighter, 25 Февраля 2019

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

    • Ещё не «Malbolge», но очень близко.
      Ответить
    • Ухх, сколько херни надо написать для решения такой простой задачи. Прям аж радуюсь за крестовиков
      template <std::херня{std::поебень<дрисня>(говно)} >(пидор)
      Ответить
    • Не компилируется

      p.s. а, не, clang trunk скомпилял
      Ответить
      • https://wandbox.org/permlink/KLqCuYWqEx8rhHyl а Clang 7.0 валится с ошибкой
        А GCC эту херню вообще не собирает. Типичная ситуация для крестов
        Ответить
      • Лан, починил: https://wandbox.org/permlink/tZLUe96FvrguRNoJ
        Ответить
        • https://wandbox.org/permlink/15xBSy8vfNydpeQl
          #include <iostream>
          #include <cstdlib>
          #include <cstdint>
          #include <cstddef>
          #include <array>
          
          constexpr uint64_t fib(uint64_t n)
          {
            return (n == 0 || n == 1) ? 1 : fib(n - 1) + fib(n - 2);
          }
          
          // Это макроговно вообще можно переписать на ваши триждыблядские шаблоны?
          #define FIB_INIT_ARRAY(len) \
          []() constexpr \
          { \
            std::array<uint64_t,len> numbers = {0}; \
            for (size_t i = 0; i < numbers.size(); i++) \
            { \
              numbers[i] = fib(i); \
            } \
            return numbers; \
          }();
          
          
          constexpr std::array a = FIB_INIT_ARRAY(20)
          
          int main()
          {
            for (size_t i = 0; i < a.size(); i++)
            {
              std::cout << a[i] << ", ";
            }
            std::cout << std::endl;
          }
          Ответить
          • Нафиг макрос принимает параметр len, который вообще никак не использует?
            Ответить
            • Я уже починил:

              #define FIB_INIT_ARRAY(len)

              std::array<uint64_t,len>

              C/|uLLlKOM_MED/|EHHb|u_nemyx
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • Но можно ведь оптимизировать ник? Ну, либо Запаковать UXP.
                  Ответить
                  • Но зачем запаковывать, если никто не сможет распаковать?
                    Ответить
                  • Самое интересное, что мозг тоже способен упаковывать/распаковывать инфу. Собеседник может сжать инфу до минимума - как правило, используя ёмкие термины, а слушатель распакует всё это (конечно, при наличии необходимого словаря, иначе часть данных пролетит мимо - получится сжатие "с потерями").
                    Ответить
                    • Математика сжимает на славу. Скажут "Да это просто моноид в категории эндофункторов" - и уходишь лет на пять распаковывать. Хоть и сжатие было без потерь, разжатие психически здоровым человеком всегда будет с потерями.
                      Ответить
                      • > Да это просто моноид в категории эндофункторов

                        Монада, не?
                        Ответить
                        • "Монада" - это ещё большее зожатие строки "моноид в категории эндофункторов". Было 32 символа, стало 6. На розжатие придётся потратить ещё больше времени!
                          Ответить
                          • Это зожатие с потерями уже, т.к. термин сам по себе не однозначен. (Монады Лейбница или монады в APL)
                            Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Ты всего лишь сократил слова, я же имел в виду лаконичную речь, когда несколькими словами можно сказать многое.

                        Глупые, либо наоборот, слишком хитрые люди (депутаты) зачастую не брезгают демагогией, в частности, используют многословие, принцип "вокруг да около": много говорил, да ничего не сказал.
                        Ответить
          • Лан, починил: https://wandbox.org/permlink/aPpEpt4Dyn6IRxeU

            #include <iostream>
            #include <cstdlib>
            #include <cstdint>
            #include <cstddef>
            #include <array>
            
            constexpr uint64_t fib(uint64_t n)
            {
              return (n == 0 || n == 1) ? 1 : fib(n - 1) + fib(n - 2);
            }
            
            // Эти триждыблядские шаблоны вообще можно переписать на ваше макроговно?
            template <std::size_t len>
            constexpr auto fib_init_array() {
              std::array<std::uint64_t, len> numbers = {0};
              for (std::size_t i = 0; i < numbers.size(); ++i)
                numbers[i] = fib(i);
                
              return numbers;
            }
            
            
            constexpr std::array a = fib_init_array<20>();
            
            int main()
            {
              for (size_t i = 0; i < a.size(); i++)
              {
                std::cout << a[i] << ", ";
              }
              std::cout << std::endl;
            }
            Ответить
            • Оптимизировал, теперь оно быстрее компилируется, проверь:
              template <std::size_t len>
              constexpr auto fib_init_array() {
                std::array<std::uint64_t, len> numbers = {0};
                for (std::size_t i = 0; i < numbers.size(); ++i)
                {
                  numbers[i] = (i < 2) ? 1 : numbers[i-1] + numbers[i-2];
                } 
                return numbers;
              }


              Интересно, разрабы крестокомпиляторов когда-нибудь начнут пилить оптимизатор для хуйни, которая считается в компилтайме?
              Ответить
              • > оптимизатор
                Даёшь крестоUBы в крестоконпайлтайме!
                Ответить
                • Даёшь SSE-интринсики и асмовставки в компилтайме!
                  Ответить
                  • И если мы используем асмовставки и SSE-интринсики в constexpr в компиляторе, который запущен на архитектуре, у которой таких SSE интринсиков нет и набор инструкций другой, то надо еще в компилятор встраивать эмулятор ассемблера и SSE. И чтоб с гомоиконностью!

                    И про big-little endian пишушню и возможную разницу в округлении для всяких плавучих питухов на разных архитектурах не забудьте.
                    Ответить
                    • С эмуляторами скучно.

                      Просто напиши в комменте какие проц и ось нужны для конпеляции.
                      Ответить
                      • А если такого проца и такой оси нет в наличии, например если там под VAX для NetBSD всё написано? https://wiki.netbsd.org/ports/vax/
                        Без эмулятора тут никуда не деться особо.
                        Ответить
                        • Скомпилишь в виртуалке.
                          Ответить
                          • Предлагаю переписать виртуалку в constexpr и скармливать в виртуалку в компилтайме, которая в компилтайме проэмулирует и выдаст ответ
                            Ответить
                    • З.Ы. Особенно весело будет если одна либа в компайл-тайме хочет ARM'овский асм под линух, а другая - amd64 под венду.

                      А если перепутаешь - оно просто начнёт выполнять хуйню от другого проца во время конпеляции.
                      Ответить
                    • А ещё надо разрешить доступ к i/o портам во время конпеляции. Например, при сборке ядра можно будет опросить железо и заточить код под него.
                      Ответить
                      • Можно будет перехватить во время конпеляции прерывание invalid opcode и потестировать какие инструкции действительно поддерживает проц.
                        Ответить
                        • А представь, как сложно будет реализовать кросс-компилятор. Придётся же к нему прикручивать эмулятор целевой платформы.
                          Ответить
                    • >> возможную разницу в округлении для всяких плавучих питухов на разных архитектурах

                      Компания «Borland» об этом не думала, поэтому у них в «Трубопаскакале» числа округлялись по-разному, в зависимости от того, проводилось вычисление в компайлтайме (кокококонстанты) или в рантайме. И даже соснольный кокококомпилятор и кокококомпилятор, встроенный в IDE, могли округлять константы по-разному.
                      Ответить
                      • Ты "SemaReal"?
                        Ответить
                      • А "gcc" пошёл ещё дальше. У него и в рантайме для одного и того же типа результаты не сходятся. Где-то тут был пример про sin(x) != sin(x).
                        Ответить
                        • Ну типа правильные пацаны точно сравнивать плавающие питухи не будут (а будут сравнивать с допуском), поэтому точное сравнение –— это UB и оптимизатор может считать, что плавающие питухи никогда не равны?
                          Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • В "PHP" можно.
                            Ответить
                          • Это же результаты высислений нельзя сравнивать, а для проверки, что вот енто число [не]является копией вон того, через (=|!)= можно же?
                            Ответить
                            • По идее да, но борманд покажет, что нет.
                              Ответить
                              • Да как вообще работают эти Ваши == и === и ====?

                                Окей, чтобы понять уровень завшивленности, задам простой нубский вопрос: допустимо ли без каких-либо уорнингов сравнивать строку с числом?
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • На этапе компиляции, естественно.

                                    тупорылый гость
                                    Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                      • И правда. Рулонные езыки не компилируют, а в c++ нету ===

                                        позову маму, кажется, мой подгузник пора менять.
                                        Ответить
                                        • Сейчас истинно «рулонными» остались только .bat и .sh.

                                          JS в современных браузерах перед исполнением компилируется в некоторое внутреннее представление (обычно это байткод, типа как у Java, но только в отличие от Java он не стандартизирован).

                                          PHP тоже компилируется в байткод (если не включить opcache/xcache/apc, то он будет повторно компилироваться на каждый запрос).

                                          Хотя всё-таки языки JS и PHP считают интерпретируемыми, поскольку отдельного ритуала компиляции у них нет.

                                          В «Питоне» оператор === не нужен, потому что в нём по умолчанию сравнение строгое.

                                          Надо вспомнить, где он ещё может быть. В «Ruby» есть. В компилируемом «ActionScript» есть.

                                          Выходит, что наличие === зависит не от компилируемости/интерпретируемости, а от типизации. Этот оператор присутствует в языках с очень слабой типизацией.
                                          Ответить
                                          • P.S. Офигеть, в «Перле» есть операторы <=>, cmp, eq, ~~, а в шестом ещё === и =:=, но смысл у === не такой, как у === в js/php.
                                            Ответить
                                            • > шестом
                                              Шестой пёрл таки жив?
                                              Ответить
                                              • Мне встречались только экспериментальные реализации, сделанные по приколу (для «Parrot», например).
                                                Ответить
                                              • показать все, что скрытоvanished
                                                Ответить
                                              • Не могу сказать за пёрт, но шестой "PHP" так и не родился.
                                                Ответить
                                                • Так же, как и шестой «MySQL».

                                                  А ещё прикольно, что «PHP 5.7» переименовали в «PHP 7.0», а «MySQL 5.8» –— в «MySQL 8.0» ещё на стадии разработки. Вероятно, решили, что стыдно, что столько лет не было новой мажорной версии.

                                                  Это они научились у «Java» (версия 1.5 была переименована в 5.0).

                                                  P.S. Ещё Windows NT 6.1 переименовали в 7.0; NT 6.2 переименовали в 8.0; NT 6.3 перименовали в 8.1. Легко запомнить, да?
                                                  Ответить
                                            • показать все, что скрытоvanished
                                              Ответить
                                              • Вот например в "J" документация по примитивам организована вот в такой нящны словарик:
                                                http://www.jsoftware.com/help/dictionary/vocabul.htm
                                                или вот такой, разбитый по "частям речи":
                                                http://www.jsoftware.com/help/dictionary/partsofspeech.htm

                                                Где каждый примитив подробно описан и даны примеры. Есть ли таке для "Pearl"?
                                                Ответить
                                                • показать все, что скрытоvanished
                                                  Ответить
                                                  • > В атличии
                                                    Почему ватличии, я же кинул ссылку на доки?

                                                    В этом твоём "paerlop" нет сцылок по закорючкам, сложнее искать незнакомку.

                                                    Давай меряца закорючками.

                                                    Вот, например, в "J" есть глагол, который реализует конченый автомат:
                                                    http://www.jsoftware.com/help/dictionary/d332.htmЛевый агрумент —– описание автомата, правый –— срока или мосив для парснига.
                                                    Ответить
                                          • показать все, что скрытоvanished
                                            Ответить
                                          • 'J' истинно рулонный. S" Forth" рулонный вне S" : foo ... ;" или внутри S" [ ... ]", компилируемый внутри S" : foo ... ;" и вне S" [ ... ] " или после S" true state !".
                                            Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                • Я не знаю что такое "====". Хотя... такая консьрукция возможна в "J":
                                  NB. массив масок для каждого элемента, где он встречается (5 различных элементов —– 5 строк)
                                     = 3 7 3 7 4 7 5 2
                                  1 0 1 0 0 0 0 0
                                  0 1 0 1 0 1 0 0
                                  0 0 0 0 1 0 0 0
                                  0 0 0 0 0 0 1 0
                                  0 0 0 0 0 0 0 1
                                     NB. т.к. "=" никогда не вернёт матрицу с одинаковыми строками, тут всегда будет единичная матрица размером n×n, где n –— количество различных элементов в исходном массиве
                                     == 3 7 3 7 4 7 5 2
                                  1 0 0 0 0
                                  0 1 0 0 0
                                  0 0 1 0 0
                                  0 0 0 1 0
                                  0 0 0 0 1
                                     NB. остальные унарные "=" ничего не меняют, добавляй сколько влезет
                                     ==== 3 7 3 7 4 7 5 2
                                  1 0 0 0 0
                                  0 1 0 0 0
                                  0 0 1 0 0
                                  0 0 0 1 0
                                  0 0 0 0 1
                                     NB. тут уже левый "=" бинарный, сравнение с 0 —– логическое отрицание матрицы 
                                     0 ==== 3 7 3 7 4 7 5 2
                                  0 1 1 1 1
                                  1 0 1 1 1
                                  1 1 0 1 1
                                  1 1 1 0 1
                                  1 1 1 1 0
                                  Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                          • показать все, что скрытоможно через strlicomp
                            Ответить
                            • бля я тоже об этом подумал. а почему - зеленым?

                              1. перевести число в строку;
                              2. использовать посимвольное сравнение без учёта регистра, отбросив разделитель разрядов либо жестко заменив его на точку;
                              3. ПРОФИТ.
                              Ответить
                              • А зачем? Ошибки от перевода в строку никуда не денутся, «4» всё так же будет не равно «3.999999999997».
                                Ответить
                                • PHP вроде бы выводит 3.9999999999997 как 4.
                                  Ответить
                                • При переводе в строку денормализованные числа нормализуются.

                                  Возможно, также +0 и -0 будут будут приведены к одному числу, но это неточно.
                                  Ответить
                                  • Так мы говорим только о «PHP», или же об алгоритме в целом?

                                    В любом случае (раз уж поступило предложение снять зелёный), я не вижу каких-то преимуществ у этого метода по сравнению с банальным «abs(a - b) < MaJleHbKNN_nemyx»: он медленнее, сложнее в реализации и определённо хуже читаем.
                                    Ответить
                                • Делфи 20 летней давности сравнивает и переводит корректно. Навскидку две функции:
                                  SameValue, FloatToStr, проверьте.

                                  FloatToStr тянет функцию FloattoText, код которой - 3 с половиной экрана на ассембрере.

                                  Профит? На самом деле, это Ваш php сосёт.
                                  Ответить
                                  • "PHP" –— дерьмо, потому что он неявно вызывает преобразование типов (строку в число, число в строку и т. п.).

                                    Но с другой стороны, вызывать FloatToStr лишь для сравнения —– это потеря скорости. В Delphi больше выбора, чем в PHP, как сделать, и можно сделать эффективнее.
                                    Ответить
                                    • Ох, лол...
                                      Ответить
                                    • Но это только на двойное равно, которое тру-пхпшники не используют.
                                      Ответить
                                      • Кто уже споткнулся на ==, потом везде пишет ===.

                                        А вот до первых граблей двойное равно используют. В каком-то форумном движке хэши паролей сравнивались через двойное равно. Если хэш пароля юзера начинался с "0e", то в этого юзера можно было залогиниться чуть ли не с любым паролем.
                                        Ответить
                      • показать все, что скрытоvanished
                        Ответить

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