Возьмите двухмерную область пространства, разделенную на выровненные по оси единичные квадратные элементы с центрами, выровненными через целые интервалы. Ребро называется внутренним, если оно совместно используется двумя элементами, в противном случае это внешнее ребро.
Ваша цель - найти минимальное количество соседних элементов, которые необходимо пройти, чтобы достичь внешнего ребра, начиная с центра каждого элемента, известного как traversal distance
, или distance
для краткости. Вы можете проходить только через край (то есть без углового резания / диагонального перемещения). Обратите внимание, что «внешние элементы» (элементы, которые имеют по крайней мере один внешний край), как полагают, должны пройти через 0
соседние элементы, чтобы достичь внешнего края.
вход
Входные данные представляют собой список неотрицательных целочисленных парных координат, обозначающих (x, y) центра всех элементов. Предполагается, что нет перекрывающихся элементов (т. Е. Пара x / y однозначно идентифицирует элемент). Вы не можете предполагать что-либо о порядке ввода элементов.
Вы можете преобразовать источник ввода в любое место (например, 0,0 или 1,1 и т. Д.).
Вы можете предположить, что все входные элементы связаны, или, другими словами, возможно перейти от любого одного элемента к любому другому элементу, используя правила выше. Обратите внимание, что это не означает, что 2D-область просто связана; в нем могут быть отверстия.
Пример: ниже приведен неверный ввод.
0,0
2,0
проверка ошибок не требуется.
Ввод может быть из любого источника (файл, stdio, параметр функции и т. Д.)
Выход
Выходными данными должен быть список координат, идентифицирующих каждый элемент, и соответствующее целочисленное расстояние, пройденное для достижения края. Вывод может быть в любом порядке элементов (например, вам не нужно выводить элементы в том же порядке, что и входные данные).
Вывод может быть любым источником (файл, stdio, возвращаемое значение функции и т. Д.)
Любые выходные данные, которые соответствуют координате элемента с его внешним расстоянием, хороши, например, все это хорошо:
x,y: distance
...
[((x,y), distance), ...]
[(x,y,distance), ...]
Примеры
Текстовые примеры ввода находятся в форме x,y
, с одним элементом на строку; Вы можете изменить это в удобный формат ввода (см. правила формата ввода).
Текстовые примеры выводятся в формате x,y: distance
с одним элементом на строку; опять же, вы можете изменить это в удобный формат вывода (см. правила формата вывода).
Графические фигуры имеют нижнюю левую границу как (0,0), а числа внутри представляют ожидаемое минимальное расстояние, пройденное для достижения внешнего края. Обратите внимание, что эти цифры предназначены только для демонстрационных целей; ваша программа не должна выводить их.
Пример 1
вход:
1,0
3,0
0,1
1,2
1,1
2,1
4,3
3,1
2,2
2,3
3,2
3,3
Выход:
1,0: 0
3,0: 0
0,1: 0
1,2: 0
1,1: 1
2,1: 0
4,3: 0
3,1: 0
2,2: 1
2,3: 0
3,2: 0
3,3: 0
графическое представление:
Пример 2
вход:
4,0
1,1
3,1
4,1
5,1
6,1
0,2
1,2
2,2
3,2
4,2
5,2
6,2
7,2
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
2,4
3,4
4,4
5,4
6,4
3,5
4,5
5,5
выход:
4,0: 0
1,1: 0
3,1: 0
4,1: 1
5,1: 0
6,1: 0
0,2: 0
1,2: 1
2,2: 0
3,2: 1
4,2: 2
5,2: 1
6,2: 1
7,2: 0
1,3: 0
2,3: 1
3,3: 2
4,3: 2
5,3: 2
6,3: 1
7,3: 0
8,3: 0
2,4: 0
3,4: 1
4,4: 1
5,4: 1
6,4: 0
3,5: 0
4,5: 0
5,5: 0
графическое представление:
Пример 3
вход:
4,0
4,1
1,2
3,2
4,2
5,2
6,2
8,2
0,3
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
9,3
1,4
2,4
3,4
4,4
5,4
6,4
7,4
8,4
9,4
2,5
3,5
4,5
5,5
6,5
9,5
10,5
11,5
3,6
4,6
5,6
9,6
10,6
11,6
6,7
7,7
8,7
9,7
10,7
11,7
выход:
4,0: 0
4,1: 0
1,2: 0
3,2: 0
4,2: 1
5,2: 0
6,2: 0
8,2: 0
0,3: 0
1,3: 1
2,3: 0
3,3: 1
4,3: 2
5,3: 1
6,3: 1
7,3: 0
8,3: 1
9,3: 0
1,4: 0
2,4: 1
3,4: 2
4,4: 2
5,4: 2
6,4: 1
7,4: 0
8,4: 0
9,4: 0
2,5: 0
3,5: 1
4,5: 1
5,5: 1
6,5: 0
9,5: 0
10,5: 0
11,5: 0
3,6: 0
4,6: 0
5,6: 0
9,6: 0
10,6: 1
11,6: 0
6,7: 0
7,7: 0
8,7: 0
9,7: 0
10,7: 0
11,7: 0
графическое представление:
счет
Это код гольф. Самый короткий код в байтах побеждает. Применяются стандартные лазейки. Разрешены любые встроенные модули, кроме специально разработанных для решения этой проблемы.
Ответы:
MATLAB / Octave, 143 байта
Ungolfed
объяснение
Создать S Ource и R esult матрицу соответствующего размера, наполненный нули.
Вычислить линейные индексы, которые соответствуют
xy
-парам, с заполнением одним элементом на границах.Нарисуйте структуру.
S
показано здесь для примера 2 :Удалить все граничные элементы путем эрозии изображения
с помощью структурирующего элемента диска с радиусом 1 :
Если бы диагональное движение было разрешено, мы бы вместо этого использовали прямоугольник:
Затем увеличьте результат для всех элементов без границ
и цикл, пока изображение не будет полностью размыто.
Вернуть результат для каждой
xy
пары.источник
Pyth, 26 байт
Пример 2
Формат вывода, который я использовал:
То есть список, содержащий точку, за которой следует расстояние от внешней стороны.
Код работает с использованием набора, достигнутого в данный момент, для каждой точки, отфильтровывая входные данные для всех точек на точном расстоянии 1 от этой точки, и проверяя, равно ли полученное число точек в 4 раза, чем начальное число, и повторяя до тех пор, пока это не произойдет. , Когда начинается в данной точке, это дает, как далеко эта точка от внешней.
источник
MATL ,
38373633 байтаПри этом используется текущая версия (15.0.0) языка / компилятора.
Формат ввода: один массив со значениями x и один массив со значениями y . Вход и выход основаны на 1. Таким образом, тестовые случаи имеют следующие входные данные:
Попробуйте онлайн!
объяснение
Матрица изначально строится с 1 на входных позициях и 0 в противном случае. Затем применяется свертка с маской "Север, Восток, Юг, Запад" (
[0 1 0; 1 0 1; 0 1 0]
), и результат в каждой позиции сравнивается с 4. Результат 4 означает, что эта позиция окружена другими точками, и поэтому имеет расстояние - to-external как минимум 1. Результат (0 или 1 для каждой точки) добавляется к исходной матрице. Эти позиции теперь содержат 2 (в конце процесса матрица будет уменьшена на 1).Процесс свертки повторяется. Для следующей итерации входной сигнал свертки представляет собой накопленную матрицу с порогом 2; то есть значения ниже 2 устанавливаются в 0. Результат свертки показывает, какие точки имеют расстояние не менее 2 (все их соседи имеют расстояние 1).
Количество итераций для удобства выбрано в качестве количества столбцов входной матрицы. Этого достаточно (на самом деле максимальное требуемое количество итераций составляет половину минимального размера матрицы). Последние итерации могут быть бесполезными, но не причиняют вреда (они просто добавляют 0 ко всем точкам).
В конце процесса 1 вычитается из результата, потому что позиции со значением k имеют расстояние k -1 до внешней стороны. Координаты и значения всех позиций извлекаются и отображаются.
источник
Python 3,
180166160 байтМы знаем, что если у координаты меньше четырех соседей, она должна быть на «внешности». Поэтому мы можем многократно обрезать внешние ячейки и назначить им расстояние, равное количеству итераций / глубине рекурсии в этом случае.
Определенно подумайте, есть ли место для улучшений. Какой лучший способ проверки соседних соседей?
редактировать: мне нужно разрешить принимать список пар в качестве кортежей.
источник
PHP, 316 байт
Онлайн версия
Сломать
Визуализируйте как символы Ascii
источник