1. PHP / Говнокод #23383

    +10

    1. 1
    $output = preg_replace("/[0-9]{2}$/", ".$0", $input);

    На входе строка с числом. На выходе должно быть это число, поделенное на 100. Далее, диалог:

    [И]нтересующийся: А чем плохо просто поделить на сто?
    [Г]овнокодер: У числа могут быть нули впереди .
    [И]: Ну оно же приведется к флоату при делении
    [Г]: php > var_dump(‎‎5435353534/100);
    float(‎‎54353535.34)
    [Г]: php > var_dump(‎‎00005435353534/100);
    float(‎‎7459203.48)
    [Г]: результат должен быть как у первого

    Запостил: lex, 05 Октября 2017

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

    • <?php
      [И]: var_dump(intval($lol)/100);
      [Г]: var_dump(eval($lol)/100);
      Ответить
    • Ну зато плавающий питух не клюнет своим округлением. Пришла строка – ушла строка.
      Ответить
      • Он и так не клюнет. Более того, он потом ответ приводит к float.
        Зато тут "клюнет питух", если значение входное меньше 10 и нет лидирующих нулей.
        И самое главное, Говнокодер, видимо, не знает, что литерал числа с лидирующими нулями воспринимается интерпретатором как восьмеричное число, а если же сделать его строкой, то проблем не будет.
        Ответить
    • Честно говоря, 00005435353534 != 5435353534 больше похоже на баг, чем на фичу.
      Захотел выровнять числа в столбик нулями, а тут эта восьмеричная чепуха проявилась. Прочитал документацию, стал использовать левый ноль. Решил распарсить восьмеричное число, а его не каждая функция понимает. Одна парсит как десятичную, другая - как восьмеричную, третья основание системы счисления как параметр просит. И в каждом языке с восьмеричными литералами своё мнение на счёт поведения этих функций.
      Восьмеричные литералы надо от десятичных отпиливать, оставлять универсальные вида 123_8, 123_5 и т.д.
      Ответить
      • # 123_8, 123_5

        О боже, подчёркивания в числах. Кто вообще это придумал, даже в сишарпик это завезли.
        Ответить
        • Интересно. Не знал про такое.
          Я подразумевал нотацию в стиле tex.
          Ответить
          • # Интересно. Не знал про такое.
            # Я подразумевал нотацию в стиле tex.

            Не знаю, что за нотация tex, но в сишарпик вместе с бинарными литералами завезли и подчёркивания для разделение знаков. Кому нужны эти разделители в языке где лимит для числа это 2^64?
            Ответить
            • > Не знаю, что за нотация tex
              Использование "_" для описания нижнего индекса:
              123_8 = 123₈
              123_5 = 123₅

              > Кому нужны эти разделители в языке где лимит для числа это 2^64?
              С одной стороны, уже в миллионах можно начать ошибаться. С другой стороны, из длинных констант с ходу можно представить только скорость света. Остальное - уже данные.
              Ответить
        • В руби еще есть, но там они чисто в качестве синтаксического подсластителя (как и всё в руби).
          1_234_567_8_9_0 == 1234567890
          Ответить
          • В OCaml это тоже есть с незапамятных времён, в Java SE7 тоже добавили. Алсо, тут тоже есть сравнения с другими языками:
            https://www.python.org/dev/peps/pep-0515/
            Ответить
          • В "C++", кстати, не завезли. Зато в "C++""14" теперь можно так:
            cout << 1'234'567'890;

            Джвадцать лет ждал такую фичу![/color]
            Ответить
            • Що це?
              Ответить
              • Разделитель, чтобы было удобнее читать длинные числовые литералы, ведь любой крестовик каждый день пишет двадцатизначные константы.
                http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
                Ответить
            • a >> b vs T<T<x>>
              int x(n) vs int f(n)
              int* x; vs y * x;
              'x' vs 1'000
              Как от этого грамматика C++ ещё не треснула?
              Ответить
              • > грамматика
                Да тут даже лексер простенький справится, не проблема. Увидел первую цифру — парси дальше с кавычками. Труднее только людям и говноподсведке синтаксиса в онлайн говноредакторах (вроде ideone.com), которые даже хаскелевские праймы (x') толком подсветить не могут.
                // проверка хайлатера ГК
                std::cout
                  << 'a'
                  << 1'0'0'0'0'0'0'0'0'9;
                Ответить
                • > проверка хайлатера ГК
                  Лол, от такого подсветка полностью сломалась.
                  Ответить
                  • #include <iostream>
                    int main() {
                    // проверка хайлатера ГК
                    std::cout
                      << 'a'
                      << 1'0'0'0'0'0'0'0'0'9;
                    return 0;
                    }


                    Смотрите, как надо! Хайлайтер не распознал C++, потому что не было фигурных скобок.
                    Ответить
                    • Я вообще этот хайлатер не понимаю. Я пишу ему язык явно [ code = cpp ], но он не подсвечивает. ЧЯДНТ?
                      Ответить
                      • // проверка хайлатера ГК
                        std::cout
                          << 'a'
                          << 1'0'0'0'0'0'0'0'0'9;
                        Ответить
                      • Пишу code=foo — подсвечивает, как положено.

                        Значит, нужно указывать заведомо неправильный язык. Говнокод же.
                        Ответить
                      • Потому что CPP это C PreProcessor
                        Ответить
              • > int x(n) vs int f(n)
                Это что ещё такое?
                Ответить
                • Наверное, вот это:
                  template<typename n>
                  int f(n);
                  template<int n>
                  int x(n);
                  Ответить
                  • Имя типа vs имя переменной - это да.

                    А это компилируется?
                    template<int n>
                    int x(n);

                    И если компилируется (#ВекЖивиВекУчиПлюсы), то что означает?
                    Ответить
                    • Компилируется: https://ideone.com/Hj0XFp.
                      Что означает - хуй его знает. GCC утверждает, что это обычная инициализация объекта (A a(123);). MSVC не соглашается и выводит 0 0.
                      Ответить
                      • А вот так:
                        template<int n>
                        int x = n;
                        
                        int main() {
                        	cout << x<10> << ' ' << x<20> << endl;
                        	cout << &x<10> << ' ' << &x<20> << endl;
                        	return 0;
                        }

                        MSVC всё понимает и выводит 10 20.
                        Ответить
                      • Погуглил. Говорят, шаблонные переменные, Карл. Из C++14.
                        https://isocpp.org/files/papers/N3651.pdf

                        Теперь можно задавать пи (кстати, где он?) любого типа для обобщённых расчётов.

                        Ещё можно вместо скучных int x1, x2, x3, x4; написать один раз template <int n> int x; и использовать x<1>, x<2> и т.д.
                        int x1, x2, x3, x4; // нудно: нужно задавать явно каждую переменную
                        int x[4]; // опасно: нужно явно задавать размер и следить за ним
                        template <int i> int x; // выходов за границы массива не существует
                        // и не засоряется память, если надо только x<1> и x<1000000>

                        Бесконечные разреженные массивы!

                        В случае http://govnokod.ru/23350 вместо
                        double k11, k12, k13, k21, k22, k23, k31, k32, k33, k14, k24, k34;

                        можно задать один раз
                        template <int i> double k;
                        Ответить
                        • Истинный ценитель C++ фантазирует о шаблонных лямбдах:

                          I wonder whether something along these lines would be possible: (assuming availability of template lambdas)
                          void some_func() {
                              template<typename T>
                              std::map<int, T> storage;
                          
                              auto store = []<typename T>(int key, const T& value) { storage<T>[key] = value; };
                          
                              store(0, 2);
                              store(1, "Hello"s);
                              store(2, 0.7);
                          
                              // All three values are stored in a different map, according to their type. 
                          }

                          Now, is this useful?
                          https://stackoverflow.com/a/21162680

                          В политсрачах обычно про подобное говорят "не подавайте им идеи!"
                          Ответить
                          • Впрочем, шаблонные лямбды как шаблонные переменные уже работают, но только вне функций: https://ideone.com/K5hpF5
                            Ответить
                            • Это у тебя не шаблонная лямбда. Тот чувак говорил о фиче, которую возможно добавят в с++20. Там синтаксис ровно такой, как он написал.
                              Ответить
                              • Охренеть. А зачем шаблонные лямбды?
                                Если нужно переиспользовать с разными типами, уже есть неанонимные функции.
                                Если нужен произвольный тип и лямбда используется только там, куда её вставили, то тип задаётся как параметр родительского шаблона и в лямбде фиксирован.
                                Если нужен неизвестный тип, есть auto.
                                Остаётся только ситуация, когда не хочется загромождать просранство имён (на это уже есть разграничение на неймспейсы), и создать шаблонную функцию внутри какой-то функции. Но мне до конца не понятно, насколько это нужная возможность.
                                Ответить
                                • Думаю, комитет добавляет фичи, потому что это весело. Глядишь, в с++30 и auto аргументы у обычных функций сделают, и тогда все будет консистентно.
                                  Ответить
                                  • void foo() = auto; // и пусть конпелятор сам генерит тело функции
                                    Ответить
                                • А, я наверное понял твой вопрос. Шаблонные лямбды нужны не для того, чтобы руками указывать им шаблонный параметр, а чтобы ограничивать типы аргументов:
                                  sort(x.begin(), x.end(), []<class T>(T l, T r) { return l > r; });

                                  Вот эта лямбда отличается от лямбды с auto параметрами тем, что в нее нельзя передать объекты разных типов. А вот зачем это нужно, уже хуй знает.
                                  Ответить
                                  • Тут как раз случай, когда тип элемента x известен или хотя бы выражается:
                                    typedef x::value_type T; // typedef decltype(x[0]) T; для нестандартного контейнера
                                    sort(x.begin(), x.end(), [](T l, T r) { return l > r; });

                                    Хотя, <class T> действительно выглядит короче, не требует явного выражения и не создаёт дополнительных имён.

                                    Возможность использовать decltype при описании аргументов была бы интересней.

                                    P.S. Похоже, кто-то очень хотел скомпилировать []<>(){}
                                    Ответить
                                    • комментарий был изменен

                                      Ну вариант посложнее:
                                      std::variant<int, std::string, double> v1;
                                      std::variant<double, std::function<void()>, std::string> v2;
                                      
                                      bool ravno = std::visit(
                                          boost::hana::overload(
                                              []<class T>(const T &x, const T &y) {
                                                  return x == y;
                                              },
                                              [](const auto &, const auto &) {
                                                  return false;
                                              }
                                          ),
                                          v1,
                                          v2
                                      );

                                      T тут уже взять не откуда. И вроде даже код осмысленный.
                                      Ответить
                                      • Красиво.

                                        Выходит, необходимость шаблонных лямбд можно доказать математически.
                                        Возьмём произвольную шаблонную функцию void f<typename T>(lamba_t g), которая в зависимости от T вычисляет некие T1 и T2 и вызывает g(T1(), T2()). Тогда за счёт тьюринговой полноты шаблонов вычисление T1, T2 (и, соответственно, факта их равенства) до попадания их в g эквивалентно компиляции программы, занимающей в некоторых случаях бесконечное время. Для вычисления T1, T2 в общем случае пришлось бы писать дубликат кода f.
                                        Ответить
                                        • # математически доказать необходимость

                                          Батенька, а вы помните, что для тьюринг-полноты не там много и надо?
                                          Ответить
                                          • Всего-лишь бесконечную ленту?
                                            Ответить
                                            • # бесконечную

                                              if (position == maxPosition) position = 0;
                                              Ответить
                                              • Исправил:
                                                if (position >= maxPosition) position = position % maxPosition;


                                                Подумаешь, затрём часть данных. Зато не сразу заметно, что лента конечная.
                                                Ответить
                                          • > не там много и надо?
                                            ну вот и автору программы не так много и надо, чтобы нашаблонить такое, что проще запустить такой же код и посмотреть, что он выдаст, чем пытаться вычислить самому и тем более записать в одну строку
                                            Ответить
                                        • # математически доказать необходимость

                                          Батенька, а вы помните, что в математике и типов то совсем нет?
                                          Ответить
                                          • Давайте не будить wvxvw, а то он уже скоро придёт и расскажет всё про типы, где они есть и почему в C++ и Haskell - не типы, а сплошное говно.
                                            Типы можно отобразить на множество натуральных чисел. В программах, имеющих конечную длину и конечное время выполнения нет нужды использовать континуум типов.
                                            Так мы перешли от типов к числам, которые математика точно изучает. Утверждения про вычисления над типами перепишем в терминах чисел - и ничего не изменится.
                                            Ответить
                                          • Воеводский рыдает в гробу.
                                            Ответить
                                            • > Воеводский

                                              Кстати, от чего он умер, так и не сказали? Кто теперь HoTT продвигать будет?
                                              Ответить
                          • Там не нужны шаблонные лямбды.
                            [](int k, auto x) {
                                storage<decltype(x)>[k] = x;
                            }

                            Должно работать уже сейчас.
                            Ответить
                            • # не нужны шаблонные лямбды

                              Батенька, а вы знаете, что вы только что своим примером сделали ненужными шаблонные лямбды?
                              Ответить
                        • Это просто праздник какой-то!
                          template<unsigned n>
                          constexpr int fib = fib<n - 1> + fib<n - 2>;
                          template<>
                          constexpr int fib<0> = 1;
                          template<>
                          constexpr int fib<1> = 1;
                          
                          int main() {
                              cout << fib<2> << ' ' << fib<7> << ' ' << fib<20> << endl; // 2 21 10946
                              return 0;
                          }
                          Ответить
                • Инициализация переменной vs объявление функции.
                  int n = 4;
                  int x(n);
                  
                  std::cout << x + 5;
                  ///// vs /////
                  struct n {};
                  int f(n);
                  
                  int f(n x) {
                    ...
                  }
                  Ответить
                  • Все ведь давно знают, что такие языки как Си, C++ создавались только для того, что бы потроллить разработчика
                    Ответить
                    • Разработчики сами напросились. Говорят, "Мы не лингвисты, не обязаны знать досконально родной язык, мы будем писать как хотим". А тут им хренак - и точку с запятой ставить надо, иначе не компилится. Причём где-то после фигурной скобки она нужна, где-то нет. Не хотел согласовывать деепричастный оборот в русском языке - пердолься с const/mutable и расставляй касты.
                      Ответить
                      • # говорят

                        Факты?
                        Ответить
                        • Практика показывает. Почитайте комментарии Василия, Кегдана, некоторые статьи на хабре.
                          Может, на ГК кто-то из них и в комментариях говорил, что будут писать как хотят (законом не запрещено, пишут с ошибками где хотят)
                          Ответить
                          • Вон целое обсуждение на ГК http://govnokod.ru/14475#comment215318
                            Кегдан намекает.

                            __________________________
                            И как довесок - пара интересных обсуждений про чтение и русский язык:
                            http://govnokod.ru/18026#comment283275
                            http://govnokod.ru/18712#comment298106
                            Не факты про хейтерство, но про программистские проблемы.

                            Самое интересное:
                            defecate-plusplus 15.09.2015 10:23:
                            моя жена прочитала, наверное, в несколько раз больше книг, чем я.
                            однако, с грамотностью у неё проблемы.
                            поначалу грешил на то, что в детсаду их научили скорочтению на свою и её голову.
                            но теперь склоняюсь к версии, что просто зрение плохое виновато - сколько ни читай, мозг сам будет дорисовывать слова, и правильное написание не прожжётся навечно в постоянную память.
                            Ответить
                          • # Кегги, Вася, кабра

                            Рунет повлиял на 70-ые годы в забугорье?
                            Ответить
                            • Человек — оторванный в область языков — дает свои колебания на все языки. А Хабр дает колебания только на крестушню на свою. Рунет дал колебания на всё пространство-время. Рунет плавал ярче, чем сишка.
                              Ответить
                              • Вот мы берём крестушиный полуостров, накручиваем на него констэкспры... Разве будет из этого нормальный язык вырастать?
                                Ответить
                                • По призванию своему программист. В народе метушня.
                                  Ответить
                                  • Кодогенерить было наслаждением. Какое-то особое наслаждение видеть, как макросы пожирают вещи, как они чернеют и меняются. Медный наконечник препроцессора зажат в кулаках, громадный питон изрыгает на код ядовитую струю метушни, кровь стучит в висках, а руки кажутся руками диковинного дирижера, исполняющего симфонию огня и метушения.
                                    Ответить
                                    • Я так посмотрю, вореционный синтез не стоит на месте, но семимильными шагами движется к самопознанию. Браво!
                                      Ответить
      • > восьмеричные литералы
        Они нахуя вообще в языках? Они кому-нибудь когда-нибудь пригодились?
        Ответить
        • Права доступа у файлов записывать.
          Ответить
          • # Права доступа

            Толи дело Windows...
            Ответить
            • Прыщебляди соснули! Смотрите, как в Windows всё просто:
              sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
              sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)

              И ни с какими восьмеричными числами связываться не нужно!

              Это же очевидно, что могут означать D:(A;;RPWPDT;;;S-1-5-21-3992622163-2725220152-438995547-4172)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCD CLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWL OCR
              RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;C CDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
              или D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLC SWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
              RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;C CDCLCSWRPWPDTLOCRSDRCWDWO;;;WD).
              Ответить
              • Это говноязык называется SDDL, мануалов по нему мало (но есть https://web.archive.org/web/20150810083345/http://networkadminkb.com/KB/a152/how-to-read-a-sddl-string.aspx) и он не был изначально расчитан на то, что его будет кто-то юзать за пределами MS.

                Надо делать всё через UI, а если ты решил спуститься в такие низы то сам себе виноват(Как всегда у винды)

                В повершел завезли кмдлет Get-Acl. Он няшен, но не умеет DACLы сервисов.

                Но народ пытается хитрить
                https://rohnspowershellblog.wordpress.com/2013/03/19/viewing-service-acls/


                зы: справедилвость ради: ACLы сложнее никсовых "owner-group-everyone" и потому язык сложнее
                Ответить

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