ボックス内のASCII反射
おそらく皆さんは反射の法則をご存知でしょう。この課題では、ボックス内のボールの軌道を視覚化します。
関連:ボックス内のASCIIボールアニメーションとASCII Doodling:ボックス内のレーザー
仕事
次の3つの整数の組を与えているW,H、x,yそしてdx,dy-第一ボール開始する移動方向であるボックス、第二の開始位置及び第3の対のサイズを表します。
タスクは、ボールが転がるのを止めるまでボールの動きを視覚化することです。これは、ボールが以前の位置にあるか、またはコーナーに当たるとすぐに発生します。
キャラクター*はボールの軌道を視覚化し、+その最終位置をマークします。ボックスの残りの部分は(空白)で構成されている必要があります。
例
少し明確にするために、これらの例で_は空白を表します。また、中間ステージは明確化のためにここにのみあります。最後のステージを出力する必要があるだけです1。これらの例には、インデックスが付けられています。
与えられW = 3, H = 5、x = 3, y = 2そしてdx = -1, dy = 1:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- ボールはポイントから始まり
(3,2)、 - 方向に移動し
(-1,1)、で壁にぶつかる(1,4)と、 - 反映され、新しい方向は
(1,1)です。それは再び壁にぶつかります(2,5) - 反映される場所。新しい方向で
(1,-1)あり、すぐに壁にぶつかります(3,4)、 - 再びそれは方向に反映され
(-1,-1)ます。これは、ポイント(2,3),(1,2)、反射などを通過しますが、すでにその位置(2,3)に移動したため、そこで停止します。
この例は、ボールがコーナーに当たった場合にどうなるかを示しています。このためにW = 7, H = 3、x = 1, y = 3そしてdx = 1, dy = -1:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- 開始位置は
(1,3)、 - ボール
(1,-1)が壁に当たるまで方向に移動します(3,1) - 新しい方向に反映され
(1,1)ます。 - で
(5,3)、それが反射して新たな方向に移動されます(1,-1)。(7,1)コーナーなので急停止。
与えられW = 10, H = 6、x = 6, y = 6そしてdx = 1, dy = 1:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
入力仕様
入力は、3つの整数のペアで構成されW,H、x,yそしてdx,dy、あなたのプログラミング言語と順序関係ないため、最も理にかなっている任意の形式で入力がかかる場合があります。ただし、受け入れられた入力は、これらのペアに含まれるよりも多くの情報をエンコードしてはなりません(例については、この回答を参照してください)。
W,H >= 1x,y1-indexed(1 <= x <= Wand1 <= y <= H)または0-indexed(0 <= x < Wand0 <= y < H)のいずれかです。選択したインデックスを指定してくださいdx,dy常に-1または1
無効な入力は無視できます。
出力仕様
- 先頭の空白は許可されていません
- 末尾の空白は省略できます
- ボックスに収まらない場合、末尾の空白は許可されません
- 後続の改行(すべての出力関連行の後)が許可されます
最初の例を見てみましょう:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
テストケース
入力がフォーマットで(W,H,x,y,dx,dy)あり、1-indexingが選択されていると仮定して、ここにいくつかのテストケース_があります(ここでも空白を表すためにここにあります!):
入力:1,1,1,1,1,1,1
出力:
+
入力:3,3,3,3,1,1
出力:
___
___
__+
入力:3,3,3,3、-1、-1
出力:
+__
_*_
__*
入力:7,3,1,3,1、-1
出力:
__*___+
_*_*_*_
*___*__
入力:10,6,6,6,1,1
出力:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
入力:21、7、6、4、-1、-1
出力:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
これはcode-golfなので、最も短いプログラム/関数が優先されますが、どんな努力も歓迎されます。
1応じて-indexed制約を削除します(?)その最初の質問について、どういう意味かわかりませんが、問題ないようです。全単射({-1,1}x{-1,1} ≡ "Your space")なら何でもいいと思います。