n
Bewegen Sie die Pfeile bei einem Satz geschlossener, nicht überlappender 2D-Konturen (durch mindestens ein Leerzeichen auch in Diagonalen getrennt) mit Pfeilen, die durchgehend im oder gegen den Uhrzeigersinn ausgerichtet sind (jede Kontur hat ihre eigene Richtung) und einer positiven Zahl n
Schritte entlang der Konturen in die jeweilige Richtung. Die Pfeile sind > v < ^
jeweils für die Rechts-, Abwärts-, Links- und Aufwärtsrichtung dargestellt. Dort sind die anderen Zeichen -
(horizontal), |
(vertikal) und +
(Ecke). Wenn sich ein Pfeil an einer Ecke befindet, behält er seine aktuelle Richtung bei und ändert sie erst nach dem Abbiegen.
Es wird immer ein gerades Segment (oder ein Leerzeichen) zwischen zwei Ecken geben (wie +-+
bei der Horizontalen und ähnlich bei der Vertikalen) - mit anderen Worten, die scharfen U
Kurven sind verboten. Die Segmente zwischen den Ecken sind entweder vertikal oder horizontal und die Biegung an einer Ecke beträgt immer 90 Grad.
Eingang:
- eine positive ganze Zahl -
n
- Anzahl von Schritten - eine ASCII-Darstellung der Konturen - es kann sich um eine mehrzeilige Zeichenfolge, eine Liste von Zeichenfolgen, eine Liste von Zeichen usw. handeln.
Ausgabe:
Dieselben Konturen mit allen Pfeilen haben die n
Schritte in der gesamten Richtung der jeweiligen Kontur verschoben .
Testfälle:
1.
Eingang:
n
= 1
+----->->
| |
| v---+
| |
+---<-------+
Ausgabe:
+------>+
| v
| +>--+
| |
+--<--------+
2.
Eingang:
n
= 2
+-----+ +---+
| | | |
+-->--+ | v
| |
+--->---+ |
| |
+------<<---+
Ausgabe:
+-----+ +---+
| | | |
+---->+ | |
| |
+----->-+ v
| |
+----<<-----+
3.
Eingang:
n
= 3
+---+ +---+ +-------+
| | | v | |
^ | | | +-<-+ |
| | ^ | | v
| +---+ +-->----+ |
| |
| +-------+ +---+ |
| | | v | |
+---+ +---+ +---+
Ausgabe:
+>--+ ^---+ +-------+
| | | | ^ |
| | | | +---+ |
| | | | | |
| +---+ v----->-+ |
| |
| +-------+ +---+ v
| | | | | |
+---+ +-<-+ +---+
4.
Eingang:
n
= 1
+--+
| |
| +---+
| |
+----+ |
| |
+-+
Ausgabe:
+--+
| |
| +---+
| |
+----+ |
| |
+-+
5.
Eingang
n
= 4
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
Ausgabe:
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
6.
Eingang:
n
= 1
^->
^ v
<<v
Ausgabe:
^>+
^ v
<<v
Schreiben Sie eine Funktion oder ein Programm zur Lösung der oben genannten Aufgabe. Der kürzeste Code in Bytes in jeder Sprache gewinnt. Lassen Sie sich von den Golfsprachen nicht entmutigen. Die Erklärung des Algorithmus und des Codes wird sehr geschätzt.
There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Antworten:
JavaScript (ES6),
210 ... 182180 Bytes(m)(n)
Probieren Sie es online!
Wie?
Sie können diesem Link folgen , um eine formatierte Version der Quelle anzuzeigen.
Verpackung
Aktualisierungsmethode
Es ist nicht möglich, jeden Pfeil einzeln sicher zu verschieben, da nicht aktualisierte Pfeile durch aktualisierte Pfeile überschrieben werden können. Stattdessen entfernen wir zuerst alle Pfeile und berechnen ihre neuen Positionen. Wir übernehmen die neuen Positionen ein zweites Mal.
Die neuen Positionen werden durch einfaches Ausführen übernommen
eval(n)
.Richtungen
$
Ecken
+
-
|
$
"$"
"$"
"$"
Animierte Version
Code-Snippet anzeigen
quelle
K (ngn / k) ,
183 161157 BytesProbieren Sie es online!
{
}/
Beim Aufruf mit einem int left arg n wird die Funktion in{
}
n-fachen Schritten auf das right arg angewendetA:"^>v<"
PfeileD,:-D:(-1 0;!2)
∆y, ∆x für die 4 Hauptrichtungens:(#x;#*x)
Form der Eingabe: Höhe, Breitec:~^x
countours - Boolesche Matrix, die anzeigt, wo sich die Nicht-Leerzeichen befindenr:" -+|"c*+/'3'0,c,0
Erstellen Sie die Zeichenmatrix mit einer Zählung ohne Pfeile neu, indem Sie für jede Zelle in Selbst + Oben + Unten zählenc
und 1->-
, 2->+
, 3-> ersetzen|
t:A?,/x
Arten von Pfeilen: 0 1 2 3 für^>v<
alle anderen Zellen werden als0N
(null) dargestelltp:+s\&~^t
Koordinaten der Pfeile$[#p
;;:r]
Wenn es keine Pfeile gibt, kehre zurückr
q:+p+/:D@4!(t^0N)+/:0 1 3
alle 3 möglichen neuen Positionen für jeden Pfeil - wenn er sich vorwärts bewegt, wenn er sich nach links dreht und wenn er sich nach rechts drehtq:q@'*'&'~^x ./:/:q
Wählen Sie für jeden Pfeil die erste Option, die auf dem Countour landet@[,/r;s/+q;:;A@D?q-p]
Drückenr
Sie die Pfeile flach und setzen Sie sie an ihre neuen Positionen und in ihre neuen Richtungens#
wieder in die ursprüngliche Form bringenquelle
Kohle , 105 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Beinhaltet 22 Bytes, um ein umständliches Eingabeformat zu vermeiden. Erläuterung:
Geben Sie bequem die Konturen und die Anzahl der Schritte ein.
Die Richtungszeichen werden mehrmals verwendet, sodass die Zeichenfolge hier zwischengespeichert wird. Der Index eines Richtungszeichens in dieser Zeichenfolge wird als Richtung bezeichnet.
Drucken Sie die Originalkonturen, ohne den Cursor zu bewegen.
Bewegen Sie sich über die Zeichen in der Kontur.
Wenn das aktuelle Zeichen ein Richtungszeichen ist ...
... dann speichere die Richtung und Position in einer Liste ...
... und ersetzen Sie das Zeichen durch das entsprechende Zeilenzeichen.
Geben Sie andernfalls das Zeichen aus und fahren Sie mit dem nächsten Zeichen fort.
Durchlaufen Sie die gespeicherten Positionen.
Zur gespeicherten Position springen.
Extrahieren Sie die gespeicherte Richtung.
Führen Sie eine Schleife über die entsprechende Anzahl von Schritten aus.
Ermitteln Sie die Richtung des nächsten Schritts. Dabei handelt es sich um eine beliebige Richtung, die weder umgekehrt noch leer ist.
Machen Sie einen Schritt in diese Richtung. (Die Richtungsindizes für den
Move
Befehl entsprechen dem doppelten Wert meiner Richtung.)Drucken Sie das entsprechende Richtungszeichen.
quelle
APL (Dyalog Unicode) , 111 Byte SBCS
Probieren Sie es online!
ähnlich wie meine k Antwort
quelle