С http://en.wikipedia.org/wiki/Triangle :
Напишите программу, которая берет три двумерных координатных кортежа (декартовых) и классифицирует, какую форму описывают эти три точки.
Почти во всех случаях эти точки будут описывать треугольник различных типов. В некоторых вырожденных случаях точки будут описывать особую точку или прямую линию. Программа определит, какие из следующих тегов применимы к описанной фигуре:
- Точка (3 балла являются со-инцидентом)
- Линия (3 точки лежат на прямой линии - может быть не более 2 точек)
- Равносторонний (3 стороны равны, 3 угла равны)
- Равнобедренно (2 стороны равны, 2 угла равны)
- Scalene (0 сторон равны, 0 углов равны)
- Право (1 угол точно π / 2 (или 90 °))
- Наклонный (0 углов точно π / 2 (или 90 °))
- Тупой (1 угол> π / 2 (или 90 °))
- Острый (3 угла <π / 2 (или 90 °))
Обратите внимание, что для некоторых описанных фигур будет применяться более одного из приведенных выше тегов. Например, любой прямоугольник также будет равнобедренным или разносторонним.
вход
- Программа может считывать 3 входные координаты из STDIN, командной строки, переменных среды или любого другого метода, удобного для вашего языка.
- Входные координаты могут быть отформатированы, однако это удобно для вашего языка. Можно предположить, что все входные числа правильно сформированы по отношению к типам данных, которые вы в конечном итоге используете.
- Ничего нельзя предположить о порядке ввода входных координат.
Выход
- Программа выведет на STDOUT, диалоговое окно или любой другой способ отображения, подходящий для вашего языка.
- Выходные данные будут отображать все теги, применимые к форме, описанной входными координатами.
- Теги могут быть выведены в любом порядке.
Другие правила
- Разрешены тригонометрические библиотеки / API вашего языка, но любые API, которые специально рассчитывают типы треугольников, запрещены.
- При определении равенства углов или длин сторон вы, скорее всего, будете сравнивать значения с плавающей точкой. Два таких значения следует считать «равными», если одно находится в пределах 1% от другого.
- Стандартные «лазейки», которые больше не смешны
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Примеры
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Ответы:
C (451 байт)
Использует только квадрат длины и уклонов.
Ungolfed (и троичный оператор заменен на if / else):
Ввод (через стандартный ввод) Формат: xyxyxy
ех. 0 0 1 1 2 0 для Isosceles Right
источник
./triangle <<< "1 2 1 2 1 2"
следует использовать с кавычками.С, 333
Я оставил пустое место на данный момент. Это работает, но, вероятно, можно сделать с некоторой уборкой и игрой в гольф. Аналогичен математическому
@es1024
ответу, но использует цикл и массивы. Формат вводаx y x y x y
переменные
t[]
хранит как вход, так и квадраты длин. К концу программы это выглядит так, как показано в таблице ниже (увеличение количества итераций цикла приведет к неопределенному повторению квадратов длин.) В начале цикла квадраты длин (мусор, так как не все данные доступны ) без необходимости хранятся в ячейках 1,3 и 5, но быстро перезаписываются.scanf.
Полезные данные записываются вz,b,c
ahd,s
когдаi
= 9,11,13 (t[i]
иt[i-2]
к ним обращаются).g[]
был добавлен позднее для хранения значений dx и dy, необходимых для расчета наклона. Используются только ячейки от 6 до 9 (от 0 до 5 ненадежны, так как не все данные доступны при их записи.) Еслиg[6]/g[7]==g[8]/g[9]
наклоны 2 линий равны, а треугольник - это просто линия (или точка). Уравнение переставлен в программе, чтобы избежать деления.r
является промежуточным значением, используемым для возведения в квадратz
считает количество сторон длины ноль. Он имеет смещение +3, потому что цикл читает 3 пустых ячейки вt[]
.c
считает количество сторон одинаковой длины. Он также имеет смещение +3. Обратите внимание, что сторонаa
записываетсяt[]
дважды, чтобы иметь возможность проверить a = b, b = c, c = a.b
самая большая длина стороны в квадрате.s
это сумма квадратов всех сторон.Обратите внимание, что сравнение длин сторон A ^ 2 + B ^ 2 + C ^ 2 с 2 * B ^ 2 аналогично сравнению A ^ 2 + C ^ 2 с B ^ 2 (просто вычтите B ^ 2 с обеих сторон). Таким образом, если B ^ 2 = A ^ 2 + C ^ 2, это прямоугольный треугольник. если B ^ 2 больше, он тупой, если меньше, то острый.
источник
Golfscript (175 байт)
Вы можете проверить это здесь (тестовый набор включен).
Формат ввода:
Комментируемая версия:
НОТА:
Причина, по которой мой код не содержит "равносторонний" вывод, заключается в том, что:
источник
Mathematica (
313307 символов)Golfed:
Ungolfed:
Формат ввода представляет собой список точек, по которым вызывается функция:
источник