ASCII-Reflexionen in einer Box
Sie kennen wahrscheinlich alle das Gesetz der Reflexion . In dieser Herausforderung visualisieren Sie die Flugbahn eines Balls in einer Box.
Verwandte: ASCII Ball in Box Animation und ASCII Doodling: Laser in einer Box
Aufgabe
Sie sind drei ganzzahligen Paare gegeben W,H, x,yund dx,dy- das erste stellt die Größe des Feldes, der zweite die Ausgangsposition und das dritte Paar ist die Richtung , in der die Kugel beginnt sich zu bewegen.
Die Aufgabe besteht darin, die Bewegung des Balls zu visualisieren, bis er aufhört zu rollen. Dies geschieht, sobald sich der Ball an einer Position befindet, an der er zuvor war oder eine Ecke berührt.
Der Charakter *muss die Flugbahn des Balls visualisieren und +seine endgültige Position markieren, der Rest der Box muss aus (Leerzeichen) bestehen.
Beispiele
Um es etwas klarer _darzustellen , wird in diesen Beispielen ein Leerzeichen dargestellt. Auch die Zwischenstufen dienen nur zur Verdeutlichung, Sie müssen nur die letzte Stufe ausgeben, diese Beispiele sind 1indiziert.
Gegeben W = 3, H = 5, x = 3, y = 2und dx = -1, dy = 1:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- Ball beginnt am Punkt
(3,2)und - bewegt sich in Richtung
(-1,1), trifft die Wand bei(1,4)und - wird reflektiert, neue Richtung ist
(1,1). Es trifft die Wand wieder an(2,5) - wo es reflektiert wird. Die neue Richtung ist
(1,-1)und es trifft die Wand sofort an(3,4), - wieder wird es in die Richtung reflektiert
(-1,-1). Es würde jetzt durch Punkte wandern(2,3),(1,2), reflektiert usw., aber da es die Position bereits besucht(2,3)hat, stoppt es dort.
Dieses Beispiel zeigt, was passiert, wenn ein Ball eine Ecke trifft. Hierzu lassen W = 7, H = 3, x = 1, y = 3und dx = 1, dy = -1:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- Startposition ist
(1,3), - Der Ball bewegt sich nun in Richtung,
(1,-1)bis er die Wand bei trifft(3,1) - wo es in die neue Richtung reflektiert wird
(1,1). - Dabei wird
(5,3)es reflektiert und reist in die neue Richtung(1,-1). Es kommt zu einem abrupten Stopp bei,(7,1)weil das eine Ecke ist.
Gegeben W = 10, H = 6, x = 6, y = 6und dx = 1, dy = 1:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Eingabespezifikation
Die Eingabe besteht aus den drei Integer - Paare W,H, x,yund dx,dykann nehmen Sie Eingabe in einem beliebigen Format , die am meisten Sinn für Ihre Programmiersprache und die Reihenfolge spielt keine Rolle spielt. Die akzeptierte Eingabe darf jedoch nicht mehr Informationen codieren, als diese Paare enthalten ( ein Beispiel finden Sie in dieser Antwort).
W,H >= 1x,y1Sind entweder -indexed (1 <= x <= Wund1 <= y <= H) oder0-indexed (0 <= x < Wund0 <= y < H), geben Sie bitte an, welche Indizierung Sie gewählt habendx,dysind immer entweder-1oder1
Ungültige Eingaben können ignoriert werden.
Ausgabespezifikation
- Führende Leerzeichen sind nicht zulässig
- Nachgestellte Leerzeichen können weggelassen werden
- Nachgestellte Leerzeichen sind nicht zulässig, wenn sie nicht in die Box passen
- Nachgestellte Zeilenumbrüche ( nach allen ausgabebezogenen Zeilen) sind zulässig
Nehmen wir das erste Beispiel:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
Testfälle
Unter der Annahme, dass die Eingabe das Format hat (W,H,x,y,dx,dy)und 1-indexing ausgewählt wurde, sind hier einige Testfälle (wieder _hier, um Leerzeichen darzustellen!):
Eingabe: 1,1,1,1,1,1
Ausgabe:
+
Eingabe: 3,3,3,3,1,1
Ausgabe:
___
___
__+
Eingabe: 3,3,3,3, -1, -1
Ausgabe:
+__
_*_
__*
Eingabe: 7,3,1,3,1, -1
Ausgabe:
__*___+
_*_*_*_
*___*__
Eingabe: 10,6,6,6,1,1
Ausgabe:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
Eingabe: 21,7,6,4, -1, -1
Ausgabe:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
Dies ist Code-Golf , also gewinnt das kürzeste Programm / die kürzeste Funktion, aber jede Anstrengung wird geschätzt.
1-indexierte Einschränkung fallen lassen, wenn Sie (?) Über diese erste Frage nicht sicher sind, was Sie meinen, aber es klingt in Ordnung. Ich denke, alles, was eine Bijektion ( {-1,1}x{-1,1} ≡ "Your space") ist, wäre gut.