Sie wurden als wissenschaftlicher Mitarbeiter eingestellt und gebeten, ein kleines Programm für den Bau von Rattenlabyrinthen zu erstellen. Die Rattenbox ist immer 62x22 und hat einen Eingang (a) und einen Ausgang (A) für die Ratte, wie folgt (Eingang 1):
#######a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#################################################A############
Ihr Programm muss die Box mit Blöcken (#) füllen und einen Pfad für die Ratte hinterlassen, wie folgt (Ausgabe 1):
#######a######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
#################################################A############
Das ist einfach, denkst du! Sie schreiben ein kleines Programm voller Selbstvertrauen. Der Principle Scientist hat jedoch eine neue Idee: Er möchte, dass zwei Ratten gleichzeitig durch das Labyrinth navigieren. Dr. Rattanshnorter erklärt, dass sie unterschiedliche Türen und unterschiedliche Ausgänge haben (Eingang 2):
#b#####a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# B
# #
#################################################A############
Die Ratten wurden darauf trainiert, sich gerade durch Kreuzungen zu bewegen, aber T-Kreuzungen lassen sie hoffnungslos verwirrt und machen das Experiment ungültig. Sie beginnen mit Ihrer neuen, komplexeren Aufgabe, wenn der gute Doktor eine letzte Anforderung erklärt: Die Ratten sind wild zueinander. Wenn sie sich also zu irgendeinem Zeitpunkt sehen, bricht ein Rattenkampf aus und Sie befinden sich beide vor der Ethikkommission. Sie erkennen jetzt, dass Ihr Programm ein Labyrinth wie das folgende ausgeben sollte (Ausgabe 2):
#b#####a######################################################
# ##### ######################################################
# ##### ######################################################
# ##### ####################################### ####
# ##### ####################################### ######### ####
# ##### ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# # ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### B
################################################# ############
#################################################A############
Wenn Ratte B die Kreuzung erreicht, fährt Ratte A den Korridor entlang bis zum Ausgang A und der Rattenkampf wird vermieden.
Regeln:
Ihr Programm sollte eine Eingabe wie oben einlesen (STDIN oder Datei) und dieselben Daten ausgeben (STDOUT oder Datei), außer dass viele Leerzeichen jetzt als Hashes (#) dargestellt werden. Sie können jedes einzelne Zeichen (z. B.
;
) anstelle\n
der Eingabezeichenfolge einsetzen, die Ausgabezeichenfolge erfordert jedoch weiterhin\n
Zeichen. AKTUALISIERTEin Rattenpfad muss mit Ausnahme von Kreuzungspunkten eine Zeichenbreite haben (jedes Leerzeichen muss null oder zwei orthogonal nebeneinander haben)
#
Zeichen enthalten). Jede Ratte muss einen freien Weg haben, mit Ausnahme von Kreuzungspunkten. Es sind keine T-Kreuzungen erlaubt.Die Ratten werden gleichzeitig freigesetzt und bewegen sich mit konstanter Geschwindigkeit. Zu keinem Zeitpunkt sollten sich zwei oder mehr Ratten sehen (in derselben Spalte oder Zeile ohne ein oder mehrere
#
dazwischenliegende Zeichen).Wenn keine Lösung möglich ist (z. B. benachbarte Eingangspunkte), drucken Sie
Impossible\n
und beenden Sie.Ein- und Ausgänge können an beliebigen Seiten sein, sie werden jedoch niemals an den Ecken sein.
Wenn ein passender Ein- und Ausgang nebeneinander liegt (zB
##aA##
:), kann die Ratte nicht direkt vona
nach gehenA
. Innerhalb des Labyrinthbereichs muss sich ein kleiner Korridorabschnitt mit 2 Feldern befinden.In der Kurve, in der eine Ratte ihren Austrittspunkt erreicht (oder zu einem späteren Zeitpunkt), ist sie für andere Ratten nicht mehr sichtbar.
Ihr Programm kann so konzipiert sein, dass Labyrinthe für 1, 2 bis 26 Ratten berechnet werden.
Standardlücken sind nicht zulässig.
Ergebnis:
Nenne mit deiner Lösung, wie viele Ratten pro Labyrinth (N) dein Programm lösen kann. Ihre Punktzahl ist Ihre Codelänge in Bytes geteilt durch diese Zahl N.
Bitte fügen Sie Ihrer Antwort eine Beispielausgabe bei, damit wir sehen können, was Ihr Programm produziert.
Antworten:
Haskell, 26 Ratten, ~ 5000 Bytes
Theoretisch sollte dieser Code für eine beliebige Anzahl von Ratten funktionieren, aber ich gebe keine Garantie dafür, dass er vor dem Hitzetod des Universums endet. Es basiert auf einem Backtracking-Algorithmus, der versucht, zuerst den geraden Pfad zu verfolgen und dann den Pfad zu wechseln, wenn der Pfad nicht funktioniert. Die Anzahl der Alternativen ist in Bezug auf die Länge des Pfades und die Anzahl der Ratten exponentiell.
Ich habe mich noch nicht darum gekümmert, Golf zu spielen, da es so groß ist und ich es zuerst schneller machen möchte.
Probenausgabe, 6 Ratten:
quelle
b
kommt er zum Schnittpunkt vone
undb
, wird er nicht von gesehene
?b
scheint dahin zu komment = 11
, wase
noch in den Korridor stecken würde. Vermisse ich etwas?Haskell, 1 Ratte, 681 Zeichen
Das Problem kann für alle Labyrinthe mit nur einer Ratte trivial gelöst werden. Dieser Code "funktioniert" auch für eine beliebige Anzahl von Ratten, befolgt jedoch keine der Einschränkungen bei der Interaktion zwischen mehreren Ratten und Pfaden.
Beispielausgabe:
Ich plane, viele Ratten zu unterstützen, also habe ich allgemeinen Code geschrieben, aber ich habe noch keinen guten Algorithmus dafür gefunden.
parse
Extrahiert eine Liste aller Ein- und Ausgänge mit ihren Koordinatenrats
Nimmt diese Liste und konvertiert sie in Koordinatenpaare für jede Ratte.bnds
Nimmt eine Koordinate an einer Kante und verschiebt sie zur nächsten Koordinate im Labyrinth.naive
nimmt eine Start- und eine Endposition ein und gibt einen einfachen Pfad zwischen ihnen zurück.main
Ersetzt dann den gesamten Leerraum, der sich nicht in einem Pfad befindet, mit '#'quelle