Dada a entrada de uma "estrada" de arte ASCII, produza a estrada com todos os becos sem saída rotulados.
Esta é uma estrada:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Esta é a estrada com becos sem saída rotulados com a letra X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Um beco sem saída é definido como qualquer ladrilho de estrada que faz fronteira com n outros ladrilhos de estrada, pelo menos n-1 dos quais são considerados becos sem saída já por esta regra. "Limite" está nas quatro direções cardinais, portanto, os ladrilhos na diagonal não contam.
Essa regra é aplicada repetidamente, pois os becos sem saída recém-criados podem, eles próprios, criar mais becos sem saída . Observe também que qualquer ladrilho de estrada que limita apenas um outro ladrilho de estrada é considerado um beco sem saída na primeira vez que a regra é aplicada.
Entrada e saída podem ser uma única sequência (com linhas separadas por qualquer caractere que não seja #
ou .
) ou uma matriz / lista / etc. Se o seu idioma suportar, você também poderá receber entradas, sendo cada linha um argumento de função.
Você pode assumir o seguinte sobre a entrada:
Sempre haverá pelo menos um "loop" - ou seja, um grupo de
#
caracteres que podem ser seguidos infinitamente. (Caso contrário, cada bloco se tornaria um beco sem saída.)Isso implica que a entrada sempre será 2 × 2 ou maior, pois o menor loop é:
## ##
(Que, aliás, deve ser produzido sem alterações.)
Todos os
#
caracteres serão conectados. Ou seja, se você realizasse um preenchimento de uma inundação#
, todas elas seriam afetadas.
Como esse é o código-golfe , o código mais curto em bytes será vencedor.
O exemplo acima e a pequena grade 2 × 2 podem ser usadas como casos de teste (não há muitos casos extremos a serem abordados neste desafio).
'#
e"#"
diferentes no CJam?"#"
é igual a['#]
.JavaScript (ES6),
110109 bytes1 byte salvo graças a @ edc65 !
Explicação
Abordagem muito simples para o problema. Pesquisa cada uma
#
e, se houver menos de 2#
s em volta, a substitui por umaX
. Repita esse processo várias vezes até garantir que todos os becos sem saída tenham sido substituídos porX
s.fonte
l=~r.search
vez del=1+r.search
. (Apenas 1 byte salvo)Python (3.5)
362331329314 bytesgraças a @Alissa. ela me ajuda a ganhar ~ 33 bytes
Explicações
Definição de função
Adicione uma borda de '.' à direita e esquerda do quadro
Adicione uma borda de '.' na parte superior e inferior
Função Lambda para testar '#'
Faça um loop no comprimento da entrada para garantir que não esquecemos becos sem saída
Loop em colunas e linhas
Teste se temos '#' ao redor e na posição
Substituir '#' por 'X'
Corte a borda preenchida com '.' e junte-se à string
Uso
fonte
split()
vez desplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
é mais curto. E isso pode ser reduzido ainda mais:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) você não precisa de toda a lista (zip (....)) coisa, usoprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. a lista de lista me permite usar t [h] [x] = 'X'r
,g
ed
) da sua função (economizando algumas tabulações). Talvez algumas brincadeiras com split () possam ajudart=[d+list(i)+d for i in s.split()]
:, calcule comprimentos, adicione linhas de ponto ao final e ao início e altere seus ciclos para trabalhar com esses comprimentos estendidos. Não tenho certeza se ele vai encurtar o código, mas talvez