1. Список говнокодов пользователя bormand

    Всего: 168

  2. bash / Говнокод #12198

    −108

    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
    # For bash and ksh, we can use faster builtin routines to do manipulation,
    # otherwise (ash) fall back to slower method using `expr'.
    # The extra level of indirection using `eval' is necessary a) for ksh, and
    # b) to get past ash.
    
    if [ "$RANDOM" != "$RANDOM" ]
    then
        math () {
            eval echo "\$(($*))"
        }
        index () {  # index string c
            eval "I=\${1%$2*}"
            eval echo "\${#I}"
        }
        ...
    else
        math () {
            expr "$@"
        }
        index () {  # index string c
            expr $1 : ".*$2" - 1
        }
        ...
    fi

    Отличный способ определения шелла из старослакварского /dev/MAKEDEV.

    bormand, 26 Ноября 2012

    Комментарии (12)
  3. Куча / Говнокод #12193

    +124

    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
    samples = [(1,14),(2,-66),(3,-414),(4,-1180),(5,-2370),(6,-3726),(7,-4606),(8,-3864),(9,270)]
     
    -- Бесконечная система уравнений для МНК
    system s = zip (matrix s) (column s) where
        matrix = iterate tail . foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) 1)
        column = foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) y)
     
    -- Сведение бесконечной системы к треугольному виду (первый шаг гаусса)
    triangle (eq:eqs) = (eq : triangle (map (sub eq) eqs)) where
        sub eq1@(a1:as, ae) eq2@(b1:bs, be) = (zipWith f as bs, f ae be) where
            f a b = b - a * b1 / a1
     
    -- Вычисление иксов (второй шаг гаусса)
    calcX n = foldr calc [] . take n where
        calc (a:as, b) xs = ((b - sum (zipWith (*) as xs)) / a : xs)
     
    -- метод наименьших квадратов
    mnk n = reverse . calcX n . triangle . system

    Метод наименьших квадратов.

    http://ideone.com/CsD0ku

    bormand, 25 Ноября 2012

    Комментарии (52)
  4. JavaScript / Говнокод #12189

    +161

    1. 1
    2. 2
    3. 3
    function toInt(number) {
        return number && + number | 0 || 0;
    }

    http://ideone.com/igo7ag

    Минут 10 назад меня ошарашили фразой о методе toInt(), который, якобы, есть в javascript. Гугл выдал всего одну ссылочку, в которой говорится о нем: http://javascript.ru/forum/misc/22100-funkciya-toint-razyasnite-pozhalujjsta-neskolko-momentov.html. Увидев данный код, я просто не мог не выложить его сюда.

    bormand, 23 Ноября 2012

    Комментарии (28)
  5. C++ / Говнокод #12172

    +17

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    #include <iostream>
     
    int main() {
        std::cout << (2,0 * 2,5) << std::endl;   // 5
        std::cout << (0,625 * 6,4) << std::endl; // 4
        std::cout << (2,5 * 2,0) << std::endl;   // 5?
        return 0;
    }

    Почему в с++ умножение некоммутативно?

    http://ideone.com/Erp3uv

    bormand, 21 Ноября 2012

    Комментарии (44)
  6. C++ / Говнокод #12111

    +24

    1. 1
    QString("a=%1 b=%2").arg("[%1]").arg("Shit happens")

    Вы думаете, что результат будет "a=[%1] b=Shit happens"?
    Как бы не так! "a=[Shit happens] b=%2".

    Причем эта "фича" вполне документирована. Но документирована она не в самом первом описании arg'а, а только в arg(const QString &a1, const QString &a2), в доку по которому я естественно никогда не заглядывал...

    UPD: правильным вариантом будет QString("a=%1 b=%2").arg("[%1]", "Shit happens"), но тогда мы лишаемся поддержки форматирования, да и таким образом можно засунуть максимум 10 аргументов.

    bormand, 13 Ноября 2012

    Комментарии (5)
  7. C++ / Говнокод #12077

    +16

    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
    QString QSqlResultPrivate::positionalToNamedBinding()
    {
        int n = sql.size();
    
        QString result;
        result.reserve(n * 5 / 4);
        bool inQuote = false;
        int count = 0;
    
        for (int i = 0; i < n; ++i) {
            QChar ch = sql.at(i);
            if (ch == QLatin1Char('?') && !inQuote) {
                result += qFieldSerial(count++);
            } else {
                if (ch == QLatin1Char('\''))
                    inQuote = !inQuote;
                result += ch;
            }
        }
        result.squeeze();
        return result;
    }
    
    // Пример запроса:
    // select * from some where d_t = "2012-11-08 12:00:00"

    Словили сегодня вот такой глюк в кутишечке.

    База данных отлично понимает строки и даты в двойных кавычках, все это даже работало какое-то время. Но когда попытались исполнить запрос с таймштампом в двойных кавычках (как в строке 25), начала возникать ошибка в духе "непонятные символы в дате". В одинарных же кавычках все работало. После копания в исходниках и гуглёжки выяснилась и причина - QtSql в упор не видит двойных кавычек, и пытается проставить в них именованные параметры (в нашем случае :00, :00)...

    Если кому нужен быстрофикс - берем тут: https://bugreports.qt-project.org/browse/QTBUG-27159

    bormand, 08 Ноября 2012

    Комментарии (11)
  8. C++ / Говнокод #12071

    +18

    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
    #include <iostream>
     
    int main() {
        // Инициализируй меня... полностью.
        void (*(&(*omg[])())[1]) (void (*)(void (*(*[])())())) = { [] () ->
        void (*(&)[1]) (void (*)(void (*(*[])())())) { static void (*f[])
        (void (*)(void (*(*[])())())) = { [] (void (*f)(void (*(*[])())())) {
        static void (*(*ff[])())() = { [] () -> void (*)() { return [] () {
        std::cout << "Test OK" << std::endl; }; } }; f(ff); } }; return f; } };
     
        // Вызывай, вызывай меня... полностью.
        omg[0]()[0]([] (void (*(*f[])())()) { f[0]()(); });
     
        return 0;
    }

    http://ideone.com/gvg1B7

    Говнокоду http://govnokod.ru/12066 посвящается.

    Инициализация массива указателей на функции, возвращающих ссылку на массив указателей на функции принимающие указатель на функцию, принимающую массив указателей на функции, возвращающих указатель на функцию ничего не принимающую и ничего не возвращающую.

    С++ это простой и наглядный язык.

    bormand, 07 Ноября 2012

    Комментарии (150)
  9. Си / Говнокод #12016

    +140

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    int next_id() {
        static int id = 0;
        __sync_add_and_fetch(&id, 1);
        return id;
    }

    "Атомарная" раздача айдишек.

    bormand, 28 Октября 2012

    Комментарии (52)
  10. Python / Говнокод #12013

    −102

    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
    import datetime, calendar
    
    def first_last_dopw():
        now = datetime.datetime.now()
        week = datetime.date(now.year, now.month, now.day).isocalendar()[1] - 1
        if week is 0:
            day = 31
            week = datetime.date(now.year - 1, 12, day).isocalendar()[1]
            while week == 1:
                day -= 1
                week = datetime.date(now.year - 1, 12, day).isocalendar()[1]
        d = datetime.date(now.year, 1, 1)
        d = d - datetime.timedelta(d.weekday())
        dlt = datetime.timedelta(days = (week - 1) * 7)
        return d + dlt, d + dlt + datetime.timedelta(days = 6)
    
    def first_last_dopm():
        now = datetime.datetime.now()
        month = now.month - 1
        year = now.year
        if month is 0:
            year -= 1
            month = 12
            prev_month = calendar.monthrange(year, month)
        else:
            prev_month = calendar.monthrange(year, month)
        return datetime.date(year, month, 1), datetime.date(year, month, prev_month[1])

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

    Выложено по просьбе одного из наших гостей http://govnokod.ru/11925#comment157657.
    Источник: http://nwskyfox.blogspot.com/2012/07/python.html

    bormand, 27 Октября 2012

    Комментарии (18)
  11. Haskell / Говнокод #11976

    −82

    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
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    {-# LANGUAGE ExistentialQuantification,
                 DeriveDataTypeable,
                 PatternSignatures #-}
    
    import Data.Typeable
    import Control.Concurrent
    import Control.Concurrent.MVar
    import Control.Concurrent.Chan
    
    -- Core data types
    
    data Message = forall t . Typeable t => Message t | StopMessage
        deriving Typeable
    
    data Handler = forall t . Typeable t => Handler (t -> IO ())
    
    
    -- Worker thread
    
    data Worker = Worker (Chan Message) (MVar ())
    
    workerThread :: [Handler] -> Chan Message -> MVar () -> IO ()
    workerThread handlers chan finish = loop where
        loop = do
            message <- readChan chan
            case message of
                StopMessage -> putMVar finish ()
                Message val -> do
                    foldr (tryHandler val) (putStrLn "Unhandled message") handlers
                    loop
        tryHandler val (Handler h) rest = maybe rest h (cast val)
    
    startWorker :: [Handler] -> IO Worker
    startWorker handlers = do
        chan <- newChan
        finish <- newEmptyMVar
        forkIO (workerThread handlers chan finish)
        return $ Worker chan finish
    
    send :: Typeable m => Worker -> m -> IO ()
    send (Worker chan _) message = do
        writeChan chan $ Message message
    
    stopWorker :: Worker -> IO ()
    stopWorker (Worker chan finish) = do
        writeChan chan $ StopMessage
        takeMVar finish
    
    
    -- Some tests
    
    data Test = Test Bool String deriving Typeable
    
    intHandler :: Int -> IO ()
    intHandler val = putStrLn $ "Int: " ++ show (val * 2)
    
    strHandler :: String -> IO ()
    strHandler val = putStrLn $ "String: " ++ reverse val
    
    testHandler :: Test -> IO ()
    testHandler (Test b s) = putStrLn $ "Test: " ++ show b ++ " " ++ show s
    
    main = do
        w <- startWorker [
            Handler intHandler,
            Handler (\(val::Char) -> putStrLn $ "Char: " ++ show val),
            Handler strHandler,
            Handler testHandler]
        send w (5::Int)
        send w False
        send w 'a'
        send w "foo"
        send w (Test True "bar")
        stopWorker w
        putStrLn "Finished!"

    Вот такая вот портянка была написана под влиянием дискуссии с HaskellGovno http://govnokod.ru/11968, и недавней его просьбой рассказать об общении потоков в хаскеле.

    Код запускает тред, в который можно передавать различные сообщения (ограничение только одно - тип сообщения должен быть инстансом тайпкласса Typeable). В треде исполняются указанные хендлеры, каждый из которых ловит свой тип сообщений.

    P.S. Для неимеющих хаскеля, но желающих посмотреть на работу кода: http://ideone.com/OMVamc.

    bormand, 22 Октября 2012

    Комментарии (43)