Фон
Я хочу построить забор. Для этого я собрал несколько столбов и прикрепил их к земле. Я также собрал много досок, которые я прибил к полюсам, чтобы сделать настоящий забор. Я склонен увлекаться сборкой вещей, и, скорее всего, я просто буду прибивать доски к столбам, пока не останется места для их размещения. Я хочу, чтобы вы перечислили возможные заборы, которые я могу закончить.
вход
Ваш ввод представляет собой список двумерных целочисленных координат, представляющих положения полюсов, в любом удобном формате. Вы можете предположить, что он не содержит дубликатов, но вы не можете ничего сказать о его порядке.
Доски представлены прямыми линиями между полюсами, и для простоты мы рассмотрим только горизонтальные и вертикальные доски. Два полюса могут быть соединены доской, если между ними нет других полюсов или досок, то есть доски не могут пересекать друг друга. Расположение столбов и досок является максимальным, если к нему нельзя добавить новые доски (эквивалентно, между любыми двумя горизонтально или вертикально выровненными полюсами есть либо столб, либо доска.
Вывод
Ваш вывод - это количество максимальных аранжировок, которые могут быть построены с использованием полюсов.
пример
Рассмотрим список ввода
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Если смотреть сверху, соответствующее расположение полюсов выглядит примерно так:
o
o o
o o
o o
o
Есть ровно три максимальных расположения, которые могут быть построены с использованием этих полюсов:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Таким образом, правильный вывод 3
.
правила
Вы можете написать либо функцию, либо полную программу. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
, хороший улов. Меняется сейчас.Ответы:
Mathematica, 301 байт
Это безымянная функция, которая принимает координаты как вложенные
List
и возвращает целое число. То есть вы можете либо дать ему имя и назвать его, либо просто добавитьС отступом:
Я даже не могу выразить, насколько наивна эта реализация ... она определенно не может быть более грубой силой ...
o--o--o
получается только два забора вместо трех).Удивительно, но он решает все тесты практически сразу.
Я обнаружил, что по-настоящему изящный трюк заключается в том,
Orderless
чтобы сократить количество паттернов, которым я должен соответствовать. По сути, когда я хочу разбить наборы ограждений пересекающимися изгородями, мне нужно найти пару вертикальных и горизонтальных ограждений и проверить их состояние. Но я не знаю, в каком порядке они будут отображаться. Поскольку шаблоны списков обычно зависят от порядка, это приведет к двум действительно длинным шаблонам. Поэтому вместо этого я заменяю окружающий список на функциюt
сt @@@
- которая не определена, поэтому она сохраняется как есть. Но эта функция естьOrderless
, поэтому я могу просто проверить один порядок в шаблоне, а Mathematica проверит его по всем перестановкам. После этого я вернул списки на местоList @@@
.Хотелось бы, чтобы была встроенная а)
Orderless
, б) нетListable
и в) не определена для 0 аргументов или списка аргументов. Тогда я мог бы заменитьt
этим. Но, похоже, такого оператора нет.источник
Haskell, 318 байт
Использование:
p [(1,0),(0,1),(-1,0),(0,-1)]
. Вывод:2
Как это работает:
источник