Einführung
Eine Robbenfamilie ist auf einem Eisberg am Polarkreis gestrandet. Auf dem Eisberg befindet sich ein Funksender, mit dem die Robben um Hilfe rufen können. Allerdings weiß nur der Robbenvater, wie man den Funksender bedient. Schlimmer noch, das Eis ist zu dieser Jahreszeit sehr rutschig, sodass die Robben unkontrolliert rutschen, bis sie auf ein anderes Siegel treffen oder von der Kante des Eisbergs rutschen, was es für den Robbenvater sehr schwierig macht, den Funksender zu erreichen. Glücklicherweise ist eine der Robben eine Informatikerin, und sie beschließt, ein Programm zu schreiben, um herauszufinden, wie man die Papa-Robbe zum Funksender manövriert. Da auf dem Eis nicht viel Platz ist, um ein Programm zu schreiben, beschließt sie, das Programm so wenig Bytes wie möglich zu verwenden.
Eingabebeschreibung
Das Programm des Siegels nimmt Eingaben über STDIN, Befehlszeilenargumente oder Benutzereingabefunktionen (z. B. raw_input()
) entgegen. Es kann nicht in einer Variablen vorinitialisiert werden (zB "Dieses Programm erwartet die Eingabe in eine Variable x
").
Die erste Zeile der Eingabe besteht aus zwei durch Kommas getrennten Ganzzahlen im Formular
A,B
Daran schließen sich B
Zeilen an, die jeweils aus A
Zeichen bestehen. Jede Zeile darf nur folgende Zeichen enthalten:
.
: Der kalte, kalte Ozean. Auf der Karte wird dies immer als Rahmen angezeigt.#
: Ein Teil des Eisbergs.a
...z
: Ein Siegel, das nicht das Papasiegel auf dem Eisberg ist.D
: Das Papasiegel auf dem Eisberg.*
: Der Funksender.
(Beachten Sie, dass das Papa-Siegel immer in Großbuchstaben D
geschrieben d
ist . Ein Kleinbuchstabe ist einfach ein reguläres Siegel.)
Ausgabebeschreibung
Geben Sie gemäß den folgenden Regeln für die Bewegung der Robben eine Liste mit Anweisungen für die Robben aus, wie sie sich bewegen sollen, um die Papa-Robbe zum Funksender zu bringen.
- Regel: Alle Siegel können sich nach oben (
U
), unten (D
), links () bewegen.L
) und rechts (R
) . Sie können nicht diagonal gleiten. - Regel: Beim Bewegen bewegt sich ein Seehund so lange in die gleiche Richtung, bis er mit einem anderen Seehund kollidiert oder ins Meer fällt.
- Wenn eine Robbe mit einer anderen Robbe kollidiert, hört sie auf, sich zu bewegen. Das Siegel, mit dem es kollidierte bewegt sich nicht .
- Wenn ein Seehund ins Meer fällt, wird er ertrinken und von der Karte verschwinden. Das heißt, es wirkt nicht als Kollider für andere Siegel und kann nicht erneut bewegt werden.
- Regel: Zwei Siegel können sich nicht gleichzeitig bewegen, und ein Siegel kann auch nicht bewegt werden, während sich ein anderes noch bewegt. Das nächste Siegel kann nur bewegt werden, wenn sich das vorherige Siegel nicht mehr bewegt.
- Regel: Es gibt keine Einschränkung hinsichtlich des mehrfachen Verschiebens eines Siegels oder der Anzahl der ertrinkenden Siegel.
- Regel: Eine richtige Lösung , um die Papi Dichtung hat Ende am Funksender. Die Papa-Dichtung kann den Sender beim Gleiten nicht einfach passieren .
Die Ausgabe besteht aus mehreren Zeilen, jede in der Form
A,B
Wo A
die Dichtung (bewegt D
zum Papi Dichtung, a
... z
für die anderen), und B
ist die Richtung , um die Dichtung zu bewegen (entweder U
, D
, L
, oder R
). Beachten Sie, dass Sie nicht die kürzeste Route finden müssen.Jeder Weg, der das Papa-Siegel zum Ziel bringt, ist eine akzeptable Leistung.
Beispiel Ein- und Ausgänge
Eingang:
25,5
.........................
.#######################.
.####D#############*k###.
.#######################.
.........................
Ausgabe:
D,R
Eingang:
9,7
.........
.a#####b.
.#####d#.
.##l*###.
.###m#p#.
.#D#.#c#.
.........
Ausgabe (eine mögliche Ausgabe von vielen):
m,R
b,L
D,U
D,R
D,D
D,L
Eingang:
26,5
..........................
.###..................###.
.l*##########v#########D#.
.###..................###.
..........................
Ausgabe (eine mögliche Ausgabe von vielen):
v,D
D,L
Wenn Sie weitere Fragen haben, stellen Sie diese bitte in den Kommentaren.
Antworten:
Python 3, 520 Bytes
Ich werde später vielleicht eine detailliertere Erklärung geben, wenn die Leute dies wünschen, aber im Grunde läuft hier eine Tiefensuche mit iterativer Vertiefung des Zustandsraums möglicher Bewegungen. Wenn ein Zug dazu führt, dass das Papa-Siegel abfällt, wird es sofort zurückgewiesen. Wenn der Papa neben dem Sender landet, wird die Bewegungssequenz gedruckt und das Programm durch Null geteilt, um einen Ausstieg zu erzwingen.
Ich kann den Code erheblich beschleunigen, indem ich
if G!=g:
am Anfang der vorletzten Zeile 8 zusätzliche Bytes hinzufüge - dies lehnt Bewegungen ab, die nichts ändern, wie zk,L
im ersten Testfall.Die Laufzeit variiert merklich von einem Lauf zum nächsten, auch mit der gleichen Eingabe - offensichtlich aufgrund der Tatsache, dass ich das nächste Siegel auswähle, um es zu verschieben, indem ich über einen iterierenden
set
, ungeordneten Typ gehe. Ich habe den zweiten Testfall mit 5 Minuten und 30 Sekunden terminiert, obwohl es beim ersten Ausführen nicht so lange zu sein schien. Mit der oben erwähnten Optimierung sind es eher 40 Sekunden.quelle
JavaScript (ES6) 322
334 323Edit2 Animation im Snippet hinzugefügt
Bearbeiten Bugfix, erinnere mich an die Anfangsposition von '*', so dass ich sie auch dann finde, wenn ein Siegel darüber gleitet und es löscht.
Implementiert als Funktion mit der Eingabezeichenfolge als Parameter (wahrscheinlich ungültig, wartet aber auf eine Erläuterung). Ausgabe über Popup.
Das Problem bei der Eingabe mehrzeiliger Zeichenfolgen in JavaScript ist, dass
prompt
es nicht gut funktioniert.Was den Algorithmus betrifft: Ein BFS sollte eine optimale Lösung finden. Ich halte eine
l
Reihe von Spielstatus in variablen , der Status wird das Zeichenrasterg
und die Reihenfolge der Züge so weits
. Außerdem gibt es eine Reihe bisher variablerk
Raster, um zu vermeiden, dass dasselbe Raster immer wieder untersucht wird.Die Hauptschleife ist
Führen Sie Snippet aus, um es in FireFox zu testen
Code-Snippet anzeigen
quelle
C ++, 628 Bytes
Nun, das stellte sich nicht sehr kurz heraus:
Ich habe mich für C ++ entschieden, weil ich die Datenstrukturen (
set
,string
) verwenden wollte, sie sind jedoch von Natur aus recht ausführlich. Die Lösung schneidet bei der Leistung recht gut ab und löst Test 2 auf einem MacBook Pro in etwas mehr als 2 Sekunden, auch wenn sie nicht für die Laufzeit optimiert ist.Code, bevor Leerzeichen und andere Längenreduzierungen entfernt werden:
Die Kernidee hinter dem Algorithmus ist, dass zwei Mengen beibehalten werden:
q
ist die Gruppe von Konfigurationen, deren Verarbeitung aussteht.p
ist der Satz von Konfigurationen, die verarbeitet wurden.Der Algorithmus beginnt mit der Erstkonfiguration in
q
. In jedem Schritt wird eine Konfiguration abgerufenq
, hinzugefügtp
, alle möglichen Siegelbewegungen generiert und die resultierenden neuen Konfigurationen eingefügtq
.Testlauf:
quelle
q
In diesem Sinne wäre es sicherlich besser, ein FIFO für zu verwenden. Der Grund, warum ich ein Set verwendet habe, war, dass ich vermeiden wollte, denselben Eintrag mehrmals einzugeben. Aber als ich das Ergebnis sah, begann ich mir Gedanken zu machen.