ボックス内のASCII反射


8

ボックス内のASCII反射

おそらく皆さんは反射法則をご存知でしょう。この課題では、ボックス内のボールの軌道を視覚化します。

関連:ボックス内のASCIIボールアニメーションASCII Doodling:ボックス内のレーザー

仕事

次の3つの整数の組を与えているW,Hx,yそしてdx,dy-第一ボール開始する移動方向であるボックス、第二の開始位置及び第3の対のサイズを表します。

タスクは、ボールが転がるのを止めるまでボールの動きを視覚化することです。これは、ボールが以前の位置にあるか、またはコーナーに当たるとすぐに発生します。

キャラクター*はボールの軌道を視覚化し、+その最終位置をマークします。ボックスの残りの部分は(空白)で構成されている必要があります。

少し明確にするために、これらの例で_は空白を表します。また、中間ステージは明確化のためにここにのみあります。最後のステージを出力する必要があるだけです1。これらの例には、インデックスが付けられています。


与えられW = 3, H = 5x = 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 = 3x = 1, y = 3そしてdx = 1, dy = -1

_______    __*____    __*____    __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______    *______    *___*__    *___*__
  • 開始位置は(1,3)
  • ボール(1,-1)が壁に当たるまで方向に移動します(3,1)
  • 新しい方向に反映され(1,1)ます。
  • (5,3)、それが反射して新たな方向に移動されます(1,-1)(7,1)コーナーなので急停止。

与えられW = 10, H = 6x = 6, y = 6そしてdx = 1, dy = 1

__________    __________    ________*_    ________*_    ________*_    __*_____*_    __*_____*_
__________    _________*    _________*    _______*_*    _______*_*    _*_____*_*    _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________    _______*__    _______*__    _____*_*__    _*___*_*__    _*___*_*__    _*___+_*__
__________    ______*___    ______*___    ____*_*___    __*_*_*___    __*_*_*___    __*_*_*___
_____*____    _____*____    _____*____    ___*_*____    ___*_*____    ___*_*____    ___*_*____

入力仕様

入力は、3つの整数のペアで構成されW,Hx,yそしてdx,dy、あなたのプログラミング言語と順序関係ないため、最も理にかなっている任意の形式で入力がかかる場合があります。ただし、受け入れられた入力は、これらのペアに含まれるよりも多くの情報をエンコードしてはなりません(例については、この回答を参照してください)。

  • W,H >= 1
  • x,y1-indexed(1 <= x <= Wand 1 <= y <= H)または0-indexed(0 <= x < Wand 0 <= y < H)のいずれかです。選択したインデックスを指定してください
  • dx,dy常に-1または1

無効な入力は無視できます。

出力仕様

  1. 先頭の空白は許可されていません
  2. 末尾の空白は省略できます
  3. ボックスに収まらない場合、末尾の空白は許可されません
  4. 後続の改行(すべての出力関連行の)が許可されます

最初の例を見てみましょう:

       (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

出力:

__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____

これはなので、最も短いプログラム/関数が優先されますが、どんな努力も歓迎されます。


2D言語の1つ(Turtle?)がこの課題に非常に効果があると思います。
Draco18sは、2017

1
4つの可能なdx / dy値を4つの連続した奇数の整数としてエンコードできますか?xとyが1インデックスであることはどれほど重要ですか?
ニール、

必要に1応じて-indexed制約を削除します(?)その最初の質問について、どういう意味かわかりませんが、問題ないようです。全単射({-1,1}x{-1,1} ≡ "Your space")なら何でもいいと思います。
ბიმო

インデックス作成で編集しましたが、他の質問についてより具体的に説明できますか?
'2017

1
私はこの笑の炭の答えを見たいです。
マジックタコの壷

回答:


8

チャコール、50バイト

UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+

オンラインでお試しください!リンクはコードの詳細バージョンです。5つの入力を取りますwhxyaxそしてy、ゼロインデックス化されています。a表すdxdy、以下の符号化に係ります。

a mod 8 == 1 => dx = 1, dy = 1
a mod 8 == 3 => dx = -1, dy = 1
a mod 8 == 5 => dx = -1, dy = -1
a mod 8 == 7 => dx = 1, dy = -1

説明:

UONN 

(末尾のスペースに注意)入力の幅と高さまでスペースで背景を塗りつぶします。(通常、背景の各四角は空の文字列で、出力時にスペースに変換されます。)

JNN

カーソルを初期座標に移動します。

↷N

初期角度に回転します。

W⁼ KK«

現在の正方形がスペースである限り繰り返されます。

    *

アスタリスクを印刷して、現在の方向に進みます。

    ¿¬KK«

カーソルが元の長方形の外に移動した場合、

        ↷²¶*

方向を回転させてから、改行(前の四角に戻すのに便利)と、新しい方向に移動するアスタリスクを印刷します。

        ¿¬KK«

カーソルが元の長方形の外に戻った場合、

            ↷²¶↷²*

カーソルを前の四角形に戻し、再度回転させて、アスタリスクを反対方向に印刷します。

            ¿¬KK«

カーソルがまだ長方形の外側にある場合は、コーナーにいる必要があります。

                ↷²¶

だから前の広場に戻って、あきらめてください。

»»»»+

移動できなくなったら、「+」記号を印刷して停止します。


1
いいね!ここでは、それを試したい人のためのTIOを示します。
ბიმო

@BruceForteおかげで、私はソリューションを使用するまでTIOにリンクしたくありませんでしたPeek()(今はそれを行います)。
ニール、

おっと、Peek今すぐ機能します
ASCIIのみ

2

Desmos Calculator-さらなる知識を助けるための非競争

オンラインでお試しください!

入力:

X as X position to Start
Y as Y position to Start
s as slope -> -1 for dX/dY = -1, +1 for dX/dY = +1
h as height of box, with 0-indexing
w as width of box, with 0-indexing

中間体:

Let b = gcd(h,w),  
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|

略式:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

出力:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

使い方:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

プログラムは最終的な基準を満たしていません-交差点で停止し、+でマークされているため、他のユーザーがチャレンジを完了するのに役立つ情報を提供するために、非競争として提出されます。Desmosが[0、B]ではなく(0、B)の境界を持つように見えるため、c = 0またはc = bのときにDesmosを機能させるために、0.01の小さなオフセット係数が導入されました。 )


これを見たと思いますか?
ბიმო

実は、私は自分の家で過ごす時間を約4日間オタクにして失いました。私は本当に、この問題が本当に好きだった。
マーク

どういたしまして; Pまた、関連しています。
ბიმო

1

Pythonの3293の 279バイト

w,h,x,y,i,j=map(int,input().split());x-=1;y-=1;l=[x[::]for x in[[' ']*w]*h]
while 1:
 a,b=((x,i)in[(0,-1),(w-1,1)]),((y,j)in[(0,-1),(h-1,1)])
 if a and b or l[y][x]!=' ':l[y][x]='+';break
 i,j=i*(-a*2+1),j*(-b*2+1);l[y][x]='*';x+=i;y+=j
print('\n'.join([''.join(x) for x in l]))

オンラインでお試しください!


1
いいね!あなたは短くすることによって、いくつかのバイトを保存することができますfx,fyし、交換するTrueようなもので1見る、ここに
ბიმო

@BruceForteありがとう!これらを交換するのを忘れました。
Andrew Dunai 2017

1
関数に変換して-13バイト
アルテミスはまだ

1
ちょっと待って、この質問がどれだけ古いかを見てください...それでも私はHNQからここに着きました...
アルテミスはまだSEを信頼していません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.