Você é Ruby, um engenheiro ferroviário. Sua tarefa é rastrear qualquer vale, de modo que ele visite todas as estações ( M
). A quantidade de trilhos traçados não é importante, mas deve ser traçada em um caminho contínuo que começa e termina no ponto de entrada / saída do vale ( >
) e não se cruza em nenhum momento. Existem algumas outras restrições: montanhas ( ^
) são intransitáveis, portanto você deve contorná-las, rios ( ~
) devem ser cruzados usando uma ponte ( X
) e a borda do vale ( #
) também é intransitável.
As regras da pista
Se a pista não for colocada corretamente, haverá descarrilamentos e ninguém o desejará, então aqui estão as regras sobre o posicionamento da pista.
Existem quatro tipos de pista: -
|
/
\
.
Veja como cada um pode ser combinado com os outros:
Combinações permitidas de -
(no centro de cada exemplo):
##### ##### ##### ##### ##### ##### #####
# # # # #\ # # # # /# #\ /# # #
#---# # --# # --# #-- # #-- # # - # # - #
# # #/ # # # # \# # # # # #/ \#
##### ##### ##### ##### ##### ##### #####
-
nunca pode ser combinado com |
. Esta é uma curva muito acentuada para os trens fazerem com segurança.
Combinações permitidas de /
(no centro de cada exemplo):
##### ##### ##### ##### ##### ##### #####
# /# # -# # |# # /# # /# # -# # |#
# / # # / # # / # # / # # / # # / # # / #
#/ # #/ # #/ # #| # #- # #| # #- #
##### ##### ##### ##### ##### ##### #####
\
nunca pode ser combinado com /
. Esta é uma curva muito acentuada para os trens fazerem com segurança.
Combinações permitidas de \
(no centro de cada exemplo):
##### ##### ##### ##### ##### ##### #####
#\ # #- # #| # #\ # #\ # #- # #| #
# \ # # \ # # \ # # \ # # \ # # \ # # \ #
# \# # \# # \# # |# # -# # |# # -#
##### ##### ##### ##### ##### ##### #####
Combinações permitidas de |
(no centro de cada exemplo):
##### ##### ##### ##### ##### ##### #####
# | # #\ # # /# # | # # | # # /# #\ #
# | # # | # # | # # | # # | # # | # # | #
# | # # | # # | # #/ # # \# # \# #/ #
##### ##### ##### ##### ##### ##### #####
As faixas podem ser combinadas com as estações, pontes e entrada / saída do vale das seguintes maneiras:
##### ##### #####
#\|/# #\|/# #/ #
#-M-# #-X-# >- #
#/|\# #/|\# #\ #
##### ##### #####
As estações têm mesas giratórias, por isso é permitido deixar uma estação em um ângulo agudo (embora não volte por onde você veio - você não iria querer colidir com o próximo trem programado que vem para o outro lado!).
Pontes são para atravessar rios, então você deve sair da ponte no lado oposto do rio em que entrou.
Entrada
A entrada será via STDIN para programas ou um argumento de função para funções. Se sua função precisar de um nome para executá-lo na minha entrada, essa declaração de nome deverá ser incluída na contagem de bytes.
A entrada será uma única sequência com quebras de linha. Cada linha na sua entrada sempre terá o mesmo comprimento que as outras, fornecendo uma entrada retangular. A borda da entrada sempre será sólida e intransitável ( #
), exceto no ponto de entrada. Qualquer entrada dada terá pelo menos uma resposta válida.
Resultado
Sua saída deve ser retornada como uma única sequência com quebras de linha de uma função ou impressa / ecoada na tela para programas completos.
A saída deve ser a mesma que a entrada, mas com os caracteres da faixa adicionados.
Pontuação
O vencedor será o código mais curto em bytes.
Casos de teste
###########
# M #
# ^ #
> ^^ M #
# ^ #
#~~~~~~~~~#
# M #
# ^^ #
# M#
###########
#################
# #
# M M #
# ^ #
# ^ M #
#~~~~~~~^ #
# #
# ^ #
# M^ #
# ^ #
> ^^^ M#
# #
# M #
#################
###############
# M ~ #
# ~ #
> ~ M #
# ~ #
# ~ #
# ~ #
###############
Soluções possíveis para casos de teste
###########
# ---M #
#/ ^ \ #
> ^^ M #
#\ ^ | #
#~X~~~~X~~#
# M \ #
# \ ^^ |#
# -----M#
###########
#################
# #
# M---------M #
# | ^ / #
# / ^ M- #
#~X~~~~~^ | #
# | \ #
# \^ \ #
# --M^ \ #
#/ ^ |#
> ^^^ M#
#\ / #
# -------M---- #
#################
###############
# M ~ #
#/ \ ~ #
> --X----M #
#\ ~ | #
# \ ~ / #
# ---X--- #
###############
Respostas:
Python 2 ,
3990343044124313 bytesEste é basicamente um A * com uma heurística feia e um
getChildren
método feio . Para executar os 3 casos de teste consecutivamente, é necessário o6.5s
meu computador. A funçãof
é a solução aqui. Ele pega o mapa como uma sequência e retorna o mapa resolvido como uma sequência.Experimente online!
Casos de teste
Teste 1
Teste 2
Teste 3
Código fonte
Classe A * State + A * Solver
Na verdade, eu tirei esses da minha solução. Mas eles existem na minha versão 'legível' . A classe State é genérica e deve ser implementada. A classe Solver assume um estado inicial e segue os estados heurísticos
getDist
.Classe Estadual
Esta é a implementação da classe de estado A *. O método mais importante aqui é
getDist
a heurística para determinar a proximidadeself
do objetivo. É basicamente a distância mínima para visitar todos os destinos restantes e voltar ao início.Classe de mapa
Esta classe armazena e processa o mapa. O
isConnected
método é provavelmente a peça mais importante. Ele testa para ver se duas partes da pista estão conectadas.Atualizações
;
sfonte
elif e!=""and e in"MX>"
poderiam ser combinadas em uma única linha com um ternárioif else
. Além disso, alguns de seusdef
s podem serlambda
s. Comodef A(s):return str(s)
pode serA=lambda s:str(s)
, ou se você mudar de__str__
para__repr__
, poderá usarA=lambda s:`s`
, nesse ponto, nem vale a pena terA
como função própria, pois exige parênteses para chamar. Basta usar backticks.