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

    +162

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       bool Valid = true;
       bool f1;
       bool f2;
       unsigned step = 0;
       for( bool x1=false; x1<2; x1++ )
          for( bool x2=false; x2<2; x2++ )
             for( bool x3=false; x3<2; x3++ )
                for( bool x4=false; x4<2; x4++ )
                   for( bool x5=false; x5<2; x5++ )
                      for( bool x6=false; x6<2; x6++ )
                         for( bool x7=false; x7<2; x7++ )
                            for( bool x8=false; x8<2; x8++ )
                               for( bool x9=false; x9<2; x9++ )
                                  for( bool x10=false; x10<2; x10++ )
                                     for( bool x11=false; x11<2; x11++ )
                                        for( bool x12=false; x12<2; x12++ )
                                           for( bool x13=false; x13<2; x13++ )
                                              for( bool x14=false; x14<2; x14++ )
                                                 for( bool x15=false; x15<2; x15++ )
                                                 {
       step++;                                             
       f1 = ( x1 && x2 || x3 && x4 || x5 && x6 && x7 || x8 && x9 && x10 ) && ( !x11 || x12 && x13 || x14 && x15 );
       f2 = (!(!x1 || !x2) || !(!x3 || !x4) || !(!x5 || !x6 || !x7) || !(!x8 || !x9 || !x10)) && ( !(!x14 || !x15) || !x11 || !(!x12 || !x13) );
       if ( f1 != f2 ) Valid = false; break;
                                                 }
       if( Valid ) Application->MessageBox( "Функции идентичны", "Функции идентичны", MB_OK );
       else Application->MessageBox( "NOT Valid", IntToStr(step).c_str(), MB_OK );
    
    }

    Проверка идентичности логических функций путем перебора аргументов.

    Запостил: absolut, 19 Мая 2010

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

    • Delphi какой-то...
      Ответить
      • C++ Builder однако
        Ответить
        • TForm1, Button1Click - антипаттерн "магическая кнопка" во все поля!
          Когда такую сигнатуру видишь - содержимое обычно не удивляет
          Ответить
    • сильно, однака
      Ответить
    • Вот что на самом деле скрывается под термином boolshit!

      PS. Буквально давеча думал, кому может понадобиться библиотека boolstuff:)
      Ответить
    • показать все, что скрытоКстати, у && и || вроде приоритет одинаковый? Тогда я просто не могу понять смысл выражения x1 && x2 || x3 && x4 || x5 && x6 && x7 || x8 && x9 && x10.
      Ответить
    • Мне вот что непонятно. Это задание, что ли, такое - проверить идентичность функций путём перебора?
      Ответить
      • Насколько я помню, это из уроков схемотехники. Карты Карно и всё такое.
        Ответить
        • Задание было - сделать программу, которая сравнивает две схемы, вводиме пользователем? Тогда да, этот фрагмент вообще не в тему и ничего не даст. Или надо было написать сравнения именно этих двух схем? Тогда не говнокод. Потому что адекватность кода соответствует адекватности задания. То, что функции совпадают, и так очевидно.
          Ответить
          • тупое говно в любом случае ибо говнореализация говноидеи.
            вместо 15 переменных можно было завести ОДНУ 16-битную и использовать ОДИН цикл.
            Ответить
            • И во что при это превратились бы выражения для f1 и f2? По-моему, 15 вложенных циклов значительно яснее, чем огромное выражение с кучей логических операций и ещё большей кучей битовых масок.
              Ответить
              • можно преобразовать счетчик в массив из bool - короткая запись обращения к элементу и короткое преобразование.
                Или вытащить вычисление выражений в отдельные функции, и передать им значения отдельных битов как аргументы. Тогда запись подлиннее будет, но зато без лишних сущностей и промежуточных шагов.
                Ответить
              • если немного подумать можно найти простое решение
                (к примеру создать массив или написать функцию для получения бита по индексу)
                а вот если у вас будет 128-разр число? 128 вложеных циклов?
                вы китаец?
                Ответить
                • Нет, я сторонник адекватных решений. Для простой тупой одноразовой задачи (а судя по контексту это именно такая задача), по-моему, предложенное решение вполне адекватно. Как часть большое системы - нет. А тут, по-моему, оно соответствует разумном соотношению результат/затраченные усилия.
                  Ответить
                  • с каких это пор тупой копи-пейст стал адекватным?
                    а если цикл на 15 итераций, то вы 15 раз пишете его содержимое?
                    если есть возможность решить задачу в 5 строк, а она решается в 20 - это
                    >>разумноe соотношениt результат/затраченные усилия.
                    Ответить
                    • Блин, задача решается в ноль строк, вот в чём проблема. И если написали такую хуйню, значит либо автор полный дебил, что не в состоянии в уме перевернуть знак, либо такое задание.
                      Ответить
                      • Интересно, каким это методом? Я думаю у Вас приведение этих двух функций к каким-нибудь нормальным формам займёт дольше, чем написание такой программы. Или Вы знаете другие чудодейственные приёмы решения задачи сравнения двух булевых функций?
                        Ответить
                        • Какая нах форма? Тут с головой хватит знания того, что !(a&&b) = !a || !b
                          Ответить
                          • Согласен, не вчитался в формулу. С другой стороны, каковы шансы, что в такой формуле Вы проморгаете разницу в одно отрицание где-нибудь?
                            Ответить
                            • Примерно те же, как на то, что я облажаюсь при написании кода.
                              Ответить
                      • хз, может это он тестил
                        ану-ка покажите решение в 0 строк :^)
                        Ответить
                        • Смотри:
                          Ответить
                          • :D
                            кэп ваш код нерабочий
                            Ответить
                          • Ваш код в 0 строк не выполнил возложенных на него функций.

                            Фейлите, товарищъ.
                            Вы ursus?
                            Ответить
                            • А вы неправильные данные подавали, потому и не выполнил!
                              У меня нормально, все правильно сделал!
                              Ответить
                            • Хуюрсус.
                              Если ты не можешь решить эту задачу в уме, то иди гуляй.
                              Ответить
                              • Если ты не можешь решить эту задачу программно, то иди гуляй. Какой с тебя, нахуй, программист?
                                Ответить
                                • А нахера решать программно то, что решается в уме за 5 секунд? Не-не, это ты иди гуляй.
                                  Ответить
                    • Для одноразовых задач, которые не являются частью большей системы, адекватным является любое работающее и быстрое (в смысле затраченных усилий) решение. На такое решение у меня уйдёт минут 10 максимум включая отлов случайных багов. Я предполагаю, что над решением в 5 строчек Вы только думать будете дольше, а ещё потом ещё сколько-то времени дебажить разные ошибки в "умном" решении.
                      Ответить
                      • как раз нет
                        мне бы просто было влом копипастить
                        и менять индексы у х-ов
                        Кстати копи-паста - это корень многих ошибок ибо провтыкать чего то легко а потом полчаса искать это.

                        >>быстрое (в смысле затраченных усилий) решение

                        ну я уже не знаю как объяснить, что приведенное выше решение таковым никак не является ибо что-то вроде
                        for( int x=0 x1<2^15; x1++ ){
                        f1 = ( getB(x,1) && getB(x,2) итд..
                        f1 = ( getB(x,1) || getB(x,2) итд..
                        if ( f1 != f2 ) Valid = false; break;
                        }
                        //не спорю - говнофункция, но это чисто для примеpa
                        bool getb(int i,int b){
                        return ((i & 2^(b-1))>0);
                        }
                        гораздо быстрее написать
                        Ответить
                • Вот когда будет, тогда и поговорим. А пока что говнистость кода не превышает говнистость цели его написания.
                  Ответить
            • Завести 16-битную переменную и каждый раз писать
              b1 = step & 0001h
              b2 = step & 0002h
              b3 = step & 0004h
              итд.
              Один хуй.
              Ответить
              • читайте написанное выше
                >>можно преобразовать счетчик в массив из bool - короткая запись обращения к элементу и короткое преобразование.
                >>к примеру создать массив или написать функцию для получения бита по индексу

                Кэп поясняет что будет выглядеть так x[1], x[2] итд
                или getBit(1) getBit(2) итд

                >>b1 = step & 0001h
                >>b2 = step & 0002h
                это говноподход
                Ответить
              • Два хуя.
                Ответить
              • >> Один хуй.

                За что?
                Ответить
    • Развидеть это !
      Ответить
    • А-а-а-а!
      "for ( bool var = false", надо будет запомнить, просто гениально!
      Ответить
      • Копать от забора до обеда:)
        Ответить
        • "Единицы измерения" (типы) соблюдены. ;)
          Но в целом, вероятно, надо было:
          for( bool x1=false; x1<=true; x1++ )
          Хотя конечно инкремент булевых переменных и не рекомендуется стандартом. А вот декремент для bool вообще запрещен.
          Ответить
          • Почему декремент запрещён?
            Ответить
            • По стандарту
              Ответить
              • Это понятно из поста выше. Зачем повторяться?
                Говорю, почему это запретили в стандарте? Какие были-бы последствия, если бы не запретили?
                Что если я попытаюсь декрементировать булевскую переменную? Получу ошибку компиляции? Что-то типа семантик еррор?
                Ответить
                • Предыстории почему запретили, я не знаю. Но видимо неспроста, раз уж в стандарте прописано. При компиляции будет ошибка. Если кто знает почему запрещено, было бы интересно узнать. А пока что любой инкремент bool дает true, а декремент запрещен.
                  Ответить
                  • *лять, ну у вас С++ников и проблемы...
                    Надрочили "стандартов" на полторы тыщи листов и сами не знаете что для чего и зачем оно...
                    Ответить
                  • Может, чтобы 0 не декрементировали, тогда получится хрен знает что. Когда инкрементируешь, истина становится все толще (разве что кто-то в поисках истины тип обернет:)))), но все равно истина, а тут можешь ложь получить или НЕХ.
                    Ответить
          • Да вообще, любой порядок надо на булях запретить. Чтобы неповадно было.
            Чтобы как у Виннипуха: «если он есть, то его сразу нет». Два значения и баста. А то мое true, которое 2, труевее твоего, которое 1. В два раза труевее.

            PS. Правда всегда одна, это сказал фараон. Так-то!
            Ответить
          • for( bool x1=false; x1<=true; x1 = ! x1 )
            И не нужно жутких арифметических действий.
            Ответить
            • Погорячился с плюсованием. Код-то не рабочий :)) ЗацикливаеЦЦо
              Ответить
              • Да, похоже на то. Видимо, без счётчика такого не сделать. Или придётся хранить промежуточное значение.

                Зато мы теперь знаем, как получить чередующуюся последовательность false-true-false-...
                Ответить
    • for( bool x1=false; x1<2; x1++ )
      Человек, придумавщий это, достоин уважения.
      Ответить
    • хочу такую же программу которая докажет что true равно true
      и де моргана пусть докажет

      вдруг все что я знал -- не правда?!

      И если можно то чуть по-больше чем 15, а то надо точно проверить
      Ответить
      • Любишь откапывать свежие треды?
        Ответить
      • Тактика firstorder из Coq.
        Ответить
        • А, так это лаба по предмету "theorem prover"

          зы: я только сейчас задумался: а coq же это питух
          Ответить
    • Хм, в вижуал сиплюсплюсе вроде указатель так песался?
      TObject ^sender
      Ответить
      • лолшто?

        Ты с дельфи/паскалем не перепутал?

        и это не вижалси, это билдер борладновый судя по вот этим вот T
        Ответить
        • Ну SEMAREAL, от тебя я такого не ожидал, что ты про это не слышал https://en.wikipedia.org/wiki/C%2B%2B/CLI
          Ответить

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