Então, aqui está um mapa de, digamos, uma masmorra ...
##########
# #####
# #####
##########
##########
##########
##########
#### ##
#### ##
##########
Digamos que o herói esteja na Sala A (no canto superior esquerdo) e seu objetivo (um príncipe em perigo?) Esteja na Sala B (no canto inferior direito). Nosso mapa não permite que o herói progrida para seu objetivo.
Precisamos adicionar uma passagem ...
##########
# #####
# #####
####.#####
####.#####
####.#####
####.#####
#### ##
#### ##
##########
Lá, muito melhor!
Regras
- Um programa ou função que aceita um mapa de masmorra (composto de hashes e espaços, com linhas separadas por novos caracteres de linha).
- Ele exibirá um mapa com pontos adicionados para indicar passagens em todos os espaços que estão em um caminho direto entre os caracteres do espaço.
- Não altera o comprimento da linha ou o número de linhas.
- As passagens estão todas em uma linha direta de espaços para espaços.
- Passagens não podem virar as esquinas
- Eles não estarão entre os espaços e a borda do mapa.
- Use qualquer idioma.
- Tente realizar a conversão no menor número de bytes.
- Se nenhuma passagem puder ser desenhada, retorne o mapa inalterado.
- O mapa sempre deve ter hashes em todas as bordas (você não precisa manipular espaços na borda).
- Os mapas de entrada são sempre retangulares, cada linha deve ter a mesma largura.
Casos de teste
#### ####
# # => # #
# # # #
#### ####
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
########## ####.#####
########## ####.#####
#### ## #### ##
#### ## #### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##########
########## => ##########
########## ##########
########## ##########
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
#### ### #### ###
########## ######.###
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##..######
########## => ##..######
########## ##..######
########## ##..######
## ####### ## .######
## ###### ## ######
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
########## => #.########
########## #.########
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
##### ### => #.### ###
##### ### #.### ###
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
## # ## #
########## ##......##
########## ##......##
########## => ##......##
########## ##......##
########## ##......##
########## ##......##
# ## # ##
########## ##########
########## ##########
#### #### #### ####
####### ## ####..# ##
###### ### ####.. ###
# ### ## # => # ... .. #
# ## ### # # .. ... #
### ###### ### ..####
## ####### ## #..####
#### #### #### ####
########## ##########
#
e.
?Respostas:
Gelatina , 17 bytes
Experimente online!
Tricky -1 graças a user202729 .
Explicação:
fonte
Perl 5
-p0
, 56 bytesExperimente online!
fonte
APL + WIN, 87 bytes
Solicita matriz de caracteres:
fonte
Haskell ,
209165162 bytes.Experimente online!
Não é a maneira mais eficiente de fazê-lo em Haskell, tenho certeza.
Tem muitos parênteses para o meu gosto, mas não sei mais como removê-lo.fonte
$
((k(take 2 c))
torna-se(k$take 2 c)
). Você também pode usar em!!0
vez de,head
em alguns casos.(k(take 2 c))
você, basta remover os parênteses externos, eles não são necessários. Mas no caso dedrop(length(head d))
você ainda pode usar o$
, substituindo-o pordrop(length$head d)
(e atédrop(length$d!!0)
).k
vez de,++
poderá reduzir bastante a última linha.k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d]
.f b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b
, isso usa uma correspondência de padrão para fazer muito do trabalho pesado que estava sendo feito antes.Python 2 ,
173148 bytesExperimente online!
fonte
Retina 0.8.2 , 95 bytes
Experimente online! Explicação:
Ele procura por
#
sinais que estão acima de espaços ou.
se os transforma em pontos até não sobrar nenhum. O lookbehind encontra a#
coluna da e, em seguida, o lookahead pula para a próxima linha e atomicamente para a mesma coluna abaixo, de forma que o espaço ou.
possa corresponder apenas se estiver exatamente abaixo do#
.Ele procura
.
s que não estão abaixo dos espaços ou.
se os transforma novamente em#
s até não sobrar nenhum. O lookahead encontra a.
coluna da e, em seguida, o lookbehind pula para a linha anterior e atomicamente para a mesma coluna acima da mesma maneira, de modo que o espaço ou.
possa corresponder apenas se estiver exatamente acima do#
. Um lookbehind negativo é usado para que isso também funcione para.
s na linha superior.(Observe o espaço à direita nas duas linhas) Isso simplesmente procura todas as execuções de caracteres que não sejam espaços em branco entre espaços e garante que todos sejam
.
s.fonte
Ruby , 104 bytes
Experimente online!
Bem, não é ótimo, mas pelo menos é complicado. Tenho certeza que pode ser melhorado.
fonte
Stax , 19 bytes
Execute e depure
fonte
JavaScript (Node.js) ,
205193190186181175172 bytesExperimente online!
Comentado
fonte