1. C++ / Говнокод #16699

    +52

    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
    double cCompositeBlock::determinant4x4(double *d){ // WARNING It's not logically connected with class.
        return  d[3]*d[6]*d[9]*d[12]  -d[2]*d[7]*d[9]*d[12]-
                d[3]*d[5]*d[10]*d[12] +d[1]*d[7]*d[10]*d[12]+
                d[2]*d[5]*d[11]*d[12] -d[1]*d[6]*d[11]*d[12]-
                d[3]*d[6]*d[8]*d[13]  +d[2]*d[7]*d[8]*d[13]+
                d[3]*d[4]*d[10]*d[13] -d[0]*d[7]*d[10]*d[13]-
                d[2]*d[4]*d[11]*d[13] +d[0]*d[6]*d[11]*d[13]+
                d[3]*d[5]*d[8]*d[14]  -d[1]*d[7]*d[8]*d[14]-
                d[3]*d[4]*d[9]*d[14]  +d[0]*d[7]*d[9]*d[14]+
                d[1]*d[4]*d[11]*d[14] -d[0]*d[5]*d[11]*d[14]-
                d[2]*d[5]*d[8]*d[15]  +d[1]*d[6]*d[8]*d[15]+
                d[2]*d[4]*d[9]*d[15]  -d[0]*d[6]*d[9]*d[15]-
                d[1]*d[4]*d[10]*d[15] +d[0]*d[5]*d[10]*d[15];
    }

    Запостил: Abbath, 16 Сентября 2014

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

    • Подумаешь, 4х4...

      http://govnokod.ru/8707
      http://ideone.com/m64iM
      Ответить
      • Самый популярный юзкейс Хацкеля: генератор любого бреда в пределах 40 строчек.
        Ответить
        • Хаскель не просто генерирует бред, он делает это типобезопасно.
          Ответить
          • И без побочных эффектов
            Ответить
            • Они просто спрятаны в монады.
              Ответить
              • конечно можно и вообще без побочных эффектом, но мне все равно интересно чтоон там наредуцировал
                Ответить
      • Хаски правит миром
        Ответить
      • детерминант, в одну строку и без циклов - это не говнокод. это быстро. это надо.
        я еще видел обратную матрицу в таком виде. это быстро. это нормально. без этого 3д графика не шевелится.
        Ответить
        • Это быстро для 3х3, возможно для 4х4. А для бОльших матриц все наивные методы - говно (и циклы и одностроки и даже метод через миноры).
          Ответить
          • А зачем бОльшие матрицы в 3д графике?
            Ответить
            • там как раз 4*4 матрица. и детеминант, видимо, оттуда. только вот код обратной матрицы страшнее )
              Ответить
    • Блин, есть же трудоголики. я бы со своей ленью никогда такого не написал
      Ответить
      • Там класс в 18000 строк, написанный полностью одним человеком.
        Ответить
        • К сожалению, оригинальная версия утеряна https://git-wip-us.apache.org/repos/asf/flex-sdk/repo?p=flex-sdk.git;a=blob;f=frameworks/projects/framework/src/mx/core/UIComponent.as;h=06ae5864a00c98b99209aad 8b1cff0dfd7207eed;hb=HEAD. В оригинале было что-то около 70К строк, все написано неким Клементом Вонгом (там почти весь фреймвок он написал, в том числе и компилятор).
          Ответить
          • Я сначала подумал про кодогенерацию; типа, хренакнул макросом умножение матриц, прогнал через препроцессор и - ктрл-ц ктрл-в.
            Увидел азиатскую фамилию - сомнения отпали. Этот алмаз шлифовали фланелевой тряпочкой и голыми руками.
            Ответить
        • Что-то я запамятовал, за какое время нормальный программист должен написать такой класс?
          Ответить
          • 18 суток?
            Ответить
          • Может "за какие деньги"? Эту хрень не отдебажешь - не уницируешь. Если бы этот чувак писал класс матриц у него было бы по классу на каждый размер до заданного. Сопровождение кода - ад

            Поэтому я искренне считаю, что такой китайский говнокод стоит дороже
            Ответить
            • >Если бы этот чувак писал класс матриц у него было бы по классу на каждый размер до заданного

              Нет, с этим повезло, но трехэлементные векторы он свелосипедил.
              Ответить
    • Оставлю здесь своё творчество на тему.
      http://ideone.com/Ojau68
      Ответить
      • matrix_type a_plus_b;
        copy(addition<matrix_type, matrix_type>(a, b), a_plus_b);
        как-то много букв...
        А разве нельзя сделать
        auto result = a + b;
        Ответить
        • Хотелось бы... Про целевые компилятлры известно только то, что они умеют схх98.
          Алсо, таким copy можно скопировать из результата умножения матриц флоатов в транспонированную матрицу даблов. Типа снизить потери точности при умножении большого количества матриц.
          Весьма забавно было наблюдать, как компилятор жрёт память и дохнет на компиляции вычисления определителя 8x8. Ищу компилятор x64, хочу больше зрелищ!
          Ответить
          • > как компилятор жрёт память
            конечно, если к элементу матрицы обращаться как a.template at<row, col>()
            Ответить
          • Если подсунуть gcc ту глупую портянку, которую выше генерит хаскель - тоже дохнет где-то в районе 8.
            Ответить
          • > Ищу компилятор x64, хочу больше зрелищ!
            8 гигов хватит? Домой вернусь - попробую собрать.
            Ответить
            • > 8 гигов хватит?
              По оценке методом псевдонаучного тыка - должно хватить :) Вижуал студио сделал мне дебажный бинарник около восьми мегов для матриц 6x6, интересно, что будет с матрицами больших размеров.
              > Домой вернусь - попробую собрать.
              А чем, если не секрет? Тоже хочу себе продвинутый тулчейн :)
              Ответить
              • Да обычным gcc под x86_64 бубунтой... Оно же по определению 64-битное и может адресовать дохуя памяти. Лишь бы не загнулось на каких-то внутренних лимитах.
                Ответить
      • Это длинно и совсем не хаскелл
        Ответить
      • > int main(int argc, char * argv[]) {
        > try {

        я в таких случая использую function-try блоки, так на один отступ меньше:
        int f()
        try {
            // fun
        } catch (...) {
            // consequences of fun
        }
        Только не используйте их в деструкторах, пожалуйста.
        Ответить
        • > Только не используйте их в деструкторах, пожалуйста.
          Да они там какие-то совсем уж бесполезные... Либо убить прогу нахрен, либо перевбросить другое допустимое исключение. Больше вариантов то и нет...
          Ответить
          • > Да они там какие-то совсем уж бесполезные...
            Угу, в конструкторах и деструкторах у function-try блоков другая семантика, не как для обычных функций.
            С деструкторами, кмк, у стандартизаторов тут фейл получился. Хотя, может я просто чего не осилил.
            Ответить
            • > Хотя, может я просто чего не осилил.
              Герб Саттер тоже не осилил:

              Мораль No1. Обработчик try-блока конструктора пригоден только для трансляции исключения, сгенерированного в конструкторе базового подобъекта или подобъекта-члена (а также, возможно, для соответствующего занесения информации в журнальный файл или каких-то других побочных действий в ответ на генерацию исключения). Ни в каких других целях обработчик служить не может.

              Мораль No2. Try-блоки деструкторов практического применения не имеют, поскольку деструкторы не должны генерировать исключения.

              Мораль No3. Все остальные try-блоки функций практического применения не имеют. Try-блок обычной функции не может перехватить что-то, что не может перехватить обычный try-блок в теле функции.
              Ответить
      • У gcc на -O2 с потреблением памяти намного хуже, чем у визуалки (ты же визуалкой до 7 продержался?):
        2: 0.2s, 40MB
        3: 0.3s, 50MB
        4: 0.7s, 90MB
        5: 2.8s, 290MB
        6: 38s, 1.3GB
        7: in progress...
        Ответить
        • В общем на size=7 через час было съедено гигов 10 и продолжало работать... Я убил, т.к. сильно своповалось, и даже не собиралось умирать.
          Ответить
          • Теперь надо из-под винды под виртуалкой в студии.
            Хм, может и мне попробовать, если студия завалялась. Хотя, если она не может в 64, не надо пробовать.
            Ответить
          • Час - по процессору. А на wall clock часа 2.5 натикало.
            Ответить
            • у меня тут на работе в комнате стоит комп с i7-4960x и 64гб рам
              но он с виндой и даже без студии
              Ответить
        • vs2012 release (-O2 и типа всё такое)
          2x2 - 1391 ms
          3x3 - 1631 ms
          4x4 - 2406 ms
          5x5 - 8202 ms
          6x6 - 175956 ms
          7x7 - терпение пока не кончилось, уже больше часа
          Память посмотреть не смог, но 7x7 стабильно держится около 2 гигов.

          Мда, я и не представлял, что одна маленькая ссылка сожжёт столько киловатт энергии :)
          Ответить
          • Мда, я и не представлял, что одна маленькая ссылка сожжёт столько киловатт энергии :) (c) Сатоси Накамото
            Ответить
          • 7x7 - 7967641 ms
            main.cpp(102): fatal error C1060: compiler is out of heap space
            Вспомнилась именно эта цитата: http://www.bash.org/?919561
            Ответить
            • Т.е., оказывается, что gcc компилит шаблоны быстрее...
              Ответить
              • Ну либо у меня комп тупо быстрее (i5, 3.4GHz).
                Ответить
                • > gcc компилит шаблоны быстрее...
                  У меня i5 1.7ГГц, но он могильный, так что деление чисел на два не даст адекватного сравнения.
                  Я ещё проверял на совместимость со стандартом через MinGW, он компилировал ощутимо медленнее, в 1.3-1.5 раз.
                  Ответить
                  • А вот и напиздел я.

                    g++ -O2
                    2x2 - 0m0.481s
                    3x3 - 0m0.621s
                    4x4 - 0m1.231s
                    5x5 - 0m4.813s
                    6x6 - 1m7.868s

                    И деление времени на отношение частот тоже даёт адекватную оценку.
                    Ответить
      • Кстати, метод с минорами не самый удачный для неразреженных матриц. Это точно такая же питушня с O(n!), как и код из топика, и мой говногенератор.

        Надо пробовать сведение к треугольному виду, у него будет че-то типа O(n^3).
        Ответить
        • [оффтоп]Cтранно, наверное, смотрится одинокое светящееся окошко, в то время, как во всём районе вырубили свет...
          Ответить
          • Ночь, ноутбук, 3говно модем и крепкая зависимость связь с ГК?
            Ответить
            • Ночь, UPS, 3говно бекап через ведрофон и апатия в перемешку с бессонницей...
              Ответить
              • Говорят, физические упражнения неплохо разгоняют апатию. Но мои двенадцать лишних килограммов уверяют в обратном, уж знаю кому верить.
                И вообще: этот мозг нуждается в лучшем снабжении кислородом!
                Ответить
            • Мечтаю о няшной стоечной UPS'очке как на работе. Но свет сейчас редко вырубают, да и ставить ее некуда.
              Ответить
              • рекомендую не размениваться по пустякам и сразу ставить динамический дизель-роторный ИБП
                Ответить
                • С учетом окупаемости и рентабельности бизнеса владельцев дата-центров применять DRUPS рекомендуется для обеспечения ЦОД мощностью от 1 МВт и более.
                  Ответить
                  • > мощностью от 1 МВт и более
                    ГК растёт, ГК расширяется. Каждый день - новый юзерскрипт или тонны сгенерированного бреда. Надо думать о будущем, надо готовиться.
                    Ответить
        • Здравая мысль, надо будет запилить. Надеюсь, мне это поможет побороть страх перед плавающими петухами, который я приобрёл тут, спасибо говнокодику :)
          Ответить
          • Нормального гаусса на шаблонах хер запилишь. Он же без выбора элемента скатывается в говнище. Не в последнюю очередь из-за плавающих петухов...

            Пример из жизни: помогал другу реализовать МНК. У меня на хаскеле все отлично считалось (по счастливой случайности строчки положил как надо). А у него строчки были в обратном порядке - точность улетела к хуям, в ответе полный мусор, не имеющий никакого отношения к реальному ответу.
            Ответить
    • vanished
      Ответить

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