1. C# / Говнокод #25527

    0

    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
    static class MathParser
    {
        static double getFunc(char op, double a, double b)
        {
            switch (op)
            {
                case '+': return a + b;   case '-': return a - b;
                case '*': return a * b;   case '/': return a / b;   case '%': return a % b;
                case '^': return Pow(a, b);   default: return double.NaN;
            }       
        }
        static char[][] ops = { new char[] { '+', '-' }, new char[] { '*', '/', '%' }, new char[] { '^' } };
        public static double Eval(string str) => Eval(ref str, 0, str.Length);
        private static double Eval(ref string str, int z, int l, int i = 0)
        {
            for (; i < 3; i++)
                for (int v = l - 1; v >= z; v--)
                    for (int j = ops[i].Length - 1; j >= 0; j--)
                        if (str[v] == ops[i][j])
                            return getFunc(str[v], 
                                Eval(ref str, z, v, i),
                                Eval(ref str, v + 1, l, i + 1));
            return double.Parse(str.Substring(z, l - z));
        }
    }

    Какой-то укуренный калькулятор получился...
    MathParser.Eval("3,1346") => 3.1346
    MathParser.Eval("3+2*5") => 13
    MathParser.Eval("2^5-1") => 31
    MathParser.Eval("1/2^3") => 0.125
    MathParser.Eval("2^2^2^2") => 256
    MathParser.Eval("7,2%3") => 1.2

    Запостил: groser, 09 Апреля 2019

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

    • 6546
      Ответить
    • PZX54(P^)
      Ответить
    • В чём смысл стринги по ссылке передавать?
      Ответить
      • Чтобы можно было её испортить из функции.
        Ответить
        • Так он её только читает.
          Ответить
          • А это уже деталь конкретной реализации. Сегодня читает, а завтра насрёт. Я бы не стал на это полагаться.
            Ответить
            • Вдруг мы решим добавить в калькулятор поддержку самомодифицирующегося кода.
              Ответить
        • А еще можно объекты портить, прямо внутри конструктора!
          Пользуйтесь константными констукторами.
          Ответить
      • В сисярпе стринги тоже иммутабельные? Какой онскилл )))
        Ответить
        • Проще сказать где они мутабельны - а хуй его знает, где.
          Везде идёт подмена блока.
          Ответить
          • Именно поэтому я за «C».
            Ответить
            • в си литералы немууууууутабельны
              Ответить
              • Речь о строках. А они могут быть const и не-const, литералы всегда const.
                Ответить
              • В старых gcc можно было включить мутабельные литералы. Весь ужас в том, что иногда это реально юзали...
                Ответить
                • В Lazarus можно даже константы менять, не говоря уже о литералах.
                  Но ничего, с выходом бесплатной делфи этому уёбищё настал конец. Я верю в это.
                  Ответить
                • И как это выглядело в коде?
                  Ответить
                  • В том говне, которое мне попадалось, тупо делали strtok() на литерале...
                    Ответить
          • QString же. Там можно вызвать data() и срать в память.
            Ответить
            • Но буфер при этом скопируется и кроме тебя никто эти изменения не увидит. Там же cow.
              Ответить
              • Корова не нужна.
                Ответить
                • Но в тот же миг слоны и бегемоты
                  Вдруг замычали тоже отчего-то,
                  За ними львы, жирафы, кашалоты,
                  Орлы, гориллы, крокодилы — все твердили «Му»!
                  Ответить
              • Ну, естественно. Изменения увидит только тот объект класса QString, от которого мы вызвали data. Если у нас void foo(QString arg), то с arg мы можем делать что угодно.
                Ответить
            • Про std::string даже не вспомнили?
              Ответить
              • А зачем про это говно вспоминать?
                Ответить
                • Чем QString лучше?
                  Ответить
                  • Чем std::string Удобный API, в котором есть все основные операции, а также низкоуровневые функции типа создания из указателя. Форматирование. Поддержка unicode. Thread-safe implicit sharing with copy-on-write.
                    Ответить
                  • Как массив байтиков std::string нормально себя показывает. Но класс строки, в котором нет даже ёбанных toLower()/toUpper() — это какой-то… багор.
                    Ответить
                    • Имхо, строка и должна быть просто контейнером символов. А все эти toLower(), join() и прочая поебень - внешними функциями.

                      Иначе строка превращается в какой-то ебучий god object.
                      Ответить
                      • Возможно, но всё равно же должен быть какой-то упрощённый интерфейс для часто используемых операций. Вот эти вот «std::transform(str.begin(), str.end(), [](unsigned char c) { return ::tolower(c); })» — это ж пиздец ёбанный!
                        Ответить
                        • И ещё я забыл указать выходной итератор, блядь.

                          >>> str = 'HeLLo'
                          >>> str.lower()
                          'hello'
                          Ответить
                        • Я себе это представляю как std::toLower(str).
                          Ответить
                          • Хотя бы так. Но Комитет, видимо, очень не любит функции, принимающие ссылки на контейнеры — слишком невербозно для крестов. Возможно, через десяток лет доведут до ума эти ваши концепты и ренджи, тогда-то и заживём!
                            Ответить
                        • > str.begin()
                          std::begin(str) же! Чтобы для массивов тоже работало.
                          Ответить
                    • Ты вроде сам кидал примеры, из-за которых нельзя сделать правильные toLower/toUpper
                      Ответить
                      • Это в крестах нельзя. В нормальных языках — можно.
                        Ответить
                        • В этих ваших ёбаных бустах и кутэ можно, а в стандарте нельзя.
                          Ответить
                      • во всем мире нижни регистр это lower case

                        и только в руби у нас
                        downcase
                        Ответить
                        • К слову “up” антоним “down”.
                          К слову “low” антоним “high”.

                          С точки зрения Руби всё правильно (принцип наименьшей неожиданности или как там).
                          Ответить
                          • Всё верно.
                            Руби очень сильно отличается от всех остальных языков.
                            Ответить
                            • Руби говно!
                              Ответить
                              • Звучит как приказ.
                                Ответить
                              • Нет, руби это язык романтиков и дэнди
                                Питон язык скучных зануд
                                Пых язык гопников и малолеток
                                Джавск язык глупых хипстреов, не умеющих в CS
                                Ответить
                                • >и дэнди
                                  и сеги

                                  > глупых хипстреов, не умеющих в CS
                                  в сишарп?
                                  Ответить
                          • А антоним к слову “upper” — “downer”?
                            Ответить
                            • Antonyms for upper
                              
                              low
                              unimportant
                              below
                              inferior
                              junior
                              lower
                              under


                              Какая неконсистентность (((
                              Ответить
          • не знаю
            Ответить
          • Тип string в «Трубопаскакале» был мутабельным: заранее выделялось 256 байт (один под длину, 255 под символы) или сколько укажешь (если в квадратных скобочках указываешь максимальную длину).

            Поскольку длина ограничена, реаллокация не нужна.

            Правда, толку от таких коротеньких строк немного...
            Ответить
            • А ещё они всегда ограничивались CRLF, и чтобы хранить многострочные строки использовали массивы строк. Именно поэтому я за array of char и pchar.
              Ответить
              • Схуяли? Броландстроки интересны тем, что они binary safe, никаких магических значений.
                Ответить
              • Не было такого. В борландовских строках можно было хранить произвольный массив байтиков, включая нулевые байты.

                Это при чтении из файловой переменной типа Text файл разбивался на строки по CRLF, но так и было задумано. Для произвольных файлов были типы file и file of byte.
                Ответить
                • P.S. Типичный пример строковой константы:
                  const stihi: string = 'Какой хардкор)))'#13#10'Какой багор)))';


                  #13#10 вне апострофов –— это и есть вставка CRLF.
                  Ответить
                • >включая нулевые байты.
                  потому что там в носу байт длины?
                  Ответить
                  • Именно так. Длина идёт отдельным полем, поэтому нам не нужны специальные значения символов.
                    Ответить
          • в руби


            за это надо платить понятием символ
            Ответить
            • А в 'J' можно менять элементы массива, в том числе строки:
              NB. всегда будет создаваться копия:
                 s =: 'alala'
                 'ooo' (0 2 4)} s
              ololo
                 NB. но если результату даётся то же имя, модификация будет инплэйс:
                 ]s =: 'zz' (1 3)} s
              azaza
              Ответить
      • В делфях можно так: function lol(const s:string);

        Это будет означать передачу по указателю. Счётчик ссылок при этом не работает и память не выделяется. Короче, чисто для оптимизации.
        Ответить
        • Вообще для любых переменных var и const означают передачу по ссылке без копирования. «По ссылке» –— это такой синтаксический сахар: на самом деле передаётся указатель, но разыменовывать его не нужно. Разница между var и const в том, что в случае const компилятор проверяет, что в теле функции отсутствуют попытки изменить значение переменной.

          Для параметров без var и const вызывается «копирующий конструктор»: скалярные значения пушатся в стек (или передаются через регистры в случае fastcall), для структурированных же в стеке создаётся копия, а потом отправляется указатель на копию.

          С const всё ясно: поскольку запретили изменять, то и указатель не будет изменяться.

          Интереснее, что происходит со строками в случае var и в случае передачи по значению.
          Ответить
          • К сожалению, я не знаю, что происходит под капотом на уровне асма, но знаю, что при обращении к строке по значению (
            procedure lol(s:string)
            ), будет создана ее копия, с помощью неявно вызываемой UniqueString. Если же попытаться обратиться к этой строке по указателю, ее память легко можно изменять - и похуй, ссылка ли там, const или var. Компилятор полагает, раз программист юзает указатель - он знает, чтоон делает.
            Ответить
            • Совсем по-другому обстоят дела с литералами; линкер помещает их в область памяти, доступную только для чтения. Любые попытки изменить ее приведут к краху. Поэтому, UniqueString нужно вызывать уже явно.
              Ответить
              • Какое же всё-таки ональное говно, эти Ваши строки.
                Оставили бы просто PChar - и горя б не знали.
                Ответить
                • PChar имеет фатальные недостатки:
                  1. В нём нельзя хранить байт с кодом 0 (ноль).
                  2. Как следствие, в нём нельзя хранить строки в кодировке UCS-2 (хотя это не проблема, ведь существует PWideChar).
                  3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.

                  Как следствие возможны утечки памяти, если случайно в строку поместить байт с кодом 0. Значит, при получении данных из сторонних источников нужно проверять содержимое строки.
                  Ответить
                  • @1. В нём нельзя хранить байт с кодом 0 (ноль).
                    Пиздец, какой недостаток, особенно для делфи под Windows! О-о-о! Всё, выбрасываем делфи.

                    @2
                    ...

                    @3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.

                    Длину можно хранить по отрицательному смещению. см.
                    function StrAlloc(Size: Cardinal): PChar;
                    begin
                      Inc(Size, SizeOf(Cardinal));
                      GetMem(Result, Size);
                      Cardinal(Pointer(Result)^) := Size;
                      Inc(Result, SizeOf(Cardinal));
                    end;


                    Года два-три назад я долго вникал в смысл этого черезжопия, пока не додуплил, что на выходе будет совместимый PChar, и для определения длины необязательно искать нулевой символ.
                    Ответить
                    • >> Пиздец, какой недостаток, особенно для делфи под Windows! О-о-о! Всё, выбрасываем делфи.

                      Зря смеёшься. У некоторых программ были уязвимости, связанные с особой трактовкой байта, равного нулю.
                      Ответить
                  • В классическом пускале длина строки хранилась впервом байте ограничвая длину строки до 256 символов и превращая операцию узнавания дионы из O(N) в O(1).

                    Это был важный пук в холиваре паскалистов и сишников сереидны 90-х.


                    Декартовы точки,
                    Паскалевы строчки,
                    Идеи обоих Кюри...
                    Ответить
                    • Сейчас то же самое. Ничего не изменилось.
                      Ответить
                      • Вроде, до двух байт увеличили?
                        Ответить
                        • Старую строку с ограничением длины до 255 символов (256-1, потому что диапазон значений беззнакового байта 0..255) ещё в старых дельфях переименовали в ShortString.

                          «Длинные строки» стали называться AnsiString и WideString (разница между AnsiString и WideString в логике работы функций стандартной библиотеки, выделяющих подстроку по позиции символа, а не байта). У них индикатор длины вроде бы не два байта, а четыре, т. е. длина строки ограничена четырьмя гигами. Надо добыть исходники SYSTEM.PAS и посмотреть.
                          Ответить
                          • >потому что диапазон значений беззнакового байта 0..255
                            лол, бывает строка длиной 0 символов?

                            погодите-ка... так это же 0!
                            Ответить
                            • В «Паскале» бывают строки длиной 0 символов. Эта строка в памяти занимает один байт: байт длины, в котором хранится 0.

                              В «Си» аналогичная ситуация: там тоже пустая строка занимает один байт: в нём хранится терминатор, по нелепому совпадению тоже равный 0.
                              Ответить
                              • Какой холивар )))
                                Им бы справку читать, а не выпендриваться.
                                Ответить
                              • То-есть у "си" и "паскаля" пустая строка кодируется одинаково?

                                В чем тогда разница между языками?
                                Ответить
                              • Лишнехромосомный инканус даже старое говно не может пережевывать нормально. String[0] - 5уптах еггог
                                Ответить
                                • Недохромосомный Сёма не знает, чего хочет. Пустые строки в Паскале бывают:
                                  const s: string = '';


                                  Возможно, тип string[0] объявить нельзя, но мы об этом и не говорили. Мне такой тип данных ни разу не понадобился.

                                  Вот пустые записи (структуры) обычное дело, когда нужно застолбить указатель на конец чего-то крупного:
                                  type nemyx = record
                                      field1, field2 : Integer;
                                      pointer_to_end: record end;
                                  en;
                                  Ответить
                                  • А зачем инканусу делпхи?
                                    Ответить
                                  • >Недохромосомный
                                    попытка перефорса. Русьня, плес.
                                    Ответить
                                  • ахаха, это в сисичке я такое встречал
                                    struct petuh { 
                                      char tail[0]
                                    }


                                    а на самом деле tail там указателем на чото может быть
                                    Ответить
                                  • Пид­орашка снова серет под себя, минимальная пассалевская строка это
                                    { хуй знает кому такое нужно }
                                    type NullableChar = ShortString[1];
                                    , а это значит, что
                                    SizeOf(NullableChar) = 2

                                    Лучше бы переживал за свой дегенеративный подвид, бомбимых пенсиями хунтой dumbass people.
                                    Ответить
                          • Посмотрел. У AnsiString, WideString байт длины занимает ровно 4 байта и в 32-битных дельфях, и в 64-битных. Поскольку длина беззнаковая, в таких строках можно хранить 4 гига символов.
                            Ответить
                          • WideString - это обертка над стандартным BStr, AnsiString - чисто делфёвая приблуда. В более новых делфях ввели новый тип по умолчанию - UnicodeString, отвязанный от BStr.
                            Ответить
                            • Между UnicodeString и WideString очень тонкая разница (у UnicodeString отсутствуют некоторые специальные поля по отрицательным смещениям).
                              Ответить
                            • Гляжу, зоосад вы там развели по-круче крестушков
                              Ответить
                              • Это еще что, они даже красивую концепцию fundamental vs. generic types проебали и вместо этого развели зао парк интов.
                                Ответить
                    • Пережевывание старого говна
                      Ответить
          • ты так-то описял семантику крестов.Уверен что в поцкале так же?
            Ответить
            • Я описал, как было сделано в Turbo Pascal и в Delphi. Это всё проверяется: пишешь небольшую функцию, компилируешь и смотришь результат дизассемблирования.
              Ответить
              • Ахах, контракты для самых маленьких да визуальненьких
                • пишешь небольшую функцию
                • компилируешь
                • смотришь результат дизассемблирования
                Ответить
    • Блять, как сложно... Именно поэтому я за алгоритм рекурсивного спуска.
      Ответить
    • Что вы тут обсуждаете, гыгыки ебучие? паскалевские/сишные строки в деталях? Блядь, да кого это ебет вообще? Хоть копейку денег этим знанием заработаешь?
      Ответить
      • Вообще-то я благодаря этому ем свой хлеб.
        Когда в конце 5 курса медынститута я начал учить делфи ради забавы, то и представить не мог, что мне придется впахивать сисадминцем в какой-то гнилой больнице.

        Ответить
        • Нормальную работу найти не пробовал?
          Ответить
          • Ну что значит - "нормальную"? В сосетии страшная безработица, устроиться можно лишь по знакомству либо за взятку. С приходом к власти гамсика-Битарова, в республику хлынули толпы искателей, которые заняли все рабочие места. Куда ни глянь - всюду одни гамсики.

            Самое смешное, что зав. главного врача в нашей гнилушке- тоже гамсик. Не зная моего бравого прошлого, он пытался брызгать на меня слюной как на простого опа, а когда получил отповедь - заткнулся, спеси поубавилось.
            Ответить
            • Нормальную - где платят нормально. Или у тебя частная больничка?
              Уверен, что даже в сосетии есть IT-конторы. А если и нет, то съебаться может быть не поздно.
              Ответить
              • Лол, разумеется за программированеи на дельфи платят не очень хорошо, а если вдруг и платят нормально, то уж точно не в Алании
                Ответить
                • Я на ней пишу всевозможные парсеры и утилиты для автоматизации.
                  Ответить
                  • По работе?
                    Ответить
                    • Ага )
                      Ответить
                      • Парсеры? По работе?
                        Ответить
                        • Да, именно.
                          Ответить
                          • Интересно, и зачем же?
                            Ответить
                            • Это необходимо по роду деятельности. Мне удалось повысить продуктивность труда в нашем отделе раз в 5. Но этим неблагодарным ебанашкам всё побоку.
                              Ответить
                              • Бля, конкретно зачем?
                                Ответить
                                • Я не могу пиздеть тут слишком много, это угрожает моей онанимности.
                                  Ответить
                              • Ну так составь резюме и напиши там про это. Хуже когда ты делаешь, не приносящую никому пользу, хуйню, и не гордишься результатами своей работы.
                                Ответить
                                • Хуже когда ты делаешь не приносящую никому пользу хуйню и гордишься результатами своей работы.
                                  Ответить
                                  • Я сру на говнокодике 24x7 вот уже много лет. Не знаю насколько это полезная хуйня, но я этим очень горжусь
                                    Ответить
                • Не обязательно вообще программировать. Можно быть менеджером.
                  Да и какая разница на чём программировать. Если умеешь программировать хоть на чём-то, то легко переучиться на любой язык.
                  Ответить
                  • Менеджером по клинингу
                    Ответить
                  • >Да и какая разница на чём программировать. Если умеешь программировать хоть на чём-то, то легко переучиться на любой язык.


                    Ну такое;)

                    Если ты действительно хороший программист то скорее всего да, если ты макакий , то может быть и нет
                    Ответить
                  • Под программированием наверно имеется в виду software engineering?
                    Ответить
                    • Нет, имеется ввиду нейро-линвистическое программирование конечно
                      Ответить
                      • Ну просто за умение хуярить код который как-то работает тебе много денег не дадут.
                        Ответить
                        • За умение хуярить код, который как-то работает, платят какое-то количество денег кому-то
                          Ответить
                          • Ну я хз как у вас там в рашке, может у вас за любые потуги прогать платят столько что на жизнь хватает.
                            Ответить
              • У меня нет диплома прогера.
                Ответить
                • Открою для тебя страшную тайну. Диплом никого не ебёт, разве что только в гос. конторах.
                  Ответить
            • Там намного хуёвее чем в рус нявой рашке?
              Ответить
        • >Вообще-то я благодаря этому ем свой хлеб.
          сладкий?
          Ответить
          • для меня - слаще мёда.
            Ответить
            • https://coubsecure-s.akamaihd.net/get/b13/p/coub/simple/cw_timeline_pic/a8807151a39/8a04d79a0276ca51b3d42/ios_large_1433008678_image.jpg
              Ответить
        • Стертор, сисадмином в больнице в нищей части рашки - это не уровень сайта программистов, даже такого как этот.
          Ответить
          • Сёма вообще безработный. Лучше хоть так.
            Ответить
            • Сёма и то больше получает. Так что не лучше.
              Ответить
              • У стертора спонсора нету, он сам спонсирует семилетних мальчиков
                Ответить
              • И экономит на лампочках? Больше получать != лучше жить.
                Ответить
                • А Сёма на лампочках экономит?
                  Ответить
                  • Его сильно волнует, сколько ватт потребляет прибор. Значит, ему приходится экономить на лепестричестве, смотреть телевизор при свечке.
                    Ответить
                    • >смотреть телевизор при свечке.
                      Это ты сильно пошутил, руснепидор. Светодиодка на 10 ватт светит так, что глаза болят. А у вас в спидозной лепестричесвто можно не экономить? Ну хоть где-то вперде.
                      Ответить
                      • Да это вообще хуйня какая-то для тупой ваты. Дешевое электричество в сраной рашке - такой же миф, как и низкие налоги. До обвала ру бля ру­сня так вообще платила на 30% дороже, чем в континентальных штатах.
                        Ответить
                        • Я нейбу сколько в штатах платят, но гермашка тут вперде.
                          Ответить
                          • У ру­сни тут выгодное положение - электромобили запрещены, климат-контроля нет, стирают вручную, сушками не пользуются, даже теплый пол не делают себе. Ты обрати внимание, каких потребителей перечислил пид­орашка, сидящий под лампочкой ильича.
                            Ответить
                            • Я из этого тоже ничем не пользуюсь. Теплый пол это что? Электрообогрев?
                              Тем не менее, я более чем уверен, что на немецком/английском ты не нагуглишь, как ремонтировать светодиодки, перепаивая диоды. А вот на русьнявом - вполне.
                              Ответить
                              • >> Теплый пол это что?

                                Ты поди ещё не знаешь, что такое евроремонт?
                                Ответить
                    • А ты уже перепаял сгоревшие светодиодики на светодиодке?
                      Ответить
          • Ну ебать. По крайней мере я не книжник и реализую накопленное говно на практике.
            Ответить
            • >книжник
              Это те люди, которые обсуждают выше строки?
              Ответить
              • Это кто не читает умных книжек, а берет и хуярит задачу.
                Ответить
                • А потом думает "ёб твою мать, я в своей проге уже нихуя понять не могу"?
                  Ответить
                  • Ну если книжки по проектированию и дизайну, то да. А если "PHP за 21 день" или "Глубокое обучение на Python", но нахуй они нужны? Просто берёшь и делаешь, что понадобится - изучаешь по мере надобности.
                    Ответить
                    • А потом не понимаешь как работают циклы или еще какая-то базовая хуйня. Что делать? идти в инет спрашивать? Там такие как ты нахуй не нужны.
                      Ответить
                    • потом у тебя протекает абстрация, и ты такой: "оой, тут что-то упало в нативном коде, я этово не нипонимаю, пусть кто-то другой починит"
                      Ответить
                      • В чьем нативном коде? Интерпретатора? Ну так это пыхопроблемки :)
                        Ответить
                        • ну так тыж сам написал про PHP и Python
                          Ответить
                          • Это не я. И в питоне изкаробочный функционал у меня еще ни разу не сегфолтил.
                            Ответить
                • >Это кто не читает умных книжек, а берет и хуярит задачу.
                  И потом еще ходит на ebanoe.it ныть, как его заебали галеры?
                  Ответить
                  • На ебаном ноют хохлы, у которых работа на аутсорс. У вас в спидозной есть понятие бадишоп, не обязательно только у программистов?
                    Ответить
                    • Не пойму, почему ебаное ит популярнее говнокода? На нём пишут реже даже. Это всё из-за стертора?
                      Ответить
                      • Я там не сижу и не собираюсь. Реально никчемный сайт.
                        Ты никак не можешь понять, что вреда от тебя ничуть не меньше, ноешь, флудишь, срешь где попало. Мудак ты.
                        Ответить
            • А я фарисей
              Ответить
      • ага, давайте лучше обсуждать алиэкспресс
        Ответить
        • Да, давайте обсуждать то, как железка, купленная на «Алиэкспрессе», после перепрошивки по совету с «4PDA» в умелых руках превращается в кирпич.
          Ответить
        • И то лучше.
          Ответить
    • ахахахахаха!!!

      Another thing that will force the hypervisor on is Virtualization-Based Security, which goes by the acronym VBS. This is confusing because to most people VBS stands for VBScript.
      Ответить

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