Dada una entrada de un "camino" de arte ASCII, da salida al camino con todos los callejones sin salida etiquetados.
Este es un camino:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Este es el camino con callejones sin salida etiquetados con la letra X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Un callejón sin salida se define como cualquier azulejo camino que bordea n otros azulejos de carretera, al menos n-1 de las cuales se consideran extremos muertos ya por esta regla. "Bordeando" está en las cuatro direcciones cardinales, por lo que las fichas que bordean diagonalmente no cuentan.
Esta regla se aplica repetidamente, ya que los callejones sin salida recién creados pueden, por sí mismos, crear más callejones sin salida . También tenga en cuenta que cualquier mosaico de carretera que bordee solo otro mosaico de carretera se considera un callejón sin salida la primera vez que se aplica la regla.
La entrada y la salida pueden ser una sola cadena (con líneas separadas por cualquier carácter que no sea #
o .
) o una matriz / lista / etc. Si su idioma lo admite, también puede recibir información con cada línea como argumento de función.
Puede suponer lo siguiente acerca de la entrada:
Siempre habrá al menos un "bucle", es decir, un grupo de
#
caracteres que se pueden seguir infinitamente. (De lo contrario, cada mosaico se convertiría en un callejón sin salida).Esto implica que la entrada siempre será 2 × 2 o mayor, ya que el bucle más pequeño es:
## ##
(Que, dicho sea de paso, debería salir sin cambios).
Todos los
#
personajes estarán conectados. Es decir, si realizara un relleno de inundación en alguno#
, todos ellos se verían afectados.
Como se trata de code-golf , ganará el código más corto en bytes.
El ejemplo anterior y la pequeña cuadrícula de 2 × 2 se pueden usar como casos de prueba (no hay muchos casos límite para cubrir en este desafío).
'#
y"#"
diferentes en CJam?"#"
es igual a['#]
.Javascript (ES6),
110109 bytes¡1 byte guardado gracias a @ edc65 !
Explicación
Enfoque muy simple al problema. Busca cada uno
#
y, si hay menos de 2#
s alrededor, lo reemplaza con unX
. Repite este proceso muchas veces hasta que se garantice que todos los callejones sin salida han sido reemplazados porX
s.fuente
l=~r.search
lugar del=1+r.search
. (Solo 1 byte guardado)Python (3.5)
362331329314 bytesGracias a @Alissa. ella me ayuda a ganar ~ 33 bytes
Explicaciones
Definición de la función
Agregue un borde de '.' a derecha e izquierda del tablero
Agregue un borde de '.' en la parte superior e inferior
Función Lambda para probar '#'
Recorre la longitud de entrada para asegurarte de que no olvidemos callejones sin salida
Bucle en columnas y líneas
Prueba si tenemos '#' alrededor y en la posición
Reemplace '#' por 'X'
Recorte el borde lleno de '.' y únete en cadena
Uso
fuente
split()
lugar desplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
es más corto. Y se puede acortar aún más:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) no necesita toda la lista (zip (...)), useprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. la lista de la lista me permite usar t [h] [x] = 'X'r
,g
yd
) de su función (se ahorra algo de tabulación). Tal vez algo de jugar con split () podría ayudar:t=[d+list(i)+d for i in s.split()]
luego calcule las longitudes, luego agregue líneas de puntos al final y al principio, y luego modifique sus ciclos para trabajar con estas longitudes extendidas. No estoy seguro de si acortará el código, pero podría