Você é um rato. Seus amigos do mouse foram capturados e estão inconscientes e presos em um labirinto que tem apenas uma entrada / saída. Por acaso, você tem um mapa perfeito do labirinto, para poder planejar uma solução para entrar e levá-los todos em segurança. No entanto, o labirinto é protegido por um sistema de segurança que acionará um alerta se um limite 1000
for atingido, fazendo com que você seja capturado e falhe em sua missão de resgate.
De suas investigações anteriores do labirinto, cada quadrado que você pisa (ou seja, cada movimento horizontal ou vertical - os ratos não podem se mover na diagonal ) é adicionado 1
ao balcão do sistema de segurança. No entanto, se você está carregando um peso (um bloco de dinamite ou um amigo inconsciente do mouse), ele adiciona, 2
pois detecta a pressão adicional. A praça de entrada / saída não possui esse sistema de segurança e, portanto, não é adicionada ao balcão.
Você tem um suprimento ilimitado de dinamite que você trouxe para a entrada, então você pode simplesmente explodir todas as paredes para libertar seus amigos. Mas você precisa ser cauteloso ao fazer isso, pois cada explosão aumenta 50
o contador devido à pressão concussiva. Além disso, você só pode carregar uma coisa de cada vez, um mouse ou um bloco de dinamite. Como cada bloco de dinamite pode detonar apenas um espaço de parede, isso significa que, se houver várias paredes seguidas, você precisará fazer uma viagem de mãos vazias de volta à entrada para obter mais.
Exemplo elaborado
Suponha que nosso labirinto se pareça com o seguinte:
######
#M# E#
######
Vou usar c
no balcão. Começamos no E
ntrance, movemos um quadrado à esquerda enquanto carregamos dinamite c=2
. Nós detonamos a dinamite para explodir a parede c=52
. Movemos dois quadrados para a esquerda, de mãos vazias, para chegar c=54
, e agora estamos de pé no quadrado do mouse. Pegamos nosso amigo e movemos 3 quadrados de volta para o E
xit, mas o último quadrado não conta, pois não possui sensores, então são apenas 2 quadrados com algo nas costas. Isso significa que quando chegamos à saída com o mouse final c=58
, que é menor que 1000
e, portanto, a missão é bem-sucedida.
Desafio
Dado um labirinto de entrada, verifique se você, o herói do mouse, pode resgatar com êxito todos os ratos presos dentro das restrições descritas acima ou se a missão é uma falha.
Entrada
- Um labirinto 2D em qualquer formato aceitável (cadeia de linhas múltiplas, matriz de linhas, etc.).
- Para esse desafio,
#
usarei as paredes internas e externas,M
os amigos do mouse eE
a entrada. - A entrada nunca será imediatamente adjacente a uma parede interna (sempre haverá pelo menos um espaço para se movimentar livremente).
- Você pode substituir qualquer caractere ASCII imprimível que desejar, desde que consistente. Isso permite que você use dois símbolos diferentes para paredes internas versus paredes externas, desde que mantenha a consistência (por exemplo, se você optar por usar
@
paredes interiores e deixar#
para o exterior, todas as paredes internas devem ser@
e todas as paredes externas#
) - O labirinto sempre será completamente delimitado por paredes, mas não é necessariamente retangular. Se desejar, você pode assumir que o labirinto é preenchido com espaços para criar uma entrada retangular (opcional).
- O labirinto pode ter seções inacessíveis sem dinamite.
- Você não pode dinamitar as paredes exteriores do labirinto.
Saída
Um valor de verdade / falsey . Na verdade, para "Sim, o mouse pode resgatar qualquer outro mouse" ou Falsey para "Não, o sistema de alarme será acionado".
As regras
- Um programa completo ou uma função são aceitáveis.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
Exemplos de verdade, separados por linhas em branco.
#####
#M E#
#####
######
#M# E#
######
########
#E # M#
# # #
# # #
# #
########
#############################
# ## # # #
# M ## M # # #
# ## # M # E #
#M ## # # #
#############################
###############
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMM MM#
#MMMMMMMMMMMME#
###############
Exemplos de Falsey, separados por linhas em branco
#############################
#M ## ## ## #
# M ## M ## ## #
# ## ## M ## E #
#M ## ## ## #
#############################
#############################
########
########
# # #
# M # M#
########
#####
# M #
#####
#####
#####
#####
###################
# # # ## ## # # #
#M#M#M## E ##M#M#M#
# # # ## ## # # #
###################
#######
######
#####
####
# M#
####
###############
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMMM#
#MMMMMMMMMMMME#
###############