Finde das Innere einer Schleife


14

Aufgabe

Gegeben ein ASCII-Diagramm einer Schleife

z.B

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

Und ein Ort auf der Schleife

z.B

(7,1)

Sie müssen das Innere und Äußere der Schleife finden

z.B

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Spezifikationen

  • Sie können Eingaben für das Diagramm als durch Zeilenumbrüche oder offensichtliche Entsprechungen getrennte Zeichenfolge vornehmen

  • Sie erhalten eine Koordinate in der Schleife (0 oder 1 indiziert) als Teil Ihrer Eingabe. Sie können Ihren Ursprung an einem beliebigen Ort platzieren. Sie können nehmen diese Koordinate in (<row>, <column>), (<column>, <row>)oder als die lineare Position auf der Saite. Sie können diese Daten auf jede angemessene Weise erhalten. Alle Zeichen in der Schleife stimmen mit dem Zeichen an diesem Index überein.

  • Bevorzugte Ausgabe ist eine zweidimensionale Anordnung von Wahrheits- und Falschwerten, jedoch werden Zeichenfolgen von 1und 0getrennt durch Zeilenumbrüche oder ein offensichtliches Äquivalent der beiden letzteren akzeptiert. Das Innere und das Äußere müssen unterschiedliche Wahrheitswerte haben, aber es spielt keine Rolle, welches welches ist.

  • Eine Schleife wird als eine Gruppe von Zeichen definiert, sodass alle Zeichen dasselbe Zeichen sind ( z. B.@ ) und dass jedes Zeichen in der Schleife einen Pfad zum ursprünglichen Zeichen (das Zeichen an der Eingabekoordinate) hat, das nur dasselbe durchläuft Zeichen (Taxigeometrie Keine Diagonalen ).

  • Das Innere ist die gesamte Schleife selbst und die Stellen, die den Rand des Diagramms nicht erreichen können, ohne die Schleife zu überqueren.

  • Das Äußere ist überall anders

  • Das ist

Testfälle

PasteBin


Können wir die Koordinaten auch als lineare Koordinaten in der Zeichenkette verwenden?
Fehler

@flawr Du darfst.
Post Rock Garf Hunter

Dürfen wir das Diagramm als eine Matrix von Zeichen nehmen, etw. wie [['.', '.'],['.', '@']]anstelle einer Zeichenfolge mit Zeilenumbrüchen?
hbaderts

@ hbaderts Das ist ein offensichtliches Äquivalent
Post Rock Garf Hunter

1
@ WheatWizard Danke für den zusätzlichen Testfall! Ich würde jedoch empfehlen, sie in ein Snippet oder in einen Gist / Pastebin zu packen, um die Herausforderung etwas unübersichtlicher zu gestalten =)
flawr

Antworten:


6

MATLAB, 163 159 146 78 Bytes

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

Danke @ rahnema1 für -66 Bytes !!!

Jetzt funktioniert es auf Online testen! ABER einige Anpassungen waren erforderlich, da MATLAB und Octave nicht vollständig kompatibel sind.

Erläuterung

Zuerst erstellen wir ein Binärbild, das nur alle Zeichen maskiert, die dem Anfangszeichen entsprechen. Dann bestimmen wir die verbundene Komponente, in der sich das Anfangszeichen befindet.

% 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

Danach erstellen wir ein Bild dieser verbundenen Komponente und füllen alle "Löcher" im Bild.

m=bwfill(m,'h')

Ich denke, zum Golfen ist Octave besser, also können Sie es auf mindestens 72 Bytes reduzieren
rahnema1

@ rahnema1 Ich habe bereits in MATLAB angefangen, daher werde ich diese Einsendung jetzt nicht ändern, aber danke für den Vorschlag =)
flawr

5

MATLAB: 67 Bytes

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

Ein paar Vorsichtsmaßnahmen:

  • A wird angenommen, dass es sich um ein Zeichenarray handelt.
  • Indizes in MATLAB basieren auf 1, wobei die Zeilen zuerst indiziert werden. Es wird davon ausgegangen, dass diese Änderungen an der Funktionseingabe vorgenommen werden (dh das Fragenbeispiel würde als aufgerufen output = f(A,2,8)).
  • bwlabelund imfillsind Teil der Image Processing Toolbox.

1
Willkommen bei Codegolf!
Rahnema1

@ rahnema1: Ich war erstaunt, dass ich nicht früher zu Besuch war, da ich schon auf SO Golf gespielt habe, bevor diese Seite geboren wurde.
Gnovice
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.