Encontre o interior de um loop

14

Tarefa

Dado um diagrama ASCII de um loop

por exemplo

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

E um local no loop

por exemplo

(7,1)

Você deve encontrar o interior e o exterior do loop

por exemplo

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Especificações

  • Você pode receber entradas para o diagrama como uma sequência separada por novas linhas ou equivalente óbvio

  • Você receberá uma coordenada no loop (0 ou 1 indexado) como parte de sua entrada. Você pode colocar sua origem em qualquer lugar que desejar. Você pode levar essa coordenada (<row>, <column>),(<column>, <row>) ou como a posição linear na corda. Você pode receber esses dados de qualquer maneira razoável. Todos os caracteres no loop serão iguais aos caracteres nesse índice.

  • A saída preferida é uma matriz bidimensional de valores de verdade e falsidade, no entanto, cadeias de caracteres 1e 0separadas por novas linhas ou qualquer equivalente óbvio das duas últimas são aceitas. O interior e o exterior devem ter valores de verdade diferentes, mas não importa qual é qual.

  • Um loop é definido como um grupo de caracteres, de modo que todos tenham o mesmo caractere ( por exemplo@ ) e, para que cada caractere no loop tenha um caminho para o caractere original (o caractere na coordenada de entrada) que passa apenas pelo mesmo caractere (geometria do táxi, sem diagonais ).

  • O interior é todo o loop em si e os lugares que não podem alcançar a borda do diagrama sem cruzar o loop.

  • O exterior está em qualquer outro lugar

  • Isso é

Casos de teste

PasteBin

Post Rock Garf Hunter
fonte
Também podemos tomar as coordenadas como coordenadas lineares na string?
precisa saber é
@ flawr Você pode.
Post Rock Garf Hunter
É permitido tomar o diagrama como uma matriz de caracteres, sth. como em [['.', '.'],['.', '@']]vez de uma string com novas linhas?
precisa saber é o seguinte
@hbaderts Isso é uma óbvia equivalente
post rock Garf Hunter
1
@WheatWizard Obrigado pelo caso de teste adicional! No entanto, gostaria de recomendar a colocá-los em um trecho ou em uma essência / pastebin, a fim de fazer o desafio um pouco mais decluttered =)
flawr

Respostas:

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

Obrigado @ rahnema1 por -66 bytes !!!

Agora ele funciona Experimente o online! MAS alguns ajustes foram necessários, pois MATLAB e Octave não são totalmente compatíveis.

Explicação

Primeiro, criamos uma imagem binária que apenas mascara todos os caracteres iguais ao caractere inicial. Em seguida, determinamos o componente conectado no qual o caractere inicial está.

% 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

Depois disso, criamos uma imagem desse componente conectado e aplicamos o preenchimento de todos os "orifícios" na imagem.

m=bwfill(m,'h')
flawr
fonte
Eu acho que para jogar golfe Octave é melhor assim que você pode reduzi-la a pelo menos 72 bytes
rahnema1
@ rahnema1 já começou em MATLAB, então eu não vou mudar esta submissão agora, mas obrigado pela sugestão =)
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');

Algumas advertências:

  • A é assumido como uma matriz de caracteres.
  • Os índices no MATLAB são baseados em 1, com as linhas indexadas primeiro. Supõe-se que essas alterações seriam feitas na entrada da função (ou seja, o exemplo da pergunta seria chamado como output = f(A,2,8)).
  • bwlabele imfillfazem parte da caixa de ferramentas de processamento de imagem.
gnovice
fonte
1
bem-vindo ao codegolf!
precisa saber é o seguinte
@ rahnema1: Espantado por não ter visitado antes, pois jogava golfe no SO antes de este site nascer.
precisa saber é o seguinte