Encuentra el interior de un bucle

14

Tarea

Dado un diagrama ASCII de un bucle

p.ej

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

Y una ubicación en el circuito

p.ej

(7,1)

Debes encontrar el interior y el exterior del bucle.

p.ej

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Especificaciones

  • Puede tomar la entrada para el diagrama como una cadena separada por nuevas líneas o equivalente obvio

  • Recibirá una coordenada en el bucle (0 o 1 indexado) como parte de su entrada. Puede colocar su origen en cualquier lugar que desee. Puede tomar esta coordenada en (<row>, <column>), (<column>, <row>)o como la posición lineal en la cadena. Puede recibir estos datos en cualquier método razonable. Todos los caracteres en el bucle serán los mismos que los del índice.

  • La salida preferida es una matriz bidimensional de valores de verdad y falsedad, sin embargo, se aceptan cadenas de 1y 0separadas por líneas nuevas o cualquier equivalente obvio de las dos últimas. El interior y el exterior deben tener valores de verdad diferentes, pero no importa cuál es cuál.

  • Un bucle se define como un grupo de caracteres de modo que todos sean el mismo carácter ( por ejemplo@ ) y de modo que cada carácter en el bucle tenga una ruta al carácter original (el carácter en la coordenada de entrada) que solo pasa por ese mismo carácter (geometría del taxi sin diagonales ).

  • El interior es todo el bucle en sí y los lugares que no pueden alcanzar el borde del diagrama sin cruzar el bucle.

  • El exterior está en todas partes.

  • Esto es

Casos de prueba

PasteBin

Post Rock Garf Hunter
fuente
¿Podemos también tomar las coordenadas como coordenadas lineales en la cadena?
flawr
@flawr Puedes.
Post Rock Garf Hunter
¿Se nos permite tomar el diagrama como una matriz de caracteres, algo? como en [['.', '.'],['.', '@']]lugar de una cadena con líneas nuevas?
hbaderts
@hbaderts Eso es un equivalente obvio
Post Rock Garf Hunter
1
@WheatWizard ¡Gracias por el caso de prueba adicional! Sin embargo, recomendaría ponerlos en un fragmento o en un gist / pastebin, para que el desafío sea un poco más despejado =)
error

Respuestas:

6

MATLAB, 163159146 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')

Gracias @ rahnema1 por -66 bytes !!!

Ahora funciona en ¡ Pruébalo en línea!PERO se necesitaron algunos ajustes, ya que MATLAB y Octave no son totalmente compatibles.

Explicación

Primero creamos una imagen binaria que enmascara todos los caracteres que son iguales al carácter inicial. Luego determinamos el componente conectado en el que se encuentra el carácter inicial.

% 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

Después de eso, creamos una imagen de ese componente conectado y aplicamos rellenar todos los "agujeros" en la imagen.

m=bwfill(m,'h')
falla
fuente
Creo que para jugar al golf, Octave es mejor, por lo que puede reducirlo a al menos 72 bytes
rahnema1
@ rahnema1 Ya comencé en MATLAB, así que no voy a cambiar esta presentación ahora, pero gracias por la sugerencia =)
error
5

MATLAB: 67 bytes

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

Un par de advertencias:

  • A se supone que es una matriz de caracteres.
  • Los índices en MATLAB están basados ​​en 1, con las filas indexadas primero. Se supone que estos cambios se realizarían en la entrada de la función (es decir, el ejemplo de la pregunta se llamaría como output = f(A,2,8)).
  • bwlabely imfillson parte de Image Processing Toolbox.
gnovice
fuente
1
bienvenido a codegolf!
rahnema1
@ rahnema1: Sorprendido, no visité antes, ya que jugué golf en SO antes de que naciera este sitio.
gnovice