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

    +7

    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
    constexpr auto auto​()
    {
      return 1;
    }
    
    typedef decltype(auto​()) auto​​;
    const auto​​ auto​​​ = auto​();
    
    template <typename auto​​​​>
    constexpr auto auto​​​​​() {
        return auto​​​;
    }
    
    template <typename auto​​​​, typename auto​​​​​​, typename... auto​​​​​​​>
    constexpr auto auto​​​​​() {
        return auto​​​ + auto​​​​​<auto​​​​​​, auto​​​​​​​...>();
    }
    
    int main()
    {
      constexpr auto auto​​​​​​​ = auto​​​​​<auto​​,auto​​,auto​​,auto​​,auto​​,auto​​>();
      constexpr auto auto​​​​ = auto​​​​​<auto​​,auto​​,auto​​,auto​​,auto​​,auto​​,auto​​>();
      return auto​​​​​​​*auto​​​​; 
    }

    auto auto auto...
    https://twitter.com/RichardKogelnig/status/943497972481953792
    https://godbolt.org/g/Yvczo1

    Запостил: [email protected], 20 Декабря 2017

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

    • хорош развод
      Ответить
      • Я до сих пор не могу понять, что курил Комитет, когда разрешил юникод в идентификаторах. Должно быть что-то очень сильное, потому что в разрешённых есть куча непечатаемых символов.
        Ответить
        • > что курил Комитет
          Битву с фортраном они проиграли, теперь приходится конкурировать с 1с.
          Ответить
        • int 🌜;
          🌜➕➕;
          Ответить
          • эмоджы проебались, эх
            https://youtu.be/LVbhkgYba0s?t=87
            (серьёзная контора, говна не посоветуют)
            Ответить
            • За две секунды этого видео кресты пробили очередное дно.

              Осталось завязать на эмоджи какие-то синтаксические элементы языка.
              Ответить
        • > Я до сих пор не могу понять, что курил Комитет, когда разрешил юникод в идентификаторах.

          к слову. а как с этим у шарпеев и жаб?
          Ответить
          • An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter.
            
            A "Java letter" is a character for which the method Character.isJavaIdentifierStart(int) returns true.
            
            A "Java letter-or-digit" is a character for which the method Character.isJavaIdentifierPart(int) returns true.


            Диапазоны там уже
            var  	&#x1f4a9; =0;error: illegal character: '\udca9'
            var говно=0;//compile ok


            Но отсутствие эмоджи говнячить не мешает:
            https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8
            Identifiers that have the same external appearance may yet be different.
            
            For example, the identifiers consisting of the single letters LATIN CAPITAL LETTER A (A, \u0041), LATIN SMALL LETTER A (a, \u0061), GREEK CAPITAL LETTER ALPHA (A, \u0391), CYRILLIC SMALL LETTER A (a, \u0430) and MATHEMATICAL BOLD ITALIC SMALL A (a, \ud835\udc82) are all different.
            
            Unicode composite characters are different from their canonical equivalent decomposed characters. For example, a LATIN CAPITAL LETTER A ACUTE (Á, \u00c1) is different from a LATIN CAPITAL LETTER A (A, \u0041) immediately followed by a NON-SPACING ACUTE (´, \u0301) in identifiers. See The Unicode Standard, Section 3.11 "Normalization Forms".
            Ответить
    • а чего подсветка синтаксиса его понимает-то? Или там непечатные символы в идентификаторах?
      Ответить
      • там у многих auto на конце висит U+200B (ZERO WIDTH SPACE) который очевидно стал частью имени, типа "auto<200b>" и "auto<200b><200b>"
        Ответить
        • > ZERO WIDTH SPACE
          А отдельный ZERO WIDTH SPACE можно юзать в качестве идентификатора? Или всё-таки в начале должна быть буква?
          Ответить
          • З.Ы. Можно. И даже в именах макросов катит... Т.е. можно сделать #include <whitespace.h> и писать весь код одними пробелами.
            Ответить
            • а там есть еще какие другие пробелы полезные? а то с одним пробелом получается только унарная система. для бинарной - нужно как минимум два. на двух пробелах даже можно будет сделать азбуку морзе, и теоретически полноценную трансляцию крестового сырца из "обыденного" вида в полный вайтспейс.
              Ответить
              • В теории можно обойтись только одним символом пробела: можно сопоставить любой программе натуральное число, аналогично кодированию Гёделя, и записать это число количеством пробелов.
                Ответить
                • P.S. рубрика снаут-архитектор
                  Ответить
                • > кодированию Гёделя

                  не впечатал что это такое. похоже на какое-то кодирование.

                  но с другой стороны, как не извращайся, кроме унарной системы из одного символа ты ничего больше сделать не можешь.

                  https://en.wikipedia.org/wiki/Unary_numeral_system
                  Ответить
                  • > не впечатал что это такое

                    Гёдель доказывал теорему, кодируя утверждения целыми числами. Можно использовать ту же технику для представления программ.
                    См. Нумерация Гёделя
                    Ответить
                    • а. при первой попытке чтения на википедии пропустил "формальные языки".

                      > Можно использовать ту же технику для представления программ.

                      но число конечное тебе придется как-то представлять. и с одним символом это будет унарная система.
                      Ответить
                      • > и с одним символом это будет унарная система

                        Ну СНауТ ровно это и сказал.
                        Одна проблема – для записи даже тривиальных программ числом пробелов нужно будет использовать все атомы вселенной.
                        Ответить
                        • > все атомы вселенной.

                          да, но так как это zero-width space'ы, на экране это вообще не будет занимать места.
                          Ответить
                    • В компьютерах программы и так кодируются целыми числами (в двоичной системе счисления).
                      Ответить
                      • > В компьютерах программы и так кодируются целыми числами (в двоичной системе счисления).

                        Спасибо, кэп. Как ты запишешь программу, которая представляется в виде 256 нулей, за которыми следует 128 единиц и ещё 128 нулей? Какое число нужно взять? Как отличить эту программу от похожей, содержащей другое число нулей в начале?
                        Ответить
                        • у моих программ нулевых байт в начале нет
                          Ответить
                          • > у моих программ нулевых байт в начале нет

                            на 1c пишешь?

                            А вообще да, можно условиться начинать все программы с 1 и тогда можно маппить числа в машинный код для MMIX и обратно.
                            Ответить
                            • Байт, а не бит. Если известно, что в начале программы нет нулевых байт, то незначащие биты первого байта можно выкинуть.

                              Все же анонимные форумы гораздо лучше неймфажных помоек. Кто-то въебал тебе плюс только потому что роман кащицын хуйни не скажет, хотя как раз ее ты в данный момент говоришь.
                              Ответить
                              • i am a very baaaad boy
                                Ответить
                              • > ты в данный момент говоришь

                                Согласен, что-то меня не туда понесло. В реальной жизни нули в начале не проблема. А если хочется закодировать 33 произвольных бита, добавление одной единички в начале решает проблему.
                                Ответить
              • Вроде right-to-left переключатель тоже был в допустимых. Так что как минимум 3 невидимых символа есть.
                Ответить
                • U+034F ͏ COMBINING GRAPHEME JOINER тоже в разрешённом диапазоне, а также U+200D ZERO WIDTH JOINER, U+2060 WORD JOINER, U+FE00 — U+FE0F и U+E0100 — U+E01EF

                  Если этого мало, можно использовать диакритику во славу ZALGO
                  Ответить
                  • И почему все прицепились к невидимым символам. Если хорошо покопаться, можно сделать "Timestamp, header, and payload of message." и "Did writing fail?" валидными идентификаторами

                    Самодокументирующийся код
                    Ответить
                    • > of the message
                      > Did the write fail
                      Ответить
                      • Артикли — моё проклятье. Абсолютно не умею ими пользоваться, в результате инстинктивно пытаюсь их избежать.
                        Ответить
      • вот так это показал вим:
        constexpr auto auto<200b>()
        {
          return 1;
        }
        
        typedef decltype(auto<200b>()) auto<200b><200b>;
        const auto<200b><200b> auto<200b><200b><200b> = auto<200b>();
        
        template <typename auto<200b><200b><200b><200b>>
        constexpr auto auto<200b><200b><200b><200b><200b>() {
            return auto<200b><200b><200b>;
        }
        
        template <typename auto<200b><200b><200b><200b>, typename auto<200b><200b><200b><200b><200b><200b>, typename... auto<200b><200b><200b><200b><200b><200b><200b>>
        constexpr auto auto<200b><200b><200b><200b><200b>() {
            return auto<200b><200b><200b> + auto<200b><200b><200b><200b><200b><auto<200b><200b><200b><200b><200b><200b>, auto<200b><200b><200b><200b><200b><200b><200b>...>();
        }
        
        int main()
        {
          constexpr auto auto<200b><200b><200b><200b><200b><200b><200b> = auto<200b><200b><200b><200b><200b><auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>>();
          constexpr auto auto<200b><200b><200b><200b> = auto<200b><200b><200b><200b><200b><auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>,auto<200b><200b>>();
          return auto<200b><200b><200b><200b><200b><200b><200b>*auto<200b><200b><200b><200b>;
        }
        Ответить
    • лол. в vim это шутка не прошла.

      да и в других жизненных ситуациях (типа xml, html, txt) не раз приходилось регуляркой типа `[^a-zA-Z0-9:@#$%^-]` файло пахать, искать битые буквы кодировок.

      в любом случае - оч красивое говно.

      ЗЫ если gcc попросить, я уверен что добавят быстро варнинг для буков не из <заданных кодировок>.

      ЗЗЫ вот так вим это дело показал: https://hastebin.com/kayicuzuwi.xml (сохранить как хтмл)
      Ответить
    • Блин ГК не пропускает символ говна: &#x1f4a9;

      Application was halted by an exception.
      Debug-mode is off.
      Ответить
      • i am a very baaaad boy
        Ответить
      • &#x1f4a9;
        Ответить
      • Верно. А почему?

        Если в MySQL кодировка utf8 вместо нормальной utf8mb4, то эмодзи (и все коды больше 0xffff) тупо фильтруются. А тут сразу исключение...
        Ответить
        • >в MySQL кодировка utf8 вместо нормальной utf8mb4

          Какие бездонные бездны, а. Всё-таки какое-то мускуль днище.
          Интересно для чего в типе переменной длины сделали ограничение 3 байта utf8 и ввели отдельный 4х байтовый тип? Легаси какое?
          Ответить
          • Ограничения алгоритма построения индекса для поиска по текстовому полю. Сначала решили сэкономить. Потом пришлось разрабатывать тип данных, чтобы он смог без труда вместить новые символы.
            Ответить
            • Так а не проще было выпустить MySql 5.6 Pituh Edition, где бы utf8 растягивался чуть больше.
              Ответить
              • Возможно, испугались проблем с совместимостью.

                MySQL поддерживает горячее (почти горячее — сервер останавливается на пару секунд) обновление ПО (в том числе и на MariaDB или Percona). Нужно гарантировать, что после замены версии сервер заведётся.

                Кроме того, хотелось бы гарантий, что при смене хостинга поведение не изменится. Если приложение требует utf8mb4, то оно должно завестись только на том хостинге, где стоит версия MySQL, поддерживающая этот тип данных. Если же нужно позарез запустить на каком-то устаревшем говне, то нужно явно конвертировать базу.
                Ответить
            • А в чём ограничение заключалось?
              Ответить

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