Znajdź wnętrze pętli

14

Zadanie

Biorąc pod uwagę schemat pętli ASCII

na przykład

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

I miejsce na pętli

na przykład

(7,1)

Musisz znaleźć wnętrze i na zewnątrz pętli

na przykład

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Dane techniczne

  • Możesz wziąć dane wejściowe do diagramu jako ciąg oddzielony znakami nowej linii lub oczywistym odpowiednikiem

  • Otrzymasz współrzędne w pętli (0 lub 1 indeksowane) jako część swojego wpisu. Możesz umieścić swoje pochodzenie w dowolnym miejscu. Możesz wziąć ten współrzędnych (<row>, <column>), (<column>, <row>)albo jako położenie liniowego na sznurku. Możesz otrzymywać te dane dowolną rozsądną metodą. Wszystkie znaki w pętli będą takie same jak znaki w tym indeksie.

  • Preferowanym wyjściem jest dwuwymiarowa tablica wartości prawdy i fałszu, jednak akceptowane są ciągi znaków 1i 0oddzielone znakami nowej linii lub dowolnego oczywistego odpowiednika dwóch ostatnich . Wewnętrzne i zewnętrzne muszą mieć różne wartości prawdy, ale nie ma znaczenia, który jest który.

  • Pętla jest zdefiniowana jako grupa znaków, tak że wszystkie są tym samym znakiem ( np.@ ) I tak, że każdy znak w pętli ma ścieżkę do oryginalnego znaku (znak na współrzędnej wejściowej), który przechodzi tylko przez ten sam charakter (geometria Taxicab Brak przekątnych ).

  • Wewnątrz znajduje się cała pętla i miejsca, które nie mogą dotrzeć do krawędzi schematu bez przekroczenia pętli.

  • Na zewnątrz jest wszędzie

  • To jest

Przypadki testowe

PasteBin

Post Rock Garf Hunter
źródło
Czy możemy również przyjąć współrzędne jako współrzędne liniowe w ciągu?
flawr
@flawr Możesz.
Post Rock Garf Hunter
Czy wolno nam traktować schemat jako macierz znaków, sth. jak [['.', '.'],['.', '@']]zamiast łańcucha z nowymi liniami?
hbaderts
@hbaderts To oczywisty odpowiednik
Post Rock Garf Hunter
1
@WheatWizard Dzięki za dodatkowy przypadek testowy! Zalecałbym jednak umieszczenie ich we fragmencie lub w paczce / gist / pastebin, aby uczynić wyzwanie nieco bardziej odszyfrowanym =)
flawr

Odpowiedzi:

6

MATLAB, 163 159 146 78 bajtów

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

Dzięki @ rahnema1 za -66 bajtów !!!

Teraz działa na Wypróbuj online! ALE potrzebnych było kilka korekt, ponieważ MATLAB i Octave nie są w pełni kompatybilne.

Wyjaśnienie

Najpierw tworzymy obraz binarny, który po prostu maskuje wszystkie znaki równe początkowemu znakowi. Następnie określamy podłączony komponent, w którym znajduje się początkowy znak.

% 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

Następnie tworzymy obraz tego podłączonego komponentu i stosujemy wypełnienie wszystkich „otworów” w obrazie.

m=bwfill(m,'h')
wada
źródło
Myślę, że do gry w golfa Octave jest lepszy, więc możesz go zmniejszyć do co najmniej 72 bajtów
rahnema1
@ rahnema1 Już zacząłem w MATLAB, więc nie zmienię teraz tego zgłoszenia, ale dziękuję za sugestię =)
flawr
5

MATLAB: 67 bajtów

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

Kilka zastrzeżeń:

  • A zakłada się, że jest tablicą znaków.
  • Indeksy w MATLAB są oparte na 1, z wierszami najpierw indeksowanymi. Zakłada się, że zmiany te zostałyby wprowadzone w danych wejściowych funkcji (tzn. Przykład pytania zostałby wywołany jakooutput = f(A,2,8) ).
  • bwlabeli imfillsą częścią zestawu narzędzi do przetwarzania obrazu.
gnovice
źródło
1
witaj w codegolf!
rahnema1
@ rahnema1: Zdziwiony, że nie odwiedziłem wcześniej, ponieważ grałem w golfa na SO, zanim ta strona się narodziła.
gnovice