Подсчет количества треугольников на изображении является задачей, обычно используемой в тестах мозга. Вам дана картинка, которая содержит фигуры, состоящие из треугольников. Затем вы должны найти все возможные треугольники на картинке.
задача
Вам предоставляется список строк в формате по вашему выбору. Затем вы должны вывести список треугольников, найденных в этом
вход
Вам предоставляется список строк, каждая из которых имеет четыре целочисленных координаты (например, x1 y1 x2 y2
). Вы можете выбрать формат ввода, если он четко задокументирован. Примеры:
0 4 8 1
0 4 9 5
8 1 9 5
2 8 0 4
9 5 2 8
[[0, 4, 8, 1], [0, 4, 9, 5], [8, 1, 9, 5], [2, 8, 0, 4], [9, 5, 2, 8]]
Вот такой же ввод как изображение:
Еще один, с пересечениями (только в одном формате для экономии места):
[[2, 1, 5, 0], [2, 1, 2, 7], [5, 0, 6, 6], [5, 0, 2, 7], [6, 6, 2, 1], [2, 7, 6, 6]]
Выход
Вы должны вывести список всех треугольников, каждый из которых задан шестью координатами с плавающей точкой (например, x1 y1 x2 y2 x3 y3
), на рисунке, указанном входными данными . Это могут быть не целые числа, поскольку линии могут пересекаться в любой точке. Вы можете выбрать выходной формат, если он четко задокументирован. Пример выходов для примера входов выше:
0 4 8 1 9 5
0 4 9 5 2 8
[[0, 4, 8, 3, 9, 5], [0, 4, 9, 5, 2, 8]]
[[2, 1, 5, 0, 2, 7], [2, 1, 5, 0, 6, 6], [5, 0, 6, 6, 2, 7], [2, 1, 6, 6, 2, 7], [2, 1, 5, 0, 3.674, 3.093], [5, 0, 6, 6, 3.674, 3.093], [6, 6, 2, 7, 3.674, 3.093], [2, 7, 2, 1, 3.674, 3.093]]
Вы можете предположить, что
не существует краевых случаев, когда прямая пересекает пересечение, но нет линий, например
[[0, 9, 1, 8], [1, 8, 2, 9], [2, 9, 3, 8], [3, 8, 4, 9], [4, 9, 0, 9]]
нет углов больше 179 градусов, вроде
[[0, 0, 0, 1], [0, 1, 0, 2], [0, 2, 0, 0]]
правила
- Вы можете использовать любой язык, который хотите.
- Внешние ресурсы не должны использоваться.
- Применяются стандартные лазейки .
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах .
[0,9],[1,8],[2,9],[3,8],[4,9]
самом деле представляет собой букву W с линией, проведенной сверху. Разве это не треугольники или 2 треугольника?[0,0],[1,0],[2,0],[1,2]
"четырехугольник" с одним углом 180 градусов. Нет треугольников или 1 треугольник?Ответы:
ПостГИС, 162
Я думаю, что это соответствует правилам. Это запрос к PostGIS, который является расширением PostgreSQL. Предполагается, что входные данные представляют собой таблицу координат для каждой строки с именем L. Выходные данные представляют собой набор строк с определением полигонов для сформированных треугольников.
В использовании это выглядит следующим образом
Выход выглядит следующим образом
источник
Mathematica
915 395 401405Обновить
Эта задача программирования гораздо сложнее, чем кажется на первый взгляд.
Настоящий подход работает с простыми случаями, когда существует только одно пересечение по длине любого отрезка. При наличии нескольких пересечений вдоль одного сегмента необходимо отслеживать все точки пересечения вдоль каждой линии и создавать новые подсегменты (следовательно, дополнительные ребра графа), соединяющие новое пересечение со всеми точками пересечения вдоль целевой линии.
Несмотря на это ограничение, возможно, стоит поделиться логикой, лежащей в основе нынешнего подхода.
Сегменты входных линий обрабатываются как регионы. Если они пересекаются, центр тяжести будет координатами пересечения. Нам нужно устранить те пересечения, которые встречаются в вершинах отрезков. Линии, которые не пересекаются, будут иметь неопределенный центроид.
Для каждой точки пересечения создаются четыре новых ребра. Они соединяют точку пересечения с четырьмя вершинами двух пересекающихся линий.
График, такой как приведенный ниже справа, создается с использованием как старых, так и новых ребер.
Вершины - это координаты соответствующих точек. Циклы, т. Е. Замкнутые петли из трех вершин, будут треугольниками при условии, что эти три вершины не коллинеарны.
В настоящее время мы проверяем, имеет ли какой-либо «треугольник» неопределенную область. (По некоторым причинам он не возвращает область 0 для трех коллинеарных точек.)
Простой пример
Ниже (а) фигура изображена на координатной плоскости и (б) график , показывающий данные узлы, а также узел пересечения,
{114/23, 314/69}
. В последнем случае вершины не расположены в соответствующих декартовых координатах.Может показаться, что на правом рисунке их больше, чем на левом. Но помните, что слева есть перекрывающиеся ребра графа. Каждая диагональ на самом деле соответствует 3 ребрам графа!
Каждая строка ниже представляет собой треугольник.
Более сложный пример
Вот график, соответствующий входным координатам. Вершины находятся в ожидаемых декартовых координатах. (Если вы запустите гольф-код, он покажет вершины в другом месте, при этом соблюдая метки и ребра вершин. Для удобства чтения я назначил координаты вершин, используя дополнительный код, не необходимый для решения.)
Вот полученный график.
Он включает в себя производную точку пересечения
(0,1/11)
, где некоторые входные линии пересекаются.В коде найдено 19 треугольников. Девять из них имеют точку,
(0,1/11)
как одну из вершин.источник
Ява,
10511004(Полностью рабочая программа)
Я подумал, что это хорошая задача не только для игры в гольф, но и для практики написания математических функций.
И чтобы нарисовать «базовую линию», я сделал это на Java * Ждет, когда все начнут смеяться * .
Код
вход
Целые числа через пробел В парах по 4 (x1, y1, x2, y2)
Вывод (реальный вывод не округляется до 3 десятичных знаков)
Каждая строка содержит один треугольник. Каждая строка состоит из разделенных пробелами плавающих точек в парах по 2 (x1, y1, x2, y2, x3, y3). (Примечание: порядок 3 точек, которые образуют треугольник, не определен.)
объяснение
Я начал писать метод, чтобы найти пересечение между двумя бесконечными линиями. Результирующий метод для стиля Java довольно короткий (246). Вместо того, чтобы позволить вводу метода состоять из 8 двойных или двух точек (P), я выбираю использовать произвольный параметр для сохранения большого количества символов. Чтобы минимизировать использование оператора массива, каждый параметр, используемый более 2 раз, помещается в собственную переменную.
Дополнительные пояснения будут добавлены ... (этот ответ, вероятно, может быть еще больше в гольфе)
источник
BBC BASIC
Эмулятор на http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Я ожидаю, что это в гольф в 400-х годов.
Ввод, вывод
Каждый раз, когда пользователь вводит новую строку, программа проверяет, были ли созданы новые треугольники, и немедленно выводит их, см. Ниже.
Новый треугольник создается везде, где новая линия пересекается с двумя ранее существующими линиями, которые также взаимно пересекаются (за исключением случаев, когда все три линии пересекаются в точке, что является особым случаем, с которым нужно иметь дело.)
Код
Основная программа настолько проста, насколько это возможно. В конце находится функция, которая выполняет сложную задачу обнаружения пересечений, по формуле в http://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
Функция возвращает ноль, если пересечения нет, и ненулевое число с плавающей точкой, если оно есть. Это также имеет побочный эффект: координаты пересечения добавляются к строке z $. Кроме того, в BBC basic переменные функции видны основной программе при условии, что основная программа не имеет переменной с тем же именем (даже после завершения функции).
Поэтому основная программа имеет доступ к переменным
x
иy
, и,m
иn
, которые хранят координаты текущего и предыдущего пересечений. Это используется для определения, действительно ли мы нашли треугольник, а не только три линии, пересекающиеся в точке.источник