Você foi contratado como assistente de pesquisa e solicitado a criar um pequeno programa que criará labirintos de ratos. A caixa do rato é sempre 62x22 e possui uma entrada (a) e uma saída (A) para o rato, desta forma (entrada 1):
#######a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#################################################A############
Seu programa deve preencher a caixa com blocos (#) deixando um caminho para o rato, como este (saída 1):
#######a######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
#################################################A############
Isso é fácil, você pensa! Você começa a escrever um pequeno programa, cheio de confiança. No entanto, o cientista principal teve uma nova idéia - ele quer dois ratos para navegar no labirinto ao mesmo tempo. O Dr. Rattanshnorter explica que eles têm portas e saídas diferentes (entrada 2):
#b#####a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# B
# #
#################################################A############
Os ratos foram treinados para atravessar cruzamentos cruzados, mas os cruzamentos em T os deixam irremediavelmente confusos e invalidarão o experimento. Você começa sua nova tarefa mais complexa quando o bom doutor explica um requisito final: os ratos são selvagens um com o outro; se eles se virem a qualquer momento, uma briga de ratos será iniciada e vocês dois estarão diante do conselho de ética. Agora você percebe que seu programa deve gerar um labirinto semelhante a este (saída 2):
#b#####a######################################################
# ##### ######################################################
# ##### ######################################################
# ##### ####################################### ####
# ##### ####################################### ######### ####
# ##### ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# # ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### B
################################################# ############
#################################################A############
Quando o rato B chegar ao cruzamento, o rato A estará viajando pelo corredor para sair de A e a luta por ratos será evitada.
Regras:
Seu programa deve ler (STDIN ou arquivo) uma entrada como as acima e gerar (STDOUT ou arquivo) os mesmos dados, exceto que muitos espaços serão agora hashes (#). Você pode substituir qualquer caractere único (como
;
) em vez de\n
na sequência de entrada, mas a sequência de saída ainda requer\n
caracteres. ATUALIZADAUm caminho de rato deve ter a largura de um caractere, exceto as interseções cruzadas (todo espaço deve ter zero ou dois ortogonalmente adjacentes
#
caracteres ). Cada rato deve ter um único caminho claro, exceto cruzamentos cruzados. Não são permitidas interseções em T.Os ratos são liberados simultaneamente e se movem a uma taxa constante. Em nenhum momento dois ou mais ratos devem se ver (estar na mesma coluna ou linha sem um dos mais
#
caracteres no meio).Se nenhuma solução for possível (como pontos de entrada adjacentes), imprima
Impossible\n
e saia.As entradas e saídas podem estar de qualquer lado, porém nunca estarão nas esquinas.
Se uma entrada e uma saída correspondentes forem adjacentes (por exemplo
##aA##
:), o rato não poderá ir diretamente dea
paraA
. Deve haver uma pequena seção de corredor de 2 espaços dentro da área do labirinto.No turno em que um rato atinge seu ponto de saída (ou a qualquer momento depois disso), ele não é mais visível para outros ratos.
Seu programa pode ser projetado para calcular labirintos para 1, 2, até 26 ratos.
As brechas padrão não são permitidas.
Ponto:
Com sua solução, indique quantos ratos por labirinto (N) seu programa pode resolver. Sua pontuação é o tamanho do código em bytes dividido por este número N.
Inclua uma amostra de saída em sua resposta para que possamos ver o que seu programa produz.
Respostas:
Haskell, 26 ratos ?, ~ 5000 bytes
Teoricamente, esse código deve funcionar para qualquer número de ratos, mas não ofereço garantia de que ele terminará antes da morte por calor do universo. Ele é baseado em um algoritmo de retorno que tenta seguir o caminho direto primeiro e depois alternar o caminho se o caminho não funcionar. O número de alternativas é exponencial em relação ao comprimento do caminho e ao número de ratos.
Ainda não me incomodei em jogar golfe, já que é muito grande e quero torná-lo mais rápido primeiro.
Saída de amostra, 6 ratos:
fonte
b
chega ao cruzamento dee
eb
, ele não é visto pore
?b
parece chegar lát = 11
, o que colocariae
ainda naquele corredor. Estou esquecendo de algo?Haskell, 1 rato, 681 caracteres
O problema pode ser resolvido trivialmente para todos os labirintos com apenas um rato. Esse código também "funciona" para qualquer número de ratos, mas não segue nenhuma das restrições nas interações entre vários ratos e caminhos.
Saída de amostra:
Estou planejando suportar muitos ratos, então escrevi código genérico, mas ainda não encontrei um bom algoritmo para isso.
parse
extrai uma lista de todas as entradas e saídas, com suas coordenadasrats
pega essa lista e a converte em pares de coordenadas para cada rato.bnds
pega uma coordenada em uma aresta e a move para a coordenada mais próxima dentro do labirinto.naive
toma as posições inicial e final e retorna um caminho simples entre elas.main
em seguida, substitui todo o espaço em branco que não estiver no caminho por '#'fonte