Inhalt : Jimmy fehlt; wir müssen ihn finden. Wir sollten uns trennen.
Handlungswechsel : Jimmy ist bereits tot.
Aber unsere Darsteller wissen das nicht, deshalb müssen sie sowieso die ganze Gegend durchsuchen. Es gibt ein Gitter von N Spalten × M Zeilen (1 <= M, N <= 256) von Zellen, die entweder als "S" für den Startpunkt markiert sind. für Freiflächen oder "#" für ein Hindernis. Das ist die Karte .
Es gibt 0 <= p <= 26 Costars , 0 <= q <= 26 Extras und 1 Stern . Jeder ist anfangs in der mit S markierten Zelle.
Die Regeln
Jede Person hat einen der folgenden Sichtradien:
...
.....
..@..
.....
...
Der Stern wird mit "@" gekennzeichnet, die Costars mit Großbuchstaben, beginnend mit "A", und die Extras mit Kleinbuchstaben, beginnend mit "a". Der den Startpunkt umgebende Visierradius ist zunächst bereits als gesucht markiert. Wenn dies den gesamten offenen Bereich der Karte ausmacht, endet das Spiel. Jede Runde in der folgenden Reihenfolge :
- Jede Person zieht gleichzeitig einen König (entweder stillstehend oder in eine der 8 Nachbarzellen).
- Alle Zellen im Sichtradius um jede Person werden als durchsucht gezählt.
- Wenn ein Costar niemanden sehen kann, stirbt sie. Wenn ein Extra weder einen Costar, den Stern noch mindestens zwei weitere Extras sehen kann, stirbt er. Diese geschehen gleichzeitig - das heißt, es kann keine Kettenreaktion von Todesfällen in einer einzigen Runde geben; Die oben genannten Bedingungen werden überprüft, und jeder, der sterben wird, stirbt sofort.
- Wenn der gesamte offene Bereich auf der Karte durchsucht wurde, ist die Suche beendet.
Anmerkungen
An jedem Punkt können sich mehrere Personen auf demselben Feld befinden und diese Personen können sich sehen.
Hindernisse behindern niemals das Sehen, nur die Bewegung; Menschen können sich über die, äh ... Lava hinweg sehen?
Die offenen Felder auf der Karte werden garantiert durch Königszüge verbunden.
Das anfängliche "S" wird auch als offener Raum und nicht als Hindernis angesehen.
Jeder Zug eines Königs, der auf einem offenen Feld landet, ist gültig. Zum Beispiel ist der folgende Schritt zulässig:
.... ....
.@#. ---> ..#.
.#.. .#@.
.... ....
Eingang
Die Eingabe erfolgt im Format
N M p q
[N cols x M rows grid with characters ".", "#", and "S"]
Beispieleingaben:
6 5 0 0
......
......
..S...
......
......
und
9 9 1 1
S.......#
.......##
......##.
..#####..
...##....
...##....
...#.....
....#..#.
.........
p und q sind die Anzahl der Costars bzw. Extras.
Ausgabe
Die Ausgabe sollte für jede Runde die Bewegungen sein, die durchgeführt werden, wobei die Richtungen durch angegeben sind
789
456
123
Die Reihenfolge der Züge spielt keine Rolle, da sie alle gleichzeitig ausgeführt werden. Es ist in Ordnung, einen Zug für eine Person nicht aufzulisten, und dies entspricht dem Bewegen in Richtung 5. Züge sollten im folgenden Format aufgeführt werden:
@9 A2 a2 B7.
"." bezeichnet das Ende deiner Züge für eine Runde.
Nachdem die Karte durchsucht wurde, sollte die letzte Ausgabezeile aus drei Ganzzahlen bestehen, die durch Leerzeichen getrennt sind: Die Anzahl der Runden, die Sie zum Durchsuchen des Brettes benötigt haben, die Anzahl der lebenden Kosten und die Anzahl der lebenden Extras. Für die erste Beispieleingabe
6 5 0 0
......
......
..S...
......
......
Folgendes ist eine gültige Ausgabe:
@4.
@6.
@6.
@6.
4 0 0
Ein letzter Hinweis: Der Stern kann nicht sterben und der offene Bereich auf der Karte ist garantiert verbunden, sodass die Suche letztendlich immer erfolgreich sein wird.
Wertung
Ihre Punktzahl ist die Gesamtanzahl der Umdrehungen, die in einer Reihe von Benchmark-Tests durchgeführt wurden. Sie können gerne Ihren eigenen Testfall zusammen mit Ihrer Antwort einreichen. Die Summe der Anzahl der Lebenshaltungskosten über dem Benchmark-Set wird als Auslöser verwendet, und falls es immer noch ein Unentschieden gibt, wird die Summe der Anzahl der Lebenshaltungskosten verwendet.
Test Set und Controller
Derzeit sind 5 Karten unter https://github.com/Tudwell/HorrorMovieSearchParty/ online . Jeder, der eine Antwort einreicht, kann auch einen Testfall einreichen, den ich aus irgendeinem Grund ablehnen kann (wenn ich Ihre Karte aus irgendeinem Grund ablehne, können Sie einen anderen einreichen). Diese werden nach meinem Ermessen dem Testset hinzugefügt.
Ein Python- Controller (getestet in 2.7.5) wird auf github als controller.py bereitgestellt . Ein zweiter Controller dort, controller_disp.py , ist identisch mit der Ausnahme, dass er während der Suche eine grafische Ausgabe zeigt (erfordert Pygame-Bibliothek).
Verwendung :
python controller.py <map file> <your execution line>
Dh:
python controller.py map1.txt python solver.py map1.txt
Der Controller hat die Ausgabe des Formulars (an die Standardeingabe Ihres Programms) gesendet
Turn 1
@:2,3 A:2,3 B:2,3.
##...##
#ooo..#
ooooo..
ooooo..
ooooo..
#ooo...
##.....
###....
----------------------------------------
Dies ist die Zugnummer (Zug 1 ist, bevor Sie umgezogen sind), eine mit '.'- abgeschlossene Liste aller Akteure und ihrer x, y-Koordinaten (das linke obere Zeichen ist (0,0)), eine Darstellung des gesamten Brett und eine Linie mit 40 '. Es wartet dann auf die Eingabe (von der Standardausgabe Ihres Programms ) des Formulars
@9 A2 B7.
Dies ist das oben angegebene Ausgabeformat. Die Steuerung gibt ein 'o' für den durchsuchten freien Raum aus, '.' nach freiem Raum, der nicht durchsucht wurde, und '#' nach Hindernissen. Es enthält nur lebende Personen in der Liste der Personen und ihrer Koordinaten und verfolgt alle Spielregeln. Der Controller wird beendet, wenn ein unzulässiger Zug versucht wird. Wenn die Bewegungen für eine gegebene Runde die Suche beenden, ist die Ausgabe nicht wie oben; stattdessen ist es von der Form
Finished in 4 turns
4 1 0
"4 1 0" bedeutet hier 4 Runden insgesamt, 1 lebender Costar und 0 lebende Extras. Sie müssen den Controller nicht verwenden. Fühlen Sie sich frei, es zu verwenden oder für Ihren eigenen Eintrag zu ändern. Wenn Sie es verwenden möchten und auf Probleme stoßen, lassen Sie es mich wissen.
Vielen Dank an @githubphagocyte für die Hilfe beim Schreiben des Controllers.
Bearbeiten: Für einen zufälligen Eintrag können Sie einen beliebigen Lauf auf einer bestimmten Karte als Punktzahl für diese Karte auswählen. Beachten Sie, dass Sie aufgrund der Bewertungsanforderungen immer die wenigsten Runden, dann die wenigsten toten Costars und dann die wenigsten toten Extras für jede Karte auswählen sollten.
quelle
Antworten:
Ruby, Safety First + BFS + Randomness, Punktzahl ≤ 1458
Ich bin mir nicht sicher, wie Sie zufällige Einsendungen bewerten werden. Wenn alle Antworten deterministisch sein müssen, lassen Sie es mich wissen und ich werde einen Samen aussuchen oder die Zufälligkeit insgesamt loswerden.
Einige Merkmale und Mängel dieser Lösung:
map5.txt
dauert zwischen 1 und 13 Minuten.Einige Ergebnisse
Hier ist der Code:
Dort sind einige Debug-Ausgaben auskommentiert. Besonders der
if group['@']
Block ist sehr interessant, da er eine Visualisierung der BFS-Daten ausgibt.Bearbeiten: Deutliche Geschwindigkeitsverbesserung, indem das BFS gestoppt wird, wenn bereits ein besserer Zug gefunden wurde (was eigentlich der Grund war, warum BFS verwendet wurde).
quelle