Си диез / Говнокод #27114 Ссылка на оригинал

0

  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 Vindicar, (Updated )

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

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

    если гроссвейткалсс меньше 3к, то 8м
    если больше или равен, но меньше пяти ка, то 10
    если больше пяти, то 15
    Ответить
    • Можно было понятнее:
      < 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", 8000 ^ (x >= 3000) * 14416 ^ (x > 5000) * 7560);
                  Ответить
                  • Ну кстати даже годный код генерит, а не табличку с тысячей элементов.
                    Ответить
                  • ну вот видите, си более читаемый и удобный язык, чем питон
                    Ответить
                    • А теперь для разминки мозга давайте переведём эту задачу на SQL.
                      Ответить
                        • Ну если полный диапазон - да. А вот если там только левая половина, как в оптимизированном варианте от /u/nihau, то некрасивая фигня получается.
                          Ответить
                            • кстати есть такой орм для бедных для котла
                              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'шного свища, а не решёточного. Чтобы в ветках прям произвольный код работал.
                                Ответить
                                • Да, из лямбды еще нельзя сделать 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
    Ответить
  • Так же как и любая машина становится Опелем, так и любой язык в конечном итоге эволюционирует в перл. Ведь перл это венец творения.
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8