Знайдіть внутрішню петлю


14

Завдання

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

напр

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

І розташування на циклі

напр

(7,1)

Ви повинні знайти внутрішню і зовнішню петлю

напр

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Технічні умови

  • Ви можете приймати дані для діаграми у вигляді рядка, розділеного новими рядками або очевидним еквівалентом

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

  • Бажаний вихід - це двовимірний масив правдивих і хибних значень, проте рядки 1та 0розділені новими рядками або будь-яким очевидним еквівалентом останніх двох приймаються. Всередині і зовні повинні бути різні значення істини, але не важливо, що є.

  • Цикл визначається як група символів, така що вони всі однакові ( наприклад@ ), так що кожен символ у циклі має шлях до початкового символу (Символ за координатою введення), який проходить лише через той самий символ (Геометрія таксабітів Без діагоналей ).

  • Всередині знаходиться сама петля та місця, які не можуть досягти краю діаграми, не перетинаючи цикл.

  • Зовні є скрізь

  • Це

Випробування

PasteBin


Чи можемо ми також прийняти координати як лінійну координату в рядку?
недолік

@flawr Ви можете.
Пост Рок-Гарф Мисливець

Чи дозволяється нам приймати схему як матрицю символів, що-небудь. як [['.', '.'],['.', '@']]замість рядка з новими рядками?
hbaderts

@hbaderts Це очевидний еквівалент
Post Rock Garf Hunter

1
@WheatWizard Дякую за додатковий тестовий випадок! Однак я б рекомендував покласти їх у фрагмент або в суть / пастину, щоб зробити виклик трохи більш занепокоєним =)
недолік

Відповіді:


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')

Я думаю, що для гольфу Octave краще, так що ви можете зменшити його принаймні до 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є частиною панелі інструментів для обробки зображень.

1
Ласкаво просимо до codegolf!
rahnema1

@ rahnema1: Здивований, що я не відвідував раніше, оскільки я займався гольфу на SO, перш ніж цей сайт народився.
gnovice
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.