Проблема : Подсчитайте количество отверстий в соединенном многоугольнике. Связность многоугольника гарантируется условием, что каждый треугольник во входной триангуляции разделяет по крайней мере 1 сторону с другим треугольником и что существует только один такой связанный набор треугольников.
Входной список L
из n
точек на плоскости , а также список T
из 3-кортежей с элементами из 0...n-1
. Для каждого элемента в T
кортеже (t_1,t_2,t_3)
представлены три вершины (из списка L
) треугольника в триангуляции. Обратите внимание, что это триангуляция в смысле «полигональной триангуляции» , потому что в этом T
перекрытии никогда не будет двух треугольников . Дополнительным условием является то, что вам не придется очищать входные данные L
и T
не содержать повторов.
Пример 1. Если L = {{0,0},{1,0},{0,1},{1,2}}
и T = {{0,1,2},{1,2,3}}
тогда указанный полигон имеет число отверстий 0.
Пример 2 : если L = {{0,0},{1,0},{2,0},{2,1},{2,2},{1,2},{0,2},{0,1},{.5,.5},{1.5,.5},{1.5,1.5},{.5,1.5}}
и T = {{5,6,11},{5,10,11},{4,5,10},{3,8,10},{2,3,9},{2,8,9},{1,2,8},{0,1,8},{0,8,11},{0,7,11},{6,7,11},{3,4,10}}
тогда ввод полигона должен привести к выводу 2.
Задача состоит в том, чтобы написать самую короткую программу (или функцию), которая принимает L
и в T
качестве входных данных и возвращает количество отверстий. «Победитель» будет признан как запись с наименьшим количеством символов (ориентировочная дата окончания 1 июня).
Пример форматирования ввода (обратите внимание на индексирование 0):
0,0
1,0
0,1
1,2
0,1,2
1,2,3
T=1,2,3/1,2,4/5,6,7/5,6,8
,. Каждый треугольник разделяет ребро с другим треугольником, но триангуляция отключенаT=1,2,3/1,4,5
подключен, но не подключен к границе)Ответы:
GolfScript (23 символа)
Предполагает формат ввода, используя обозначение массива GolfScript и кавычки (или целые) координаты. Например
( Онлайн эквивалент )
или же
( Онлайн эквивалент )
источник
Python, 71
Далее следует программа (а не функция ), которая вычисляет желаемое число.
Пример использования:
источник
APL, 36
Функция принимает в
L
качестве левого аргумента иT
правого.Например:
Объяснение, идущее справа налево:
⍴⍺,⍵
объединяет два входных вектора и возвращает их длину (V + F
)¨⍵
применяет функцию слева к каждому элементу правого аргумента и возвращает результат⍵,⍵
возвращает правильный аргумент, объединенный с самим собой3 2⍴
формирует векторный аргумент в три пары. В этом случае он соединяет вместе первый и второй, третий и первый, а также второй и третий элементы вектора.,/
объединяет векторный аргумент⍵[⍋⍵]
сортирует правильный аргумент∪/
отфильтровывает любые дубликаты⍴⊃
превращает вложенный скаляр в вектор и возвращает его длину.E
)1
говорит само за себя (я надеюсь ...)Вся функция затем возвращает
1+E-(V+F)
, или1-(F+V-E)
.источник
Mathematica, 93 (пока не очень много в гольфе)
(Пробелы добавлены для ясности)
Тестирование:
источник
Erosion
)?Рубин, 239 символов (227 корпус)
обратите внимание, что я рассматриваю только топологию. Я не использую позиции вершин в любом случае.
вызывающая сторона (ожидает T в формате Mathematica или JSON):
Тест:
источник
Mathematica
76 73 72 6762После долгих экспериментов я понял, что точное расположение вершин не имеет значения, поэтому я представил проблему с графами. Существенные инварианты, количество треугольников, ребер и вершин оставались неизменными (при условии, что пересечение линий было исключено).
На графике было два вида внутренних «треугольников»: это были предположительно лица, то есть «заполненные» треугольники, и те, где их не было. Количество внутренних граней не имело никакого отношения к ребрам или вершинам. Это означало, что прокалывание отверстий в полностью «заполненных» графиках только уменьшало количество граней. Я играл систематически с вариациями среди треугольников, отслеживая грани, вершины и ребра. В конце концов я понял, что число дырок всегда было равно 1 - #faces - # vertices + #edges. Это оказалось равным 1 минус характеристика Эйлера (о которой я знал только в контексте правильных многогранников), хотя длина ребер явно не имела значения.
Приведенная ниже функция возвращает количество отверстий при вводе вершин и треугольников. В отличие от моего более раннего представления, это не полагается на сканирование изображения. Вы можете думать об этом как о 1 - характеристике Эйлера, то есть 1 - (F + V -E) где
F
= #faces,V
= # вершин,E
= # ребер. Функция возвращает количество отверстий,1 - (F + V -E)
учитывая фактические грани (треугольники) и вершины.Легко показать, что удаление любого треугольника снаружи комплекса не влияет на характеристику Эйлера, независимо от того, разделяет ли он одну или две стороны с другими треугольниками.
Примечание: строчная буква
v
будет использоваться вместоL
оригинальной формулировки; то есть он содержит сами вершины (не V, количество вершин)f
используется дляT
оригинальной рецептуры; то есть содержит треугольники, представленные в виде упорядоченной тройки индексов вершин.Код
(Спасибо мистеру Волшебнику за то, что он сбрил 5 символов за счет исключения правила замены.)
Пример 1
v = {{0, 0}, {1, 0}, {0, 1}, {1, 2}}; f = {{0, 1, 2}, {1, 2, 3}};
Ноль дыр.
Пример 2
v = {{0, 0}, {1, 0}, {2, 0}, {2, 1}, {2, 2}, {1, 2}, {0, 2}, {0, 1} , {.5, .5}, {1.5, .5}, {1.5, 1.5}, {.5, 1.5}}; f = {{5, 6, 11}, {5, 10, 11}, {4, 5, 10}, {3, 8, 10}, {2, 3, 9}, {2, 8, 9} , {1, 2, 8}, {0, 1, 8}, {0, 8, 11}, {0, 7, 11}, {6, 7, 11}, {3, 4, 10}};
Таким образом, 2 отверстия находятся в примере 2.
источник
MorphologicalEulerNumber[]
). Мма 9.01, Win XP.MorphologicalEulerNumber
иногда требуется изображение; он отказывается принимать графический объект. В этих случаях размер отверстия и разрешение имеют решающее значение (см. Codegolf.stackexchange.com/questions/8706/… ). Но здесь он работает напрямую с объектом Graphics, который явно содержит все вершины. Я предполагал (или надеялся), что он будет использовать подход, который не зависит от изображения. Хотел бы я знать, как он пытался решить проблему. Возможно, некоторые ошибки в исходном коде функции прояснят ситуацию.Python, 107
Я понял, что брать пары было короче, чем
from itertools import*
печататьcombinations()
. Тем не менее, я также заметил, что мое решение основывалось на входных треугольных гранях, чьи вершины перечислены в последовательном порядке. Поэтому выигрыш в количестве персонажей не так велик.Питон, 115
Характерный подход Эйлера, многословия itertools кажется невозможным избежать. Интересно, будет ли дешевле использовать более прямую технику для создания пар вершин?
Пример использования:источник