Marching Squares - это алгоритм компьютерной графики, который используется для восстановления 2D-изоконтур из сетки образцов (см. Также его старшего брата Marching Cubes для настроек 3D). Идея состоит в том, чтобы обрабатывать каждую ячейку сетки независимо и определять контуры, проходящие через эту ячейку, на основе значений в ее углах.
Первым шагом в этом процессе является определение того, какие ребра соединены контурами, на основе того, находятся ли углы выше или ниже значения контура. Для простоты мы будем рассматривать только контуры вдоль значения 0
, так что нас интересует, являются ли углы положительными или отрицательными. Есть случаи, чтобы выделить:24 = 16
Источник изображения: Википедия
Идентификация белого и черного здесь не имеет значения, но для определенности скажем, что белый - это позитив, а черный - негатив. Мы будем игнорировать случаи, когда один из углов точно 0
.
Седловые точки (случаи 5 и 10) создают небольшую дополнительную сложность: неясно, какие диагонали следует использовать, только глядя на углы. Эту проблему можно решить, найдя среднее значение по четырем углам (т.е. приблизительное значение центра) и выбрав диагонали так, чтобы контуры отделяли центр от углов с противоположным знаком. Если среднее значение точно 0
, может быть выбран любой случай.
Обычно эти 16 случаев просто хранятся в справочной таблице. Это здорово для эффективности, но, конечно, мы бы предпочли, чтобы код был коротким . Таким образом, ваша задача - выполнить этот шаг поиска и напечатать ASCII-представление дела в как можно меньшем количестве кода.
Соревнование
Вам даны значения четырех углов (ненулевые целые числа) в фиксированном порядке по вашему выбору. Затем вы должны сгенерировать правильное расположение контуров, правильно разрешив случаи седловых точек.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Ввод может быть сделан в любой удобной строке или формате списка.
16 случаев будут представлены в виде ASCII с использованием одного из следующих блоков 5x5:
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
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Вы не должны печатать начальные или конечные пробелы, но вы можете напечатать один необязательный символ новой строки.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
В тестовых примерах предполагается, что входные данные даны в следующем порядке: верхний левый , верхний правый , нижний левый , нижний правый . Тестовые случаи представлены в 9 группах, каждая из которых соответствует каждому из 9 представлений, указанных выше (в том же порядке, начиная с пустой ячейки и заканчивая двумя седловыми точками).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Кроме того, следующие тестовые примеры могут возвращать любую из седловых точек (на ваш выбор):
[1, -4, -2, 5]
[-1, 4, 2, -5]