Vous avez été embauché comme assistant de recherche et vous avez demandé de créer un petit programme qui construira des labyrinthes de rats. La boîte de rat est toujours 62x22 et a une entrée (a) et une sortie (A) pour le rat, comme ceci (entrée 1):
#######a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#################################################A############
Votre programme doit remplir la case avec des blocs (#) laissant un chemin pour le rat, comme ceci (sortie 1):
#######a######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
#################################################A############
C'est facile vous pensez! Vous commencez à écrire un petit programme, plein de confiance. Cependant, le scientifique principal a eu une nouvelle idée - il veut que deux rats parcourent le labyrinthe en même temps. Le Dr Rattanshnorter explique qu'ils ont différentes portes et différentes sorties (entrée 2):
#b#####a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# B
# #
#################################################A############
Les rats ont été entraînés à se déplacer directement à travers les intersections croisées mais les intersections en T les laissent désespérément confus et invalideront l'expérience. Vous commencez votre nouvelle tâche plus complexe lorsque le bon docteur explique une dernière exigence: les rats sont sauvages les uns envers les autres, donc s'ils se voient à tout moment, un combat de rats éclatera et vous serez tous les deux devant le comité d'éthique. Vous réalisez maintenant que votre programme devrait sortir un labyrinthe quelque chose comme ça (sortie 2):
#b#####a######################################################
# ##### ######################################################
# ##### ######################################################
# ##### ####################################### ####
# ##### ####################################### ######### ####
# ##### ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# # ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### B
################################################# ############
#################################################A############
Au moment où le rat B atteint l'intersection, le rat A voyagera dans le couloir pour sortir A et le combat de rats sera évité.
Règles:
Votre programme doit lire (STDIN ou fichier) une entrée comme celles ci-dessus, et produire (STDOUT ou fichier) les mêmes données sauf que de nombreux espaces seront désormais des hachages (#). Vous pouvez remplacer n'importe quel caractère unique (tel que
;
) au lieu de\n
dans la chaîne d'entrée, mais la chaîne de sortie nécessite toujours des\n
caractères. MIS À JOURUne voie de rat doit avoir une largeur de caractère, sauf pour les intersections croisées (chaque espace doit avoir zéro ou deux caractères orthogonalement adjacents
#
). Chaque rat doit avoir un chemin unique clair, sauf pour les intersections croisées. Aucune intersection en T n'est autorisée.Les rats sont libérés simultanément et se déplacent à un rythme constant. A aucun moment, deux rats ou plus ne devraient se voir (être dans la même colonne ou ligne sans
#
caractères entre les deux).Si aucune solution n'est possible (comme des points d'entrée adjacents), imprimez
Impossible\n
et quittez.Les entrées et les sorties peuvent être de n'importe quel côté, mais elles ne seront jamais aux coins.
Si une entrée et une sortie appariées sont adjacentes (par exemple:)
##aA##
, le rat ne peut pas aller directement dea
àA
. Il doit y avoir une petite section de couloir de 2 espaces à l'intérieur de la zone du labyrinthe.Au tour où un rat atteint son point de sortie (ou à tout moment par la suite), il n'est plus visible pour les autres rats.
Votre programme peut être conçu pour calculer des labyrinthes pour 1, 2, jusqu'à 26 rats.
Les failles standard ne sont pas autorisées.
But:
Avec votre solution, indiquez combien de rats par labyrinthe (N) votre programme peut résoudre. Votre score est la longueur de votre code en octets divisée par ce nombre N.
Veuillez inclure un exemple de sortie dans votre réponse afin que nous puissions voir ce que votre programme produit.
Réponses:
Haskell, 26 rats?, ~ 5000 octets
Théoriquement, ce code devrait fonctionner pour n'importe quel nombre de rats, mais je n'offre aucune garantie qu'il se terminera avant la mort par la chaleur de l'univers. Il est basé sur un algorithme de retour en arrière qui essaie d'abord de suivre le chemin droit, puis de changer de chemin si le chemin ne fonctionne pas. Le nombre d'alternatives est exponentiel par rapport à la longueur du trajet et au nombre de rats.
Je n'ai pas encore pris la peine de jouer au golf, car il est si grand et que je veux d'abord le rendre plus rapide.
Exemple de sortie, 6 rats:
la source
b
arrive à l'intersection dee
etb
, n'est-il pas vu pare
?b
semble y arriver àt = 11
, ce qui mettraite
encore dans ce couloir. Suis-je en train de manquer quelque chose?Haskell, 1 rat, 681 caractères
Le problème peut être trivialement résolu pour tous les labyrinthes avec un seul rat. Ce code "fonctionne" également pour n'importe quel nombre de rats, mais ne suit aucune des contraintes sur les interactions entre plusieurs rats et chemins.
Exemple de sortie:
Je prévois de prendre en charge de nombreux rats, j'ai donc écrit du code générique, mais je n'ai pas encore trouvé de bon algorithme pour cela.
parse
extrait une liste de toutes les entrées et sorties, avec leurs coordonnéesrats
prend cette liste et la convertit en paires de coordonnées pour chaque rat.bnds
prend une coordonnée sur un bord et la déplace vers la coordonnée la plus proche à l'intérieur du labyrinthe.naive
prend une position de début et de fin et renvoie un chemin simple entre elles.main
remplace ensuite tous les espaces blancs qui ne se trouvent pas dans un chemin par '#'la source