Un laberinto se da como una matriz de 0s (paredes) y 1s (espacio transitable) en cualquier formato conveniente. Cada celda se considera conectada a sus 4 (o menos) vecinos ortogonales. Un componente conectado es un conjunto de celdas transitables todas conectadas transitivamente entre sí. Su tarea es identificar los puntos de corte : celdas transitables que, si se convierten en paredes, cambiarían la cantidad de componentes conectados. Salida de una matriz booleana con 1-s solo en esas ubicaciones. El objetivo es hacerlo en la menor cantidad de bytes de código.
La matriz de entrada constará de al menos 3 filas y 3 columnas. Al menos una de sus celdas será una pared y al menos una será transitable. Su función o programa debe poder procesar cualquiera de los ejemplos a continuación en menos de un minuto en TIO (o en su propia computadora, si el idioma no es compatible con TIO).
in:
11101001
11011101
00000001
11101111
11110101
00011111
10110001
11111111
out:
01000000
00001001
00000001
00000101
00110000
00010000
00000000
11100000
in:
1111111111111111
1000000000000001
1111111111111101
0000000000000101
1111111111110101
1000000000010101
1011111111010101
1010000001010101
1010111101010101
1010101111010101
1010100000010101
1010111111110101
1010000000000101
1011111111111101
1000000000000001
1111111111111111
out:
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
in:
1011010001111010
1111111011101101
1110010101001011
1111001110010010
1111010000101001
0111101001000101
0011100111110010
1001110011111110
0101000011100011
1110110101001110
0010100111000110
1000110111011010
0100101000100101
0001010101100011
1001010000111101
1000111011000010
out:
0000000000111010
1011110001001000
0000000000000011
0000000100010000
0000010000101000
0000001000000100
0000000011000000
1001100000011110
0000000001000010
0110100001000110
0000100101000010
1000100000000000
0100001000000100
0000000100100001
0000010000111000
0000010000000010
Respuestas:
Stax , 40 bytes
Ejecutar y depurar casos de prueba
Este programa toma la entrada como una cadena separada por espacios que contiene filas. La salida está en el mismo formato. Aquí está la representación ascii desempaquetada.
La operación fundamental para contar una isla funciona así.
'1'
con a'2'
.'12|21'
con'22'
.'1'
en la cadena. El número de repeticiones es el número de islas..
Programa adicional de 44 bytes : esta versión ingresa y emite utilizando el formato de cuadrícula.
fuente
MATL , 26 bytes
La entrada es una matriz numérica, que se usa
;
como separador de filas.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Perl 5 ,
-p0
10510196939089 bytesUtiliza en
b
lugar de1
en la entrada.Asegúrese de que la matriz en STDIN termine con una nueva línea
Pruébalo en línea!
Utiliza 3 niveles de sustitución!
Esta versión de 87 bytes es más fácil de interpretar en formato de entrada y salida, pero no compite ya que utiliza 3 caracteres diferentes en la salida:
Pruébalo en línea!
Es fácil guardar otro byte (el
s
modificador regex ) en ambas versiones usando algún carácter diferente (no alfanumérico) como terminador de fila (en lugar de nueva línea), pero eso hace que la entrada sea completamente ilegible nuevamente.Cómo funciona
Considera la sustitución
Esto encontrará dos letras que son diferentes y una al lado de la otra horizontal y verticalmente y las reemplazará por
c
. En un laberinto cuyas rutas consisten completamente en la letra,b
no pasará nada, ya que las letras son las mismas, pero tan pronto como una de las letras sea reemplazada por otra (por ejemploz
), esa letra y un vecino serán reemplazados porc
una aplicación repetida. relleno de inundación del componente conectado con lac
semillaz
.En este caso, sin embargo, no quiero un relleno de inundación completo. Quiero llenar solo uno de los brazos vecinos
z
, así que después del primer paso quiero que sez
vaya. Eso ya funciona con elc$2c
reemplazo, pero luego quiero reiniciar un relleno de inundación a lo largo de otro brazo a partir del mismo punto y ya no sé cuál de losc
s era originalmentez
. Entonces en su lugar usob | a
esc
,b | c
esc
yz | a
es{
. Por lo tanto, en un laberinto con caminos formadosb
y una semillaz
en el primer pasob
será reemplazada porc
yz
será reemplazada por una{
que no es una letra y no coincide\w
y, por lo tanto, no causará más rellenos. Sinc
embargo, esto mantendrá un nuevo llenado de inundación y un brazo vecino de la semilla se llenará. Ej. A partir deEntonces puedo reemplazar todo c por alguna letra que no sea (por ejemplo
-
) y reemplazar{
dez
nuevo para reiniciar el relleno de inundación:y repita este proceso hasta que todos los vecinos de la semilla se hayan convertido. Si luego, una vez más, reemplazo
{
porz
y relleno de inundación:Los
z
restos quedan al final porque no hay ningún vecino con el que hacer una transformación. Eso deja en claro lo que sucede en el siguiente fragmento de código:Encuentra la primera línea nueva. El desplazamiento inicial ahora está en
@-
La expresión regular discutida anteriormente con el
@{-}
número de columnas (ya que simple@-
confunde el analizador perl y no sustituye adecuadamente)El
/\n/
siempre tiene éxito y la sustitución es verdadera siempre que podamos llenarnos de inundaciones. Por lo tanto, la parte posterior&&
se ejecuta si se completa el relleno de un brazo. Si no, el lado izquierdo se evalúa como una cadena vacíaReinicie el relleno de inundación y devuelva 1 si el relleno de inundación anterior hizo algo. De lo contrario, devuelva la cadena vacía. Todo este código está envuelto dentro
Por lo tanto, si esto se ejecuta en una cadena de inicio
$_
con unaz
posición inicial, el código del interior se ejecutará muchas veces, en su mayoría, devolverá nada más que1
cada vez que un brazo vecino se llene de inundaciones. Efectivamente$_
se destruye y se reemplaza por tantos1
s como haya componentes conectados conectadosz
. Tenga en cuenta que el bucle debe ejecutarse hasta la suma de los tamaños de los componentes + el número de veces de brazos, pero eso está bien ya que "número de caracteres, incluidas las nuevas líneas * 2 + 1" veces.El laberinto se desconecta si no hay
1
's (cadena vacía, un vértice aislado) o si hay más de 1 brazos (más de 21
s). Esto se puede verificar usando la expresión regular/\B/
(esto da en0
lugar de1
versiones anteriores de perl. Es discutible cuál está mal). Desafortunadamente, si no coincide, esto dará una cadena vacía en lugar de0
. Sin embargo, els:|.: code :seg
fue diseñado para devolver siempre un número impar, por lo que al hacer un&
con/\B/
esto dará0
o1
.Todo lo que queda es recorrer toda la matriz de entrada y en cada posición transitable se siembra
z
y cuenta los brazos conectados. Eso se hace fácilmente con:El único problema es que en las posiciones no transitables se retiene el valor anterior. Como necesitamos
0
s allí, eso significa que la matriz de entrada original debe tener0
en las posiciones y0
coincidencias no transitables\w
en la sustitución original y provocaría rellenos de inundación. Es por eso que uso\pL
en su lugar (solo letras coincidentes).fuente
Java 8,
503489459455 bytes-18 bytes gracias a @ceilingcat .
Explicación:
Pruébalo en línea.
fuente
Python 2 , 290 bytes
Pruébalo en línea!
-11 bytes gracias a Rod
-11 bytes gracias a Lynn
fuente
F(m,i,j)
para cada elemento, ahorrando 11 bytesfor q in((i,j+1),(i,j-1),(i+1,j),(i-1,j)):
->for q in(i,j+1),(i,j-1),(i+1,j),(i-1,j):
- rm exterior parensF
regresa implícitamenteNone
, puede usar enF(m,i,j)or c
lugar de[F(m,i,j)]and c
.and m[i][j]
puede ser>0<m[i][j]
y[q[:]for q in m]
puede sereval(`m`)
.Wolfram Language (Mathematica) , 118 bytes
Pruébalo en línea!
fuente
Javascript 122 bytes
Entrada / salida como una cadena multilínea.
Para cada celda transitable, coloque un bloque e intente llenar las 4 celdas vecinas. Si la celda actual no es un punto de corte, a partir de cualquier vecino abierto se llenarán todos. De lo contrario, necesitaré más de una operación de llenado para llegar a todas las celdas vecinas.
Menos golf
Prueba
fuente