1. PHP / Говнокод #11329

    +55

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    <?php
    /**
     * Определение знака зодиака
     * автор: Nc_Soft
     * 12.01.09
     */
     
    //массив для сравнений
    $zodiak=array(
    'Oven'=>'Овен',
    'Taurus'=>'Телец',
    'Gemini'=>'Близнецы',
    'Cancer'=>'Рак',
    'Leo'=>'Лев',
    'Virgo'=>'Дева',
    'Libra'=>'Весы',
    'Scorpion'=>'Скорпион',
    'Sagittarius'=>'Стрелец',
    'Capricorn'=>'Козерог',
    'Aquarius'=>'Водолей',
    'Fish'=>'Рыбы'
    );
     
    //функция опеределения
    function zodiak($d,$m) {
     
        $d=sprintf('%02d',$d);
        $m=sprintf('%02d',$m);
     
        if (($m=='03' AND $d>20) OR ($m=='04' AND $d<21)) return 'Oven';
        if (($m=='04' AND $d>20) OR ($m=='05' AND $d<22)) return 'Taurus';
        if (($m=='05' AND $d>21) OR ($m=='06' AND $d<22)) return 'Gemini';
        if (($m=='06' AND $d>21) OR ($m=='07' AND $d<23)) return 'Cancer';
        if (($m=='07' AND $d>22) OR ($m=='08' AND $d<24)) return 'Leo';
        if (($m=='08' AND $d>23) OR ($m=='09' AND $d<24)) return 'Virgo';
        if (($m=='09' AND $d>23) OR ($m=='10' AND $d<24)) return 'Libra';
        if (($m=='10' AND $d>23) OR ($m=='11' AND $d<23)) return 'Scorpion';
        if (($m=='11' AND $d>22) OR ($m=='12' AND $d<22)) return 'Sagittarius';
        if (($m=='12' AND $d>21) OR ($m=='01' AND $d<19)) return 'Capricorn';
        if (($m=='01' AND $d>20) OR ($m=='02' AND $d<19)) return 'Aquarius';
        if (($m=='02' AND $d>18) OR ($m=='03' AND $d<21)) return 'Fish';
     
        return null;
    }
     
    //тестирование (пример для 3 декабря)
    echo $zodiak[zodiak(3,12)]; //Стрелец
     
    ?>

    Запостил: nepster, 01 Июля 2012

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

    • > Oven
      Духовка. Я родился под знаком духовки!
      > Fish
      Латинский язык такой латинский.

      Ну и сравнения говно. Это или запихивается в формулу, или в массив.
      Ответить
    • > //функция опеределения
      No comments.
      Ответить
    • Если уж возиться с массивом, то пускай возвращало бы число.
      А вообще автор рожден под знаком говна.
      Ответить
      • Ага, и рожден он в Нулябре...
        Ответить
      • Автор - какой-то позорный говнюк, который спёр ник у небезызвестной компании.
        Или я тут один знаю, что Lineage II делали корейцы из NCSoft?
        Ответить
        • Спасибо! Вот долго пытался вспомнить, где же я слышал о NCSoft, но никак не удавалось.
          Ответить
    • да, после таких эпикфейлов автора неуместный sprintf смотрится убого
      Ответить
    • на самом деле у меня борода не очень длинная пока что и выкладывая этот код я обратил внимание на другие вещи, это 100500 if подряд, неужели нельзя сделать 1 конструкцию !?

      И выходит 2 return.

      return 'Fish';
      return null;

      ну и sprintf я вообще никогда не использовал в практике. Я бы скорее для удобство передавал дату в функцию. Далее бы проверил ее на валидность, и 1 конструкцией, во избежания к примеру ifelse уже проверил все это дело.
      Ответить
      • > И выходит 2 return.
        WHAT?! до return null дело дойдет только при кривых входных данных...

        > Я бы скорее для удобство передавал дату в функцию.
        Плюсую. Там же скорее всего день рождения и передают.
        Ответить
    • да, передают день и месяц, тоесть если к примеру нам нужно из базы достать дату рождения и узнать знак зодиака, то в любом случае придется обрабатывать дату сторонним скриптом, а в эту функцию передавать zodiak(3,12).

      Хотя как я заметил даты, это вообще больная тема почему то в php. Тут пол сайта в "датах" ))
      Ответить
      • показать все, что скрытоЭто проблема "даты" вообще.
        Дата пытается отмерять промежуток времени ОГРОМНЫЙ. Несравнимо большего масштаба, чем жизнь сценария. Для сценария дата -- это не время, это совершенно сторонние метки, которые он получает от "Бога", потому что сам отмерять такие промежутки не способен.

        Потому никогда, просто никогда не будет "хорошего" кода для дат.
        Любой код, который содержит метку человеческого времени -- говнокод, потому что работает с данными, которые не могут быть получены с рациональной позиции сценарием.
        Дальше хлеще: программист думает, что не удивительно, как человек. Для него промежуток времени в один год, месяц, день -- нормальные вещи. И он пытается свои представления втиснуть в сценарий.

        Лично я вообще избегаю работы с человеческой датой в любом языке.
        Ответить
        • > говнокод, потому что работает с данными, которые не могут быть получены с рациональной позиции сценарием
          Прохладный сказ, боярин.
          Но я бы посоветовал слезть с тяжёлых наркотиков.Арифметика дат - нормальная арифметика. Все проблемы только в головах авторах, плюс нестабильности разных видов годов.
          Ответить
          • По количеству дней невозможно определить количество месяцев и годов.
            Они несоизмеримы. Это нормально ?!
            Это катастрофа!
            Давно уже пора отказываться от этой чепухи.
            Ответить
            • > Они несоизмеримы. Это нормально ?!
              Да. Люди же с этим столько лет жили.

              > Давно уже пора отказываться от этой чепухи
              Даешь месяцы по 32 дня и 256 дней в году! Всего-то немного притормозить вращение нашего голубого шарика вокруг его оси...
              Ответить
              • >Люди же с этим столько лет жили.
                Люди очень долго жили в пещерах.
                Вам туда ---> cave
                Ответить
                • Ну вот вращение земли притормозите, заставите все страны перейти на интерестианский календарь, тогда и поговорим.

                  /me ушел в пещеру жарить мамонта
                  Ответить
            • Невозможно. Но это реальность, данная нам в ощущениях. Можно попросить другой глобус.
              Ответить
              • Полностью согласен с вами.

                Вот когда люди будут жить в подземных городах, в которые не проникает солнечный свет, и не зависимо от времени года поддерживается постоянная температура... Тогда учет времени в годах и сутках и без помощи interested канет в лету... И люди самостоятельно перейдут на более простые временные метки...
                Ответить
                • Как вариант - другой глобус, в самом деле. Марсианские (или лунные) сутки (и годы) - не хрен моржовый.
                  Ответить
                • Впомнилать повесть "Семь подземных королей" Волкова: там целое государство располагалось под землёй. По повести у них сохранились "наземные" единицы измерения времени и был хранитель времени, использующий песочные часы для измерения фиксированных интервалов. Но это лишь сказка, как бы это было на самом деле - никто не скажет :)
                  Ответить
                  • С достаточно нереалистичным внутрипещерным свечением, ЕМНИП. ИРЛ, это будет гораздо печальнее.
                    Ответить
        • > Лично я вообще избегаю работы с человеческой датой в любом языке.
          Так и запишем - не осилил человеческих дат.
          Ответить
      • Предупреждая вопрос об "алгебре дат".
        Действительно, даты можно вычитать, складывать и сравнивать.
        Но.
        Проблема именно в том, что для сценария это что угодно, любая абстрактная алгебра, а для программиста алгебра, обладающая "интуитивной логикой". И проблема именно в столкновении программиста со сценарием.

        Есть такая штука, вы все знаете, это UNIX-метка-времени. Очень изящное решение, которое приводит алгебру дат, в алгебру целых, которая достаточно ясно реализована в машине и для нас интуитивна. Использование UNIX-метки устраняет свищ. При этом сама абстрактная алгебра даты может быть упрятана в библиотеки, которые легко использовать, чтобы пытаться узнать промежутки в нашей, человеческой, "интуитивной" дате.
        Ответить
        • >никогда, просто никогда не будет "хорошего" кода для дат
          >может быть упрятана в библиотеки, которые легко использовать
          ?
          Библиотеки, которые легко использовать, основанные на ЮНИКС-метке - это плохой код?
          Ответить
          • Метка времени устраняет логический свищ, исключает наличие неравномерности, но не может устранить пакости человеческой даты.
            Всё равно получается, что из попугаев в слоны дата не переводится. Нужно вычислять в слонах, если нужно в слонах.
            Имея разность между двумя метками нельзя сказать сколько прошло дней или годов. Приблизительно можно, а вообще нельзя. Единица метки -- секунда, а секунда с днём и годом несоизмерима.
            Ответить
            • А люди, кстати, в годах и месяцах только приблизительно и считают... Поэтому требования точно перевести сколько-то дней в годы они абсурдны. Есть смысл только в отсчете дней с определенной даты.

              > а секунда с днём и годом несоизмерима
              Ну с годом то да, но с днем то какие траблы (кроме leap second)?
              Ответить
              • Да уж, нынешняя система дат вообще во многом странна.
                Например, когда говорят "ровно три месяца назад", то имеют ввиду именно это число только тремя месяцами ранее, а вот количество дней, прошедших с того момента сильно разнится в зависимости от того, какой именно месяц имеется ввиду...
                Таким образом, невозможно точно сказать расстояние в днях между двумя точками во времени, между которыми известно точное расстояние в месяцах.
                Ответить
                • > Таким образом, невозможно точно сказать расстояние в днях между двумя точками во времени, между которыми известно точное расстояние в месяцах.
                  Ну на самом деле оно не особо и нужно. Для человека месяц и, тем более, год - это достаточно большой срок. И когда человек говорит - "через 3 месяца", то он, как правило, подразумевает приблизительно 90 дней, а не какое-то более точное число...

                  Плюсы и минусы текущей календарной системы в том, что она заточена для удобства людей, а не машин. Как например я смогу с временной меткой сказать "встретимся завтра"? "встретимся в 3789127389+-100500"?
                  Ответить
                  • Это вопрос привычки и воспитания.
                    Если бы вас с детства воспитывали в других терминах дат, то вам бы сложности не составляло сказать: "Встретимся в следующих 100500".

                    И, конечно, дата для удобства людей... Прошлого тысячелетия.
                    Дата -- это такой огромный человеческий проект со множеством костылей и подпорок для обратной совместимости. Как PHP.

                    Нам привычно и удобно. И я с этим не спорю. Наш мозг много мощнее в этом плане, чем современные ЭВМ. Но нестройность наших ощущений и невозможность отображения их в машину приводит к нему: к говнокоду.
                    Ответить
                    • > Это вопрос привычки и воспитания.
                      Станете диктатором мира - прикажете всем юзать timestamp. А до этого момента все ваши предложения - не более чем высказывание очередного гения-идеалиста. Вы не первый, кто предлагает переделать календарь. Не вы и последний.

                      Но поймите, что человек в принципе не способен работать с большими числами и объемами данных. Все что человек добился - он делал за счет разбиения сложных задач на более простые подзадачи и построения иерархий.

                      Вот и с датами та же ситуация. Сейчас дата это иерархическая система, доступная почти любому человеку (и то не всем!). Если же вы заставите людей оперировать плоскими 9-10 значными числами, вы просто-напросто лишите большинства людей возможности пользоваться датами...
                      Ответить
                      • Современный календарь привязан к движению небесных тел и у него есть несомненное преимущество: вы можете измерять время, не имея точных приборов: достаточно наблюдать движения небесных тел и иметь набор определённых знаний.
                        А задротские таймстемпы к реальной жизни не приспособлены.
                        Ответить
                        • http://govnokod.ru/11329#comment145318

                          Ну вот в такой ситуации они, в принципе, были бы приспособлены... Но это уже другая реальная жизнь ;)
                          Ответить
                  • > заточена для удобства людей, а не машин
                    Го-не-во.
                    Это просто странная система счисления, аппроксимирующая древние наблюдения с помощью кучи разных традиций. Задумайтесь об этом хотя бы на пару микровитков.
                    Ответить
                    • уже было предложение разделить часы и минуты по 100, а не по 60 = )
                      Ответить
                      • Какая разница 100 или 60... один фиг не степень двойки.
                        Ответить
                        • тогда бы была спекуляция как с хардами, пишут Мб, подразумевают МиБ
                          Ответить
                          • Средняя продолжительность жизни человека составляет 2.35Гс...
                            Ответить
                      • базису под этим нету

                        А вообще-то да, этот боян уже досконально обсудили.
                        Ответить
              • Один день с другим даже несоизмеримы.
                Эслан его знает, что может повлиять на вращение Земли.
                Так, глядишь, за сто лет и накопиться свищ.
                Ответить
              • Вполне, по-моему, реальная ситуация.

                Есть две даты, нужно вычислить, скажем, зарплату. Зарплата идёт два раза в месяц, а раз в кватрал -- премия, а в конце года -- бонус. И вот нужно это дело вычислить...
                Это кошмар!
                Ответить
                • > Зарплата идёт два раза в месяц
                  Ага, допустим 5го и 20го числа каждого месяца.

                  > Раз в квартал - премия
                  Ок, в марте, июне, сентябре и декабре.

                  > В конце года - бонус
                  Ок, в декабре.

                  Расчетные точки раставлены. Сколько рабочих дней между ними - известно. В чем проблемы? Вы еще предложите выходные отменить, потому что они, видите ли, усложнят вам расчет.
                  Ответить
                  • Как узнать, что между двумя датами есть, например, этот декабрь?
                    Нужно отдельно от дней переводить месяцы и проверять, а попадает ли этот декабрь в промежуток.
                    И так же со всеми премиальными месяцами.
                    А если бы этой путАницы не было бы, то можно было вычислять, не приводя в месяцы.

                    Мало того, что промежутки слонов в попугаи не переводятся, так ещё и смешиваются в дате! Дни с месяцами и годами.
                    Кошмар!
                    Ответить
                    • Вы так говорите, как будто выяснение моментов выдачи премий, это самая сложная часть расчета зарплаты...
                      Ответить
        • > Очень изящное решение, которое приводит
          ... к невозможности записать даты до 1900 года, и ограничению 2038 годом...
          Ответить
          • Концептуально хорошее решение.
            Оно из соизмеримых единиц.

            Если вы не будете мешать человечеству развиваться, то придумают и длинную универсальную всюду соизмеримую метку. Без дней, месяцев и годов.
            Ответить
            • > Если вы не будете мешать человечеству развиваться
              Ага. Вот научатся все человеки ворочать в уме 9-10значные числа этой соизмеримой метки - тогда, глядишь, и сами к этому придут.
              Ответить
    • >массив для сравнений
      Каких таких сравнений?
      Ответить
    • >if (($m=='03' AND $d>20) OR ($m=='04' AND $d<21)) return 'Oven';
      С точки зрения астрологии тут есть и другая существенная ошибка... смена знака не происходит в 00:00 со сменой дня календаря :) она должна точно высчитываться.
      Ответить
      • Только вот это "кастрология". Наверняка показывает иконку по дате рождения или ещё что-то типа того. Там точности хватит в пределах недели.
        А так да, нужно знать до часу рождения (хотя это больше для каких-то планетных карт).
        Ответить

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