Кресты / Говнокод #3270 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 absolut, (Updated )

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

      • 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 строк :^)
                      Ответить
                        • Ваш код в 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, а то надо точно проверить
    Ответить
  • Хм, в вижуал сиплюсплюсе вроде указатель так песался?
    TObject ^sender
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8