Найти внутри петли

14

задача

Дана ASCII диаграмма цикла

например

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

И место на петле

например

(7,1)

Вы должны найти внутри и снаружи петли

например

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Характеристики

  • Вы можете принять ввод для диаграммы в виде строки, разделенной символами новой строки или очевидным эквивалентом

  • Вы получите координату в цикле (0 или 1 с индексом) как часть вашего ввода. Вы можете разместить свое происхождение в любом месте, где пожелаете. Вы можете взять эту координату (<row>, <column>), (<column>, <row>)или как линейное положение на струне. Вы можете получить эти данные любым разумным способом. Все символы в цикле будут такими же, как символы в этом индексе.

  • Предпочтительный выход представляет собой 2 одномерный массив truthy и falsy значений, однако строки 1и 0разделенных символами новой строки или каких - либо очевидных эквивалент позднее двух принимаются. Внутри и снаружи должны быть разные истинностные ценности, но не имеет значения, что есть что.

  • Цикл определяется как группа символов, так что все они являются одним и тем же символом ( например@ ) и чтобы каждый символ в цикле имел путь к исходному символу (символ с координатой ввода), который проходит только через этот же символ. персонаж (геометрия такси без диагоналей ).

  • Внутри находится вся петля и места, которые не могут достичь края диаграммы без пересечения петли.

  • Снаружи везде

  • Это

Тестовые случаи

Pastebin

Пост Рок Гарф Хантер
источник
Можем ли мы также взять координаты в качестве линейной координаты в строке?
flawr
@flawr Вы можете.
Сообщение Рок Гарф Хантер
Разрешено ли нам принимать диаграмму в качестве матрицы символов? как [['.', '.'],['.', '@']]вместо строки с символами новой строки?
hbaderts
@hbaderts Это очевидный эквивалент
Post Rock
1
@WheatWizard Спасибо за дополнительный контрольный пример! Тем не менее, я бы порекомендовал поместить их во фрагмент или в gist / pastebin, чтобы сделать задачу немного более разреженной =)
flawr

Ответы:

6

MATLAB, 163 159 146 78 байт

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

Спасибо @ rahnema1 за -66 байт !!!

Теперь это работает. Попробуйте онлайн! НО потребовались некоторые корректировки, поскольку MATLAB и Octave не полностью совместимы.

объяснение

Сначала мы создаем двоичное изображение, которое просто маскирует все символы, которые равны начальному символу. Затем мы определяем связанный компонент, в котором находится начальный символ.

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

После этого мы создаем изображение этого подключенного компонента и применяем заполнение всех «дырок» в изображении.

m=bwfill(m,'h')
flawr
источник
Я думаю, что для игры в гольф октава лучше, так что вы можете уменьшить ее как минимум до 72 байтов
rahnema1
@ rahnema1 Я уже начал в MATLAB, поэтому я не собираюсь менять это представление сейчас, но спасибо за предложение =)
flawr
5

MATLAB: 67 байт

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

Пара предостережений:

  • A Предполагается, что это массив символов.
  • Индексы в MATLAB основаны на 1, строки индексируются первыми. Предполагается, что эти изменения будут внесены во входные данные функции (то есть пример вопроса будет называться как output = f(A,2,8)).
  • bwlabelи imfillявляются частью панели инструментов обработки изображений.
gnovice
источник
1
добро пожаловать в Codegolf!
rahnema1
@ rahnema1: Удивительно, что я не посетил раньше, так как я играл в гольф на SO до того, как появился этот сайт.
gnovice