Помогите! Скоро у меня экзамен по математике, а я не учился! 1 Часть экзамена заключается в классификации четырехугольника по координатам его вершин, что я, к сожалению, не знаю, как это сделать. 2
Итак, ваша задача - написать программу, которая сделает это для меня, чтобы я не потерпел неудачу!
Вызов
Учитывая, что четыре вершины таковы, что никакие три из них не являются коллинеарными, определяют наиболее конкретную классификацию четырехугольника, образованного этими четырьмя вершинами.
Под «наиболее конкретной классификацией» я подразумеваю, что, хотя все квадраты являются прямоугольниками, если форма является квадратом, вы должны указать, что это квадрат, а не указывать, что это прямоугольник.
вход
Ввод будет дан в виде четырех (x, y) координат. Вы можете принять их как список длиной 4 из списков / кортежей длины 2. В качестве альтернативы вы можете принять входные данные как список x-координат и список соответствующих y-координат.
Например, если моя форма имеет вершины в точках (0, 0)
, (5, 0)
, (6, 1)
и (1, 1)
вы можете принять вход в любом из следующих форматов или что - то подобное:
[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])
Вы можете предположить, что четырехугольник не является самопересекающимся и что точки заданы в правильном порядке (то есть две последовательные точки на входе будут соединены отрезком в четырехугольнике).
Выход
Вам понадобится уникальный вывод для каждого из следующих классов четырехугольников:
- Площадь
- Прямоугольник
- Ромб
- Параллелограмм
- Трапеция / трапеция
- воздушный змей
- четырехугольник
Это может быть точное имя, символ, целое число и т. Д.
правила
- Стандартные лазейки применяются
- Если ваш язык программирования имеет встроенный модуль, который будет выполнять именно эту задачу, этот встроенный модуль не разрешен.
- Разрешены встроенные модули для определения расстояния между двумя точками.
- Разрешены встроенные модули для определения угла между двумя линиями.
На данный момент, если вы знаете все термины, вы готовы начать программирование! (Тестовые случаи в конце)
терминология
Этот раздел для тех, кто нуждается в разъяснении определений различных форм.
Площадь
Четырехугольник является квадратом тогда и только тогда, когда все 4 его стороны равны по длине и каждая пара смежных сторон перпендикулярна (то есть это и прямоугольник, и ромб).
Прямоугольник
Четырехугольник является прямоугольником тогда и только тогда, когда каждая пара смежных сторон перпендикулярна.
Ромб
Четырехугольник является ромбом тогда и только тогда, когда все 4 его стороны равны.
Параллелограмм
Четырехугольник является параллелограммом тогда и только тогда, когда каждая пара противоположных сторон параллельна и каждая пара противоположных углов равна. Оба эти условия подразумевают друг друга, поэтому вам нужно проверить только одно из них.
Трапеция / трапеция
Четырехугольник - это трапеция / трапеция, если и только если она имеет хотя бы одну пару параллельных сторон.
воздушный змей
Четырехугольник - это воздушный змей, если две противоположные пары смежных сторон равны по длине; то есть две смежные стороны равны, а две другие тоже равны.
Тестовые случаи
input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral
Ссылки (Графический калькулятор Desmos)
Вот ссылки на визуализации каждого из тестовых случаев.
Квадратный
прямоугольник
ромб
параллелограмм
трапеция / трапеция
змей
четырехугольник
Критерии победы
Я не могу принести компьютер на экзамен, очевидно, поэтому мне нужно, чтобы вы написали максимально короткий код, чтобы я мог его запомнить. Мне нужно записать это в поля и запустить его с помощью TryItOffline TM, чтобы ваша программа была настолько маленькой, насколько это возможно!
1 Конечно я действительно сделал: P
2 Конечно я действительно сделал: P
Ответы:
APL (Dyalog) ,
104898082817978 78 байтовПопробуйте онлайн!
Ввод, вывод
Принимает матрицу координат 4 × 2 в качестве входных данных
Выходы
1 1 1
для площади1 1 0
для ромба1 0 1
для прямоугольника1 0 0
для параллелограмма1 0
для кайта0 1
для Трапеции0 0
для четырехугольникаАлгоритм
Сначала найдите все 4 длины сторон и углы четырехугольника
Если обе пары противоположных углов равны (
OA
), то форма является своего рода параллелограммом. Определите, равны ли все длины сторон (AS
соседние стороны) и равны ли все углы (AA
).Если нет
OA
, то:Определите, есть ли ровно 2 пары равных смежных сторон и разделены ли они (
aabb
вместоaaab
). Если это так, форма является воздушным змеем.Определите, есть ли ровно 1 пара параллельных противоположных сторон. Если это так, то форма трапеции.
В противном случае форма является четырехугольной.
Код
⍙←{⍵⍺⍺1⌽⍵}
определяет новый оператор. В APL оператор означает функцию более высокого порядка . Этот оператор принимает 1 функциональный аргумент (⍺⍺
) и возвращает монадическую функцию, которая:1⌽
) аргумент (⍵
)⍺⍺
между этим и⍵
Это особенно полезно для скалярных функций, так как большинство из них неявно отображаются в аргументах массива, что позволяет
⍙
применять их между каждой соседней парой элементов с переносом. Например+⍙1 2 3 4
,1 2 3 4 + 2 3 4 1
который оценивает3 5 7 5
.x←-⍙⎕+.×1 0J1
преобразует матрицу входных координат в массив комплексных чисел, представляющих векторы четырех сторон фигуры.⎕
при ссылке принимает и возвращает ввод1 0J1
представляет вектор [1, i] («вектор» в математическом смысле, а «i» - квадратный корень из -1). В APLa+bi
написано комплексное числоaJb
+.×
умножение матриц. Математически, результатом будет матрица 4 × 1. Однако+.×
в APL он называется «внутренним произведением», которое обобщает умножение матриц и векторное внутреннее произведение и позволяет вам даже выполнять такие вещи, как «умножение» 3-мерного массива на 2-мерный. В этом случае мы умножаем матрицу 4 × 2 и 2-элементный вектор, в результате чего получается 4-элементный вектор (из представлений комплексных чисел 4 заданных вершин).-⍙
парное вычитание с переносом, как отмечено выше. Это дает векторы 4 сторон фигуры (в виде комплексных чисел). Эти векторы указывают в «обратном» направлении, но это не имеет значения.x←
сохраняет это в переменнуюx
2|1+-⍙(12○x)÷○1
находит (представление) внешние углы в 4 вершинах фигуры.12○x
находит основной аргумент в радианах каждого из 4 боковых векторов.÷○1
делит на π, чтобы с углами было легче работать. Таким образом, все углы выражаются в виде кратного прямого угла.-⍙
Парное вычитание с переносом, как отмечено выше. Это дает 4 внешних угла.2|1+
Главный аргумент ограничен (-1,1], а парное вычитание создает диапазон (-2,2]. Это плохо, поскольку один и тот же угол имеет 2 разных представления. При выполнении «добавить 1 мод 2» угол ограничено (0,2). Хотя все углы на 1 больше, чем должно быть, хорошо, если мы будем помнить об этом.|x
находит величину каждого из 4 боковых векторов{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}
определяет и применяет функцию с массивом из 4 внешних углов в качестве правого аргумента⍵
и с массивом из 4 длин сторон в качестве правого аргумента⍺
.⍵≡2⌽⍵
это охранник.1
следующее выражение≡⍙¨0⍺⍵
и возвращается его значение.0
, это выражение пропускается, и2 4=...=⍙⍺)
вместо него выполняется то, что после .⍵≡2⌽⍵
проверяет, равны ли обе пары противоположных углов.2⌽⍵
вращает массив углов на 2 места.⍵≡
проверяет, совпадает ли это с⍵
самим собой≡⍙¨0⍺⍵
возвращает уникальное значение для каждой фигуры типа параллелограмма.0⍺⍵
3-элементный массив скаляров0
, массив боковых длин⍺
и массив углов⍵
.≡⍙¨
выполняется≡⍙
для каждого из этих элементов.≡⍙
проверяет, все ли значения массива равны, проверяя, дает ли поворот его на 1 одинаковый массив. Скаляры не вращаются, поэтому≡⍙0
возвращается1
. Как отмечено выше,≡⍙⍺
проверяет наличие ромба и≡⍙⍵
проверяет наличие прямоугольника.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
возвращает уникальное значение для каждой фигуры непараллелограммного типа. Это достигается путем переплетения проверок кайта и трапеции.2=+/1=2|+⍙⍵
проверяет трапецию.+⍙⍵
дает смежные угловые суммы. Внутренние углы параллельных линий суммируются в прямой угол, так же как и внешние углы параллельных сторон четырехугольника. Итак, каждая пара параллельных сторон должна приводить к двум1
или-1
к смежным угловым суммам.1=2|
Тем не менее, углы на⍵
1 больше, чем они должны быть, поэтому углы на самом деле составляют1
или3
. Это можно проверить с помощью «mod 2 равно 1».+/
суммирует массив. Это дает счетчик смежных угловых сумм, который равен1
или3
.2=
проверить, равно ли это 2. (т. е. если есть ровно одна пара параллельных сторон)4=+/1=2|+⍙(=⍙⍺)
проверяет наличие воздушного змея(=⍙⍺)
дает массив, указывающий, какие смежные стороны равны В отличие≡
,=
работа поэлементно. Таким образом, это 4-элементный массив с1
s, где длина этой стороны равна длине "следующей" стороны.+⍙
Попарная сумма с обтеканием.1=2|
Так как(=⍙⍺)
дает логический массив (один только0
с s и1
s), единственно возможными значениями попарной суммы являются0
,1
и2
. Так1=2|
же, как и просто1=
.+/
суммирует массив. Это дает счет попарных сумм, который есть1
.4=
проверьте, что равняется 4. Единственный способ , что происходит, если(=⍙⍺)
есть1 0 1 0
или0 1 0 1
. Как отмечено выше, это означает, что форма представляет собой воздушный змей.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
переплетает вышеупомянутые проверки.⍵(=⍙⍺)
является 2-элементным вложенным массивом массива⍵
и массива(=⍙⍺)
↑
переводит вложенный массив в правильную матрицу. Поскольку⍵(=⍙⍺)
это 2-элементный массив из 4-элементных массивов, результатом является матрица 2 × 4.+⍙
Поскольку⌽
(и, соответственно,⍙
) вращает последнюю (горизонтальную) ось,+⍙
матрица такая же, как и+⍙
для каждой строки в отдельности.1=2|
оба rema / mod (|
) и equals (=
) работают для каждого элемента отдельно, даже для матриц.+/
По умолчанию, limit (/
) работает вдоль последней (горизонтальной) оси. Таким образом,+/
суммируем вдоль строк и превращаем матрицу 2 × 4 в простой 2-элементный массив.2 4=
Так как=
работает для каждого элемента, это проверяет условия кайта и трапеции одновременно.источник
Mathematica, 195 байт
С пробелами:
Выходы
1
для квадратов,2
для ромбов,3
для прямоугольников,4
для параллелограммов,5
для воздушных змеев,6
для трапеций и7
для чего-либо еще. Я бы опубликовал ссылку TIO, но это, очевидно, не работает в математике.Если четыре точки
P
,Q
,R
, иS
, затем{##,#}
будет{P,Q,R,S,P}
, поэтомуs
список боковых векторов{Q-P,R-Q,S-R,P-S}
,l
является длины этих векторов, иr
является условием , что угол междуQ-P
иR-Q
так же , как и угол междуR-Q
иS-R
оба90
градусов.Таким образом, если длины всех сторон равны, то четырехугольник является ромбом. Если
r
имеет место, это на самом деле квадрат, в противном случае это просто ромб.Исключая ромбы, если обе пары противоположных длин сторон равны, то четырехугольник все еще параллелограмм. Если
r
выполнено, это на самом деле прямоугольник, в противном случае это просто параллелограмм.Исключая параллелограммы, список длин сторон
l
имеет форму{a,b,b,a}
или{a,a,b,b}
для некоторых,a
аb
затем четырехугольник является воздушным змеем. Обратите внимание, что это не может быть трапеция или ромб.Исключая параллелограммы и воздушных змеев, если у четырехугольника есть пара параллельных сторон, то это трапеция. Мы проверяем это,
Normalize
используя боковые векторы и проверяя, добавляет ли пара противоположных векторов{0,0}
.Исключая все вышеперечисленное, если
1 > 0
(лучше), то четырехугольник просто старый четырехугольник.источник
Python 2 ,
463410408397 байтСохранено 53 байта с помощью кортежа в шестой строке вместо индексации в списке.
Сохранено 11 байтов путем сдвига в выходные целые числа от 1 до 7 вместо первой буквы каждой фигуры. Целые числа соответствуют следующим образом:
Попробуйте онлайн!
Неуправляемый, чтобы показать логику
Показан как функция, чтобы показать выходные данные для различных тестовых входных данных. Обратите внимание, что я изменил пример теста "Прямоугольник" с того, который изначально был представлен в вопросе, который не был прямоугольником.
Логика основывается на точечных произведениях и норме (длине) векторов, образованных сторонами четырехугольника, чтобы оценить, равны ли стороны по длине, параллельны ли на противоположных сторонах или перпендикулярны соседним сторонам.
Попробуйте онлайн!
источник
[(0, 0), (2, 2), (4, 0), (0,-2)]
как воздушный змейПакетный, 287 байт
Выходы в двоичном виде:
1
= воздушный змей,10
= четырехугольник,11
= трапеция,100
= параллелограмм,101
= ромб,110
= прямоугольник,111
= квадрат. Пояснение:g, h, i, j
это квадраты длин сторон.p
- это число пар противоположных сторон одинаковой длины.q
Различает параллелограммы / прямоугольники и ромбы / квадраты, проверяя, равны ли на самом деле противоположные пары,r
различает параллелограммы / ромбы и прямоугольники / квадраты с помощью проверки перпендикулярности,k
проверяет наличие кайт, ища пары равных соседних сторон иt
проверяет трапецию через пару параллельных боковых проверок.источник
2=|-.=⍙⍺
. Конечно, выглядит компактно, если вы игнорируете работу, положенную в расчет⍺
(4 стороны длины) и целую строку для определения⍙