ループの内側を見つける


14

仕事

ループのASCII図を考える

例えば

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

そしてループ上の場所

例えば

(7,1)

ループの内側と外側を見つける必要があります

例えば

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

仕様書

  • 改行または明らかな同等物で区切られた文字列としてダイアグラムの入力を取得できます

  • 入力の一部として、ループ上の座標(インデックスが0または1)を受け取ります。希望する場所に原点を配置できます。この座標はで(<row>, <column>)(<column>, <row>)または文字列の線形位置として取得できます。これらのデータは、合理的な方法で受け取ることができます。ループ上のすべての文字は、そのインデックスの文字と同じになります。

  • 好適出力しかし、ストリングのtruthyとfalsy値の2次元配列である10改行以降両者の明らかな等価受け入れられることによって分離しました。内側と外側は異なる真理値を持っている必要がありますが、どちらがどちらであるかは関係ありません。

  • ループは、すべて同じ文字(たとえば@)であり、ループ内のすべての文字が元の文字(入力の座標にある文字)へのパスを持ち、同じ文字のみを通過するように、文字のグループとして定義されます。文字(Taxicabジオメトリ斜めなし)。

  • 内部はすべてループそのものであり、ループを通過せずにダイアグラムの端に到達できない場所です。

  • 外はどこにでもある

  • これは

テストケース

ペーストビン


座標を文字列の線形座標としてとることもできますか?
flawr

@flawrできます。
ポストロックガーフハンター

ダイアグラムを文字のマトリックスとして取ることができますか?などの[['.', '.'],['.', '@']]代わりに改行を含む文字列の?
hbaderts

@hbadertsそれは明らかに同等です
ポストロックガーフハンター

1
@WheatWizard追加のテストケースをありがとう!ただし、チャレンジを少しすっきりさせるために、スニペットまたは要点/ペーストビンに入れることをお勧めします=)
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')

-66バイトをありがとう@ rahnema1 !!!

今、それはオンライン試してみてください!しかし、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')

ゴルフではオクターブの方が良いと思うので、少なくとも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でいくつかゴルフをしたので、私はすぐに訪問しませんでした。
グノーヴィス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.