Куча говна / Говнокод #20147 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
// on every year that is evenly divisible by 4
// except every year that is evenly divisible by 100
// unless the year is also evenly divisible by 400
pub fn is_leap_year(year: usize) -> bool {
    match ((year % 4), (year % 100), (year % 400)) {
        (0, 0, 0) => true,
        (0, 0, _) => false,
        (0, _, _) => true,
        (_, _, _) => false,
    }
}

Интересный способ использовать сопоставление с образцом.

PS
Добавьте плиз Rust.

Запостил: gorthauer87 gorthauer87, (Updated )

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

  • или отсутствует штатная функция, или велосипед?

    `year: usize` - где штатный тип для даты?
    Ответить
      • touché.

        для языка который типа якобы "секурити овер эверифинг", заставлять разрабов переписывать велосипеды, это путь в никуда. ошибки переезжают из синтакса в семантику, и ты опять у того же самого разбитого корыта, но только с еще более уёбищным синтаксом.
        Ответить
        • Хорошие примеры штатных типов для даты в других языках?
          Ответить
          • жабный календарь. в шарпе штатный метод есть. даже в пыхе штатной функцией это проверяется.
            Ответить
            • Цели жабы, шарпа, не говоря уже о пыхе, немного отличаются от целей раста. Не то, чтобы это было сильном оправданием, но язык "молодой, динамично развивающийся". А секурити овер хуёвити тут всё-таки немного в другом
              Ответить
    • Учебный пример, собственно в обучении и нужно писать лисапеды.
      Ответить
      • как пример для использования матча, очень даже и не плохо.
        Ответить
        • Интересно как у него с производительностью, а то так можно целые таблицы истинности радостно строить в матче а потом наблюдать тормоза в рантайме.
          Ответить
          • никогда не задумывался. но с другой стороны, это популярно в функциональщине, и я думаю что помешанные на функциональщине, за 30+ лет уже все возможное перепробовали.

            с другой стороны, за исключением тривиальных случаев, такие таблицы они намного выразительнее чем пачки вложенных switch/case'ов, и IMO у компилера больше шансов это грамотно соптимизировать.
            Ответить
            • > у компилера больше шансов это грамотно соптимизировать
              Ну вериложий компилер прекрасно такие таблички оптимизирует.
              Ответить
  • pub fn is_leap_year(year: usize) -> bool {
        let divisible = |d| { year%d == 0 };
        divisible(4) and (!divisible(100) or divisible(400))
    }

    Может все-таки как-нибудь так?
    Ответить
  • #define SHIT(a,b,c) (((a)<<2)|((b)<<1)|(c))
    #include <inttypes.h>
    
    bool is_leap_year(uint64_t year)
    {
      uint8_t bits = ( (!!(year % 4)) << 2) | ( (!!(year % 100)) << 1) | !!(year % 400);
      switch(bits)
      {
        case SHIT(0,0,0) : return 1;
        case SHIT(0,0,1) : return 0;
        case SHIT(0,1,1) : return 1;
        //case SHIT(1,1,1) : return 0;
        default: return 0;
      }
    }
    Ответить
    • Хотя не, лучше
      #define SHIT(a,b,c) 0b##a##b##c

      Жаль что в стандарте нет
      Ответить
      • А правда, почему в популярных ЯП можно строки собирать из символов, а числа собирать из цифр нельзя?
        Ответить
        • Вообще-то я к тому, что префикса 0b в Си нет(только как гну эксненшн), а в плюсах только в -std=c++14 появилось
          Ответить
          • Да, странное решение. И это при том, что менее нужная восьмеричная в сях была с древних времён, причём константы записываются совершенно неочевидным способом, вызывая воспламенение диванов под новичками.

            Они бы ещё WCT в стандарт внесли!
            Ответить
            • так типа хексом они записывались, нет?

              с другой стороны если ты знаешь что седьмой бит в байте отвечает за флаг Foo, то в тысячу раз логичнее иметь FOO 00000010b, чем 0x2 какой-нить
              Ответить
              • > так типа хексом они записывались, нет?
                int someNumbers[] = { 3000, 2000, 1000,
                                      0300, 0200, 0100 }  // БУМ!

                Та-даа!
                Ответить

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

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

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


    8