1. Куча / Говнокод #20147

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 07 Июня 2016

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

    • > // unless the year is also evenly divisible by 400
      2400 не нужен
      Ответить
    • или отсутствует штатная функция, или велосипед?

      `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 }  // БУМ!

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

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