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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    DeliveryTruck t when t.GrossWeightClass switch
    {
        < 3000 => 10.00m - 2.00m,
        >= 3000 and <= 5000 => 10.00m,
        > 5000 => 10.00m + 5.00m,
    }

    С каждой новой версией C# всё меньше похож на C# и всё больше на Perl.

    Запостил: Vindicar, 14 Ноября 2020

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

    • ну тут примерно понятно, что написано

      если гроссвейткалсс меньше 3к, то 8м
      если больше или равен, но меньше пяти ка, то 10
      если больше пяти, то 15
      Ответить
      • Можно было понятнее:
        < 3000 =>
        <= 5000 =>
        _ =>

        Ну и оттабать всё
        Ответить
        • Они всегда сверху вниз исполняются?
          Ответить
          • кто они? веточки оператора свитч?))
            Ответить
            • Да.
              Ответить
              • https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/switch-expression

                The result of the switch expression is the value of the expression of the first switch expression arm whose pattern matches the range expression and whose case guard, if present, evaluates to true.
                Ответить
          • Почти уверен что в байткоде будет всё тот же if/elseif/else
            Ответить
        • Здесь нужен Тарас.
          < 3000  =>
          <= 5000 =>
          _       =>
          Ответить
          • Запатентованное тарасоформатирование.
            Ответить
          • а вот кстати перепиши на питон без унылости

            на руби и на перле и даже на котлине такое пишется легко, теперь вот и на шарпе, а на питоне кажется, что будет тупая цепочка унылых ифелозов
            Ответить
            • Переписал на питон, никаких иф-элсе-элиф:

              x = 3999
              print([8000, 10000, 15000][(x < 3000) + (3000 <= x <= 5000)*2 + (x > 5000)*3 - 1])
              Ответить
              • божественный код, всегда так и пишите, сразу заберут на олимпиаду вконтакте
                Ответить
                • А ещё вот так можно:

                  x = 48990
                  c = (lambda x: x < 3000, lambda x: 3000 <= x <= 5000, lambda x: x > 5000)
                  print([i for i, k in zip([8000, 10000, 15000], c) if k(x)][0])


                  Получается такой вот своеобразный свищь из условий и результатов.
                  Ответить
                  • По-моему zip тут не в тему. Ты к каждому числу одно условие применил, не?
                    Ответить
                    • А почему? По моему всё логично.

                      Вот у меня массив условий и массив соответствующих результатов. Я итерируюсь по условиям и, если условие выполняется, оставляю результат, чтобы удобнее было – зипаю два этих массива. Правда тут у меня отвратительный скриптушной fallthrough-switch, поэтому в конце там [0], на всякий случай.

                      Можно было бы и map'ом это сделать, но мне zip больше понравился. Или ты про то, что можно было просто по индексу проитертроваться сразу по джвум массивам?
                      Ответить
                      • А тьфу, я не проснулся еще.
                        Ответить
                      • Кстати массив туплов наверное нагляднее будет. Лямбды будут рядом со значениями.
                        Ответить
                        • С утилизацией компьютерных мощностей:
                          let Switch = (options, val) => {
                            for (let condition in options)
                              if ((new Function('x', 'return ' + condition
                                .replace(/or/g, '||x ')
                                .replace(/and/g, '&&x ')
                                .replace(/^/, 'x ')))(val))
                                  return options[condition];
                          };
                          
                          let n = Switch({
                            '< 3000': 8e3,
                            '>= 3000 and <= 5000': 10e3,
                            '> 5000': 15e3,
                          }, 123);
                          Ответить
              • printf("%d\n", (int[]){8000, 10000, 15000}[(x >= 3000) + (x > 5000)]);
                Ответить
                • printf("%d\n", 8000 + (x >= 3000) * 2000 + (x > 5000) * 5000);
                  Ответить
                  • вореционируем кобенные
                    printf("%d\n", 8000 ^ (x >= 3000) * 14416 ^ (x > 5000) * 7560);
                    Ответить
                  • https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html
                    switch(x)
                    {
                      case INT_MIN ... 2999: return 8000;
                      case 3000 ... 5000: return 10000;
                      default: return 15000;
                    }


                    Поэтому я за гнуси
                    Ответить
                    • Ну кстати даже годный код генерит, а не табличку с тысячей элементов.
                      Ответить
                    • ну вот видите, си более читаемый и удобный язык, чем питон
                      Ответить
                      • А теперь для разминки мозга давайте переведём эту задачу на SQL.
                        Ответить
                        • да, там еще проще)
                          Ответить
                          • Ну если полный диапазон - да. А вот если там только левая половина, как в оптимизированном варианте от /u/nihau, то некрасивая фигня получается.
                            Ответить
                            • Тогда вам сюда https://www.postgresql.org/docs/12/rangetypes.html
                              Ответить
                              • кстати есть такой орм для бедных для котла
                                jooq
                                вот эта говнина не умеет range types :(
                                Ответить
                                • Так она же наверное пытается быть максимально датабейз агностик, и не умеет специфичные вещи?

                                  Вот например джанговый орм имеет специальный contrib модуль для поддержки ренджей именно в постгре
                                  Ответить
                                  • > датабейз агностик

                                    Кто-то ещё верит в сказки про переход с одной субд на другую?
                                    Ответить
                                    • скорее в перевод программиста с проекта на mysql на проект на postgres:)

                                      На самом деле джаногвские реюзабл аппликешйегны могут быть db agnostic, но конкретный проект, разумеется, нет.
                                      Ответить
                                  • > Так она же наверное пытается быть максимально датабейз агностик, и не умеет специфичные вещи?
                                    нет, она просто (пока) не осилила некоторые специфичные вещи
                                    такие как юзер домейны и вот некоторые комплексные типы как рейндж

                                    ну и посмотрев как выглядит код, который пишут бекендоёбы, я считаю, что это последний проект, где применялся йоок
                                    Ответить
                      • > ну вот видите, си более читаемый и удобный язык, чем питон

                        А можно ли на компилтайм-крестометушне запилить аналог этого case ranges из GCC, и желательно чтоб это было читабельно (хотя тут я наверно слишком много прошу)?

                        Может в BOOST что-то подобное есть?
                        Ответить
                        • Ну можно что-то в духе:
                          auto res = Switch(val,
                              { _1 < 3000, 8000 },
                              { _1 < 5000, 10000 },
                              { 15000 }
                          );
                          Где _1 из бюст лямбды. Но я что-то в выводе типов запутался и забил.
                          Ответить
                        • А полный эквивалент не получится, return из вызывающей функции не наметушить.
                          Ответить
                          • Т.е. крестостандартизаторы понапридумывали столько хуйни для метапрограммирования, выпустили кучу своих говностандартов с констэкспрами, лямбдами-хуямдами, шаблонами-хуяблонами, но такую простую хрень запилить всё еще нельзя?

                            Какой багор )))
                            Ответить
                            • Не ну можно через макросы и try, наверное (Return будет кидать ReturnException). Но это хуйня ебаная, ибо исключения в позитивной ветке.
                              Ответить
                          • почему не наметушить? заставь дефолт быть всегда, как многие языки, лол, перемести его вторым аргументом

                            дальше компилятор будет уже срать опилками, если в лямблиях не будет совпадать

                            не?
                            Ответить
                            • Я про то, что return 8000 я не сделаю. Он саму лямблию прервёт, а не вызывающую функцию.
                              Ответить
                              • я думал у тебя вызывающая функция должна вызывающе проверить условие, и если не верно, то перейти к следующему аргументу
                                Ответить
                                • Я так понял, /u/j123123 хочет именно аналог gcc'шного свища, а не решёточного. Чтобы в ветках прям произвольный код работал.
                                  Ответить
                                  • > /u/
                                    Plebbit pls go
                                    Ответить
                                  • Да, из лямбды еще нельзя сделать goto в пределах функции, где та самая лямбда объявлена и вызвана. Какой анскилл )))
                                    Ответить
                                  • Но вообще лямбдахуйня может возвращать какую-то иную хуйню
                                    если INT_MIN ... 2999 то вернем 0
                                    если 3000 ... 5000 то вернем 1
                                    и так далее
                                    А потом по этой хуйне уже обычный свищ, который хуйпойми что делать может. Это можно наметапрограммировать макросней?
                                    Ответить
                                    • Ну да. Что-нибудь в таком духе можно даже без макросов:
                                      int res = Switch(val,
                                          Case(std::numeric_limits<int>::min, 3000, [](){ return 8000; }),
                                          Case(3000, 5000, [](){ return 10000; }),
                                          Default([](){ return 15000; })
                                      );
                                      Можно даже в компайлтайме оптимизнуть в бинарный поиск, наверное. gcc же вроде не просто по порядку свищ исполняет.
                                      Ответить
                                      • можно еще сделать Объектно Ориентированоо: итерироваца по коллекции кейсов, и

                                        if (case.accepts(value))
                                        Ответить
        • Оператор гоатсе
          Ответить
      • Лапша какая-то.
        Ответить
    • using System;
      
      Console.WriteLine("Hello World!");


      любимая сишечка
      Ответить
    • class Truck
        attr_reader :gross_weight_class
      
        @gross_weight_class = 42
      end
      
      truck = Truck.new
      
      weight = case truck.gross_weight_class
               when 0..3000
                 8.0
               when 3000..5000
                 10.0
               else
                 15.0
               end
      puts weight
      Ответить
    • Так же как и любая машина становится Опелем, так и любой язык в конечном итоге эволюционирует в перл. Ведь перл это венец творения.
      Ответить

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