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

    +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
    bool isRightTriangle(int a, int b, int c)
    {
        int przeciw=a;
    	if (b>przeciw) przeciw = b;
    	if (c>przeciw) przeciw = c;
    
    	if (przeciw=a)
    		if (a*a==b*b+c*c) return true;
    	else if (przeciw=b)
    		if (b*b==a*a+c*c) return true;
    	else if (przeciw=c)
    		if (c*c==a*a+b*b) return true;
                
        return false;
    }

    Запостил: Fai, 11 Ноября 2012

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

    • Всё правильно сделал.
      Сразу нашёл наибольшую сторону, чтобы делать только три умножения, а не 9 в худшем случае.
      Ответить
      • Его код вообще-то считает треугольник со сторонами (0,4,4) (да и любой (0,x,x)) - прямоугольным.

        Плюс вот это:
        if (przeciw=a)
        Ответить
        • Ты хочешь сказать, что треугольник со стороной 0 не прямоугольный? У него ведь два прямых угла, и один нулевой.

          P.S. = то я и не заметил.
          Ответить
          • Привыкли со своим хаскелем ошибки на этапе компиляции получать...

            Совсем про неуловимые крестобаги забыли. Забыли как с отладчиком три дня сидеть. Как баг искали, что только в полнолуние появлялся забыли...
            Ответить
            • > Привыкли со своим хаскелем ошибки на этапе компиляции получать...
              Не, я и на с/с++ привык к -Wall -Wextra. А там эту опечатку с = отлично видно.
              Ответить
          • Тогда уже 4 прямых угла: два с одной стороны, два с другой
            Ответить
            • Откуда у треугольника 4 угла?
              Ответить
              • не 4, а 6
                Ответить
                • Поясню:
                  1. Между A и B
                  2. Между A и С
                  3. Между В и А
                  4. Между В и С
                  5. Между С и А
                  6. Между С и В
                  Ответить
                  • да, три внутренних и три внешних
                    Ответить
                  • ...Например, на том же факультете у первокурсника затык в мозгу случился. На зачете преподаватель, чтобы показать ему абсурдность его метода доказательства, привел контрпример. У треугольника три угла. К каждому примыкает по две стороны. Итого 3*2 = 6 сторон. И парня переклинило.
                    Ответить
                    • В моём случае у треугольника 6 углов. А т.к. стороны 3 по моему определению, то каждые 2 стороны соединены между собой двумя углами - прямым и обратным
                      Ответить
                      • Итого у этого треугольника 3 прямых угла...
                        Ответить
                    • Из каждой вершины треугольника исходит два луча. Итого 6 лучей.
                      Ответить
                      • Лучей и правда 6.
                        Ответить
                        • Так, сейчас еще кто-нибудь третий пусть проверит расчеты, чтобы точно быть уверенным в отсутствии ошибки.
                          Ответить
                          • Лучей бесконечно много, посоны. Просто часть из них совпадает.
                            Ответить
                            • Ага, и вершин у треугольника бесконечно много, просто они сгруппированы в 3 кластера.
                              Ответить
        • Ой, блин, да за == надо вернуться в прошлое и настучать Ритчи по башке.
          А вообще компилятор предупредить должен же.
          Ответить
          • Просто нужно было сравнение на равенство сделать символом =, а присваивание - любым другим.
            Ответить
            • Наоборот.
              Ответить
              • В си-подобных языках итак наоборот.
                Ответить
            • Например, :=
              Ответить
            • Сравнение ==
              Присваивание :=

              И уж точно никто не спутает.
              Ответить
              • Сравнение:
                if x is equal to y:

                Присваивание:
                set value of variable x to value of variable y.

                Теперь точно не спутают.
                Ответить
              • Мне кажется, что присваивание - статистически более вероятный элемент. Потому делать его двойной длины глупо. И сравнение в этом случае получается бесполезно длинным.
                Нужна простая односимвольная конструкция сравнения на равенство. Варианты могут быть.
                Ответить
                • в perl есть eq
                  Ответить
                • s x y //присваивание x := y
                  e x y //сравнение x == y
                  Ответить
                  • :=: из хаскеля оператор. Толька я хз што значит
                    Ответить
                    • Обмен значений
                      Ответить
                      • Ну обмена значений там быть не может, всеж язык чистый.
                        Но однажды на дваче я увидел нечто похожее на
                        data Sqr c = Sqr c
                        Sqr 5 :+: Sqr 4 :=: Sqr 5
                        и код на идеон скомпилировался, доказывая как бы что теорема о пифаговоровой тройки для данных значений верна самим фактом компиляции в хаскеле этих строк и что я идиот раз повелся на это.
                        После этого я пошел учить хаскел. И вот я хаскел частично знаю, но найти тот старый утонувший тред уже не могу, но и написать нечто подобное, чобы оно хоть какими то хаками скомпилировалось я тоже не могу...
                        Подозреваю, что нужно из какогото модуля импортировать конструктора :+: и :=:. Тот, кто это написал - сам эти конструктора не объявлял, а на хугле найти модули с ними у меня тоже не получилось.
                        Ответить
                        • Может тупо переопределённые вручную операторы?
                          Ответить
                          • Я не помню кода, но думаю что нет. Код был похожий. Ну максимум ещё 2 строчки там было и точно операторы не объявлял. Что-то импортировал.
                            Ответить
                        • > Ну обмена значений там быть не может, всеж язык чистый.

                          Типа я пошутил так.
                          Ответить
                          • Блин, а я поверил... Уже три часа пытаюсь значения функций местами поменять.
                            Ответить
                          • Тебе только техническую документацию писать.
                            Ответить
                        • > Ну обмена значений там быть не может
                          http://ideone.com/TIvh3T

                          P.S. Конструкторы типа :=: :+: не особо гуглятся ;( Хугл тоже молчит.
                          Ответить
                          • > a <=> b
                            Почти как в Немерле:
                            a <-> b
                            Ответить
                          • >P.S. Конструкторы типа :=: :+: не особо гуглятся
                            http://symbolhound.com/
                            Ответить
                        • доказывая как бы что теорема о пифаговоровой тройки для данных значений верна самим фактом компиляции

                          Эм.. на стадии компиляции в хаскеле различать числовые литералы? (это ж не нумералы черча). Разве что в отдельном случае вроде сопоставление по образцу вывести предупреждение. Выглядит очень сомнительно.
                          Ответить
                          • >доказывая как бы что ... и что я идиот раз повелся на это
                            Ответить
          • В языке METAFONT Дональда Эрвина Кнута есть и знак :=, и знак ==, и знак =, как ни странно. Первый знак — присвоение, второй — сравнение, как не трудно догадаться, а третий знак — функциональщина типа реши уравнение.

            Если бы все языки приняли этот стандарт, то холиваров «:= и = vs = и ==» не было бы. Поэтому все разработчики ЯП, кроме Кнута, — редиски.
            Ответить
      • if (a>b && a>c) {
            if (a*a==b*b+c*c) return true;
        } else if (b>c) {
            if (b*b==a*a+c*c) return true;
        } else {
            if (c*c==a*a+b*b) return true;
        }
        return false;
        Ответить
        • a *= a, b *= b, c *= c;
          return a == b + c || b == a + c || c == a + b;
          Ответить
          • return (a*=a) == (b*=b) + (c*=c) || b == a + c || c == a + b;
            Ответить
          • Этот код не эквивалентен коду выше. Этот содержит постэффекты.
            Ответить
            • Где?
              bool isRightTriangle(int a, int b, int c) {
                  a *= a, b *= b, c *= c;
                  return a == b + c || b == a + c || c == a + b;
              }
              Если там были бы еще строчки - то таки да. А в таком контексте - все отлично.
              Ответить
          • int przeciw=a;
            	if (b>przeciw) przeciw = b;
            	if (c>przeciw) przeciw = c;
            
            	if (przeciw==a)
            		if ((a+b)*(a-b)==c*c) return true;
            	else if (przeciw==b)
            		if ((b+c)*(b-c)==a*a) return true;
            	else if (przeciw==c)
            		if ((c+a)*(c-a)==b*b) return true;
                        
                return false;
            Ответить
            • bool isRightTriangle(int hypotenuse, int cathetus1, int cathetus2)
              {
                return hypotenuse * hypotenuse == cathetus1 * cathetus1 + cathetus2 * cathetus2;
              }

              Problems? :J
              Ответить
              • Я так долго ждал вменяемых названий переменных...

                *плачет от радости*
                Ответить
              • bool isRightTriangle(int hypotenuse, int cathetus1, int cathetus2)
                {
                    // раз пользователь знает, где у треугольника гипотенуза
                    // значит этот треугольник прямоугольный
                    return true;
                }
                Ответить
              • 3 умножения. У меня два. У меня оптимальнее.
                Ответить
                • @bormand вне конкуренции
                  Ответить
                  • у него нет полезной работы в коде
                    Ответить
                    • Так это ж идеал к которому нужно стремиться. Чем меньше делает код, тем он быстрее и надежнее.
                      Ответить
                • Использование math/pow считать читерством?
                  Ответить
                • А так сравнений меньше (2-3 против 3-5 у твоего кода):
                  if (a>b && a>c) {
                      if ((a+b)*(a-b)==c*c) return true;
                  } else if (b>c) {
                      if ((b+c)*(b-c)==a*a) return true;
                  } else {
                      if ((c+a)*(c-a)==b*b) return true;
                  }
                  return false;
                  Ответить
                  • Тарас хорошо с разностью квадратов придумал.
                    return (a>b && a>c)
                    	?   (a+b)*(a-b)==c*c
                    	: b>c
                    	  ? (c+b)*(b-c)==a*a
                    	  : (c+a)*(c-a)==b*b
                    ;

                    PS Прочитал весь тред, но так и не дошло - что же такое przeciw.
                    Ответить
                    • Это что-то по-польски, я думаю

                      и у тебя в 4 строчке ошибка: c+b вместо b+c
                      Ответить
                      • Внезапно przeciw — это «против». Странная логика: если сторона расположена напротив прямого угла, то она противная?
                        Ответить
    • Напишите уже версию на хаскеле.
      Ответить
      • Зачем? Что за хаскелефажество? Откуда оно вообще появилось?
        Ответить
        • Тут недавно был пост про nemerle, мне посоветовали учить хаскелл. Вот и понеслось.
          Ответить
      • Нахуя?
        isRightTriangle a b c
            | a>b && a>c = (a+b)*(a-b)==c*c
            | b>c        = (b+c)*(b-c)==a*a
            | otherwise  = (c+a)*(c-a)==b*b
        Ответить
        • isRightTriangle a b c
              | a>b && a>c = (a+b)*(a-b)==c*c
              | b>c        = (b+c)*(b-c)==a*a
              | True       = (c+a)*(c-a)==b*b
          Ответить
    • >przeciw
      присев
      Ответить

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