1. Си / Говнокод #17801

    +132

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    int weeks_in_month(int month, int year){
        int weeks=1, first, i=0;  //i - числа месяца
        first = weekday(1, 1, 1, 1, 1, month, year);
        i += 8 - first;
        while(i <= days_in_month(month, year)){
            ++weeks;
            i += 7;
        }
        return weeks;
    }

    Запостил: alobanov, 16 Марта 2015

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

    • Ольтернатива?
      Ответить
      • Ну хотя бы деление вместо этого цикла...
        Ответить
        • А мы никуда не торопимся, ещё и вычисление days_in_month поделаем в цикле, а то процессору скучно всё время считать - надо ещё попрыгать))
          Ответить
          • кото не скачет тот
            Ответить
          • Тогда можно вообще по одному дню от референса в духе 01.01.0001 аккуратно посчитать... Там их не так уж много, проц даже не заметит.
            Ответить
    • а старое доброе dayInMonth/7 не канает? или нужно количество полных недель с первого понедельника?
      Ответить
      • Да даже для полных канает. Просто отнять количество дней в первой неполной неделе придётся.
        Ответить
        • придется узнавать какой первый день.... нестандартными средствами нужно выкручиваться
          Ответить
          • Есть всего 14 календарей. Можно было уже хоть раз все сделать хорошо.
            Ответить
            • Хм. А это тема! Пишем свич на 14 позиций, по аналогии с прошлым тредом, и задача решена.
              Ответить
            • Посоны, я баг в календаре нашел! Переход на грегорианский.
              1918
                  Январь            Февраль           Март              Апрель            
              Пн  1  8 15 22 29       18 25              4 11 18 25     1  8 15 22 29   
              Вт  2  9 16 23 30       19 26              5 12 19 26     2  9 16 23 30   
              Ср  3 10 17 24 31       20 27              6 13 20 27     3 10 17 24      
              Чт  4 11 18 25       14 21 28              7 14 21 28     4 11 18 25      
              Пт  5 12 19 26       15 22              1  8 15 22 29     5 12 19 26      
              Сб  6 13 20 27       16 23              2  9 16 23 30     6 13 20 27      
              Вс  7 14 21 28       17 24              3 10 17 24 31     7 14 21 28
              Ответить
              • А говорят, что 30 июня 2015 года ещё високосная секунда будет.
                Ответить
              • >Посоны, я баг в календаре нашел!
                Его еще Григорий нашёл и исправил, просто к нам апдейт с багфиксом позже приехал.
                Ответить
                • К тому же апдейт приехал не сам, а ради него пришлось пройти квест по устранению Императора.
                  Ответить
                  • Да, проупдейтили с Oldstable на Stable, правда через полгода вообще полностью снесли систему и собрали билд из ветки Experimental.
                    Конечно я не сторонник таких мер, потому что первые годы все разваливалось и крашилось, но зато много важных патчей в Конституцию попало, правда половину до сих пор не отладили нормально.
                    Ответить
                    • Так старая-то была проприетарной, к тому же исходники утеряны. Вот и пришлось идти на такой риск, чтобы снять вендор-лок.
                      Ответить
                      • Не, то что старую версию поддерживать уже было нельзя - это факт, не было ни критических обновлений, ни поддержки средой, ни нового железа.
                        Так в итоге через 70 лет все же вернулись на ветку, которую поставили после первой переустановки.

                        С другой стороны Experimental долгое время поддерживал самое передовое железо, правда большой ценой, в реале отсутствовали самые элементарные и базовые программы и юзеров сильно урезали в правах.
                        Ответить
                        • Но поскольку Stable никто эти 70 лет не развивал, приходится под неё адаптировать железо, выпущенное для Experimental. Кругом костыли и грабли.
                          Ответить
                          • И в итоге шаг назад, потому что разделили систему на компоненты, якобы стало более юзер-френдли, но общий перфоманс сильно упал из-за оверхеда. Хорошо хоть ядро монолитным сохранили, чуть не разломали всё, желая перейти на микроядро.

                            Часть полезных патчей так и осталась в Experimental, хотя они были хорошо оттестированы.
                            Ответить
                          • >Но поскольку Stable никто эти 70 лет не развивал
                            Ну почему это, другие конторы Stable хорошо допилили за эти годы и закрыли много уязвимостей.
                            Ответить
                        • А ещё в Experimental можно было делать интересные штуки, если перелогиниться рутом. Но при этом надо было соблюдать Политику честного использования, чтобы не отправить ядро в панику. Старожилы это знали, но потом пришли нубы, не участвовавшие в разработке, которые доигрались так, что пришлось заменять Experimental первым, что под руку попалось.
                          Ответить

    • #define WEEKS_IN_MONTH 4

      /thread
      Ответить

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