Dein Leben könnte davon abhängen. Blinzel nicht. Blinzel nicht mal. Blink und du bist tot. Sie sind schnell. Schneller als Sie glauben können. Drehen Sie nicht den Rücken, schauen Sie nicht weg und blinzeln Sie nicht! Viel Glück.
Weinende Engel sind eine fremde Rasse, die sich nicht bewegen kann, wenn sie von einem anderen Wesen (sogar einem anderen Engel) beobachtet werden. Sie ernähren sich, indem sie ihre Opfer in die Vergangenheit schicken. Sie ( der Doktor ) sind mit einigen in einem Raum gefangen und müssen zu Ihrer TARDIS.
Aufgabe
Schreiben Sie ein Programm, das anhand einer ASCII-Darstellung eines rechteckigen Raums einen Pfad ausgibt, der Sie in Sicherheit bringt. Wenn ein Engel angreifen kann - zu irgendeinem Zeitpunkt während deines Fortschritts - dann ist dieser Weg nicht sicher. Ein Engel kann angreifen, wenn er dich sehen kann, ohne von dir oder einem anderen Engel gesehen zu werden.
Eingang
Die Eingabe besteht aus zwei Teilen. Erstens die Richtung, in die Sie schauen (NSEW). Dann in den folgenden Zeilen eine Darstellung des Raums mit den Start- / Endpositionen und der Position / Ausrichtung aller Engel.
Das folgende Beispiel zeigt, dass es einen Engel gibt, der nach Westen zeigt, und Sie beginnen, nach Süden zu blicken.
S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
.
- FreiraumD
- Der Doktor (Ausgangsposition)T
- Die TARDIS (Endposition)N,S,E,W
- Ein Engel, der der angegebenen Richtung zugewandt ist (Norden, Süden, Osten, Westen)
Sichtlinie
Sie können jeden Raum innerhalb von 45 Grad der Blickrichtung sehen. Die Sichtlinie ist beeinträchtigt, wenn sich entlang einer direkten horizontalen, vertikalen oder 45-Grad-Diagonale ein anderes Objekt befindet. Jede andere Diagonale ist nicht behindern die Sicht. Die Sichtlinie der Engel funktioniert auf die gleiche Weise. Im Folgenden wird beispielsweise -
Ihr Sichtfeld dargestellt, vorausgesetzt, Sie sind nach Süden ausgerichtet.
........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----
Ausgabe
Die Ausgabe ist eine Zeichenfolge, die den Pfad darstellt, den Sie zum Beenden verwenden. Wenn es mehrere sichere Pfade gibt, wählen Sie einen aus. Wenn kein Pfad sicher ist, wird ausgegeben 0
. Wenn die Karte fehlerhaft ist, tun Sie, was Sie möchten, einschließlich des Absturzes. Betrachten Sie es als fehlerhaft, wenn der Raum nicht rechteckig ist, es keinen Ausgang gibt usw. Wenn es keine Engel gibt, ist es nicht fehlerhaft, einfach einfach.
Für jeden Schritt haben Sie zwei Möglichkeiten: Bewegen Sie sich in eine NSEW-Richtung oder drehen Sie sich in eine NSEW-Richtung (ohne die Position zu ändern). Zum Bewegen geben Sie einfach den Buchstaben für diese Richtung aus. Um sich einer Richtung zuzuwenden, geben Sie F
den entsprechenden Buchstaben ein. Zum Beispiel die folgende Ausgabe:
SSFESSSSSSSW
ist ein sicherer Pfad für das im Eingabeabschnitt angegebene Beispiel. Du bewegst dich zweimal nach Süden, nach Osten, um den Engel im Blick zu behalten, und dann noch siebenmal nach Süden und einmal nach Westen, um die TARDIS zu betreten.
Testfälle
1) Sie können um den nach Osten gerichteten Engel herumgehen, um zur TARDIS zu gelangen. Wenn Sie nicht direkt zwischen sie treten, rasten sie sich gegenseitig ein, sodass es egal ist, in welche Richtung Sie sich zu einem bestimmten Zeitpunkt befinden.
W
...D....
........
........
........
.E.....W
........
........
...T....
2) Sie verlieren. Es gibt keine Möglichkeit, an ihnen vorbei zu kommen. Sie können sich sehen, bis Sie zwischen sie treten. An diesem Punkt können Sie nicht beide konfrontieren und Sie sind fertig. Könnte auch nur die Augen schließen und es hinter sich bringen.
S
...D....
........
........
........
E......W
........
........
...T....
Gewinnen
Es gelten die Standard-Golfregeln und -Lücken , die Mindestanzahl an Gewinnen. Ich werde versuchen, bald weitere Testfälle zu bekommen, kann aber in der Zwischenzeit gerne eigene vorschlagen.
Bild und Zitat von Doktor Who.
J
) steht.Antworten:
Python -
559 565 644633Die Eingabe muss folgendermaßen erfolgen:
Im Wesentlichen ist es dieser Ansatz, der angewendet wird, um alle Zustände (Position und Richtung) zu finden, die der Arzt sicher erreichen kann, um zu speichern, wie er dort ankommt, und um den Weg im Erfolgsfall auszudrucken. Positionen und Richtungen werden mit komplexen Zahlen realisiert.
Ich könnte wahrscheinlich einige Zeichen mit Sages komplexer Zahlenarithmetik sparen, aber das würde extrem lange dauern.
Ich dachte zuerst, ich könnte sechs Zeichen einsparen, indem der Doktor nach Erreichen der Tardis in eine bestimmte Richtung gedreht wird, aber ich erkannte, dass dies zu falschen Lösungen führen könnte. Auch habe ich zuerst die Regeln falsch verstanden.
Hier ist eine meist ungolfte Version:
Testfälle
Testfall 1:
Testfall 2:
VisualMelons Testfall:
quelle
C #
17712034196218871347 BytesDie blockierende LOS-Prüfung wurde in einer Schleife neu geschrieben, wodurch sie viel aufgeräumter und etwa 450 Byte kürzer ist
Dies ist ein vollständiges Programm, bei dem erwartet wird, dass die Eingabe mit einem EOF beendet und an STDIN übergeben wird. Es gibt (hoffentlich) den kürzesten Pfad zur TARDIS aus oder "0", wenn kein Pfad vorhanden ist. Es verwendet eine miese Breitensuche, um alle möglichen Routen zu verfolgen, und fährt dann von der TARDIS zurück zu The Doctor, um die Ausgabe zusammenzusetzen.
Formatierter Code:
Ausgabe zum Beispiel Eingabe
Ausgang für Testfall 1)
Ausgang für Testfall 2)
Ich präsentiere auf Wunsch einen neuen Testfall:
Mein Programm gibt aus
WozzeCs Testfall 1:
WozzeCs Testfall 2:
quelle
C #
1454, 1396, 1373, 1303,1279Richtig. Also habe ich beschlossen, es zu versuchen, und Junge hat es eine Weile gedauert. Es ist hauptsächlich mit logischen Operatoren aufgebaut.
Um nicht nach Null zu suchen, habe ich beschlossen, ein Feld mit [MAX_SIZE * 3] * [MAX_SIZE] * 3 zu verwenden und das Spielbrett in die Nähe der Mitte zu legen.
Schleifenprüfungen werden von innen nach außen bis zu 50 (MAX_SIZE) durchgeführt. So etwas in der Art:
Wenn ein EWS oder N gefunden wird, mache ich ihrerseits die gleiche Überprüfung. Wenn etwas gefunden wird, das die Engel (nicht den Doktor) ansieht, geben sie 15 als freien Durchgang zurück. Wenn sie nicht angeschaut werden, kehren sie in die Richtung zurück, in die sich der Arzt aus Sicherheitsgründen begeben sollte. Dh N würde 2 für Süden zurückgeben. Es sei denn, es ist NW oder NE. In diesem Fall wird 6 (2 + 4) bzw. 10 (2 + 8) zurückgegeben.
Wenn zwei Engel den Doktor beobachten, würden die Rückgabewerte von diesen "UND-verknüpft" sein, so dass im Testbeispiel 2 Crunch-Positionen 4 UND 8 zu 0 werden würden. Dies bedeutet, dass die Position schlecht ist und vermieden werden sollte.
Erweiterter Code:
Testergebnisse
1 Beispiel: FNSSSWNNNWSSSWSSSSENNESES
2 Beispiel: Kein Ausweg
VisualMelon-Beispiel: FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE
Mein Testfall1: FSSENEEEFWSSFNSWWN
Mein Testfall2: FSEEEESFWSSSSFNWWWNFENNFSEES
Wie zu sehen ist, stolziert mein Doktor gerne wie eine Dusche herum, um den Engeln zu zeigen, wie viel Spaß es macht, sich zu bewegen. Ich kann die Software veranlassen, den kürzesten Pfad zu finden, aber es dauert länger und benötigt mehr Code.
Testfälle für euch
Noch einer:
quelle
using S=System.Console;
, oder Sie können einfach das S in Ihrem Code entfernen und 6 Bytes sparenusing System
. Jetzt muss ich versuchen, meine naive Herangehensweise noch etwas zu