跳ねるボールのシミュレーション


8

STDOUTに、バウンドするボールの進む方向を示すパターンを印刷します。

次の仮定が行われます。

  • ボールは左上隅から始まり0, 0ます。初期速度はゼロです。
  • 重力は9.8ms^-2正確に、床に向かっています(y正)。
  • ボールの重さは500g正確です。
  • 可変軌道を追加するための適切な計算を追加する必要がない限り、ボールは床に対して45度または135度でバウンドします。(ボーナス任意ポイント!)
  • ボールは、ばね定数の反発係数/弾力定数を0.8正確に持っています。
  • ボールは完全に球形で、バウンドしても変形しません。
  • 部屋の高さは25文字、幅は130文字です。各xとyは1メートルで、各ボールの位置は個別のサンプルを表します。正確な時間は意図的に指定されていませんが、ディスプレイはボールのパスを十分に明確にする必要があります。出力には、最終的な位置だけでなく、ボールのパスが表示されます。
  • フロアとボールは、STDOUTの文字を使用して示す必要があります。ボールや床面がないことをスペース文字で示してください。
  • 計算では小数点以下3桁に丸めることを想定できます。(純粋な整数を使用するソリューションは、このルールに特に関心があります。)
  • シミュレーションは、ボールが床から動かないか、部屋から出たときに停止します(x > width of area。)
  • プログラムはボールのパスをシミュレートする必要があります。単にファイルからロードしたり、プログラムで何らかの方法でエンコードしたりするのではありません。このためのテストは、オプションで定数の1つを変更することです。プログラムが新しい正しい結果を計算しない場合は、資格がありません。

出力例:

*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                         ***********                                                                                             
*                    *****           ****                                                                                         
*                 ****                   ***                                                                                      
*               ***                        ***                                                                                    
*              **                             **                                                                                  
*           ***                                 **                                                                                
*          **                                     **                          *********                                           
*         *                                        **                      ****       ****                                        
*       **                                           *                   **               **                                      
*      *                                              **               **                   **                                    
*     *                                                 *            **                       **              ********            
*   **                                                   *          **                         **          ****      ****         
*  *                                                      **      **                             **       **            **        
* *                                                        **    **                               **    **                **    **
**                                                          **  **                                 **  **                  **  ** 
*                                                            ****                                   ****                    ***   
**********************************************************************************************************************************

勝者の決定。私は答えを受け入れます:

  1. 上記で定義されたルールを満たします。
  2. ボーナス機能が考慮されます。
  3. 最短かつ最もエレガントです(主観的な決定)。

1
入力および/または開始速度(エネルギー?)がない、または私は盲目ですか?今それを見ると、ボックスを描いてボールが静止していると言うか、画像をgzipしてすべての実行で表示できます。
shiona 2013年

1
しかし、ボールが45°の方向に対して0.0001 m / s(または十分に小さいもの)の速度であると判断した場合、ボールは選択した解像度で地面から離れることはできません。単一の回答をハードコーディングすることを不可能にするために、問題には常に何らかの種類の入力(ユーザー、ランダムなど)があるべきだと思います。
shiona 2013年

4
左側の星はY軸ですか、それともボールのパスを示していますか?それらがボールのパスをマークする場合、この物理シミュレーションは、ボールが右側にモーションコンポーネントを持たないため、少し怪しいように見えます。したがって、平らな床で跳ねるとき、まっすぐ上に跳ね返り、右には跳ね返らないはずです。また、角度はバウンスごとにフラットになります(右側にモーションコンポーネントがある場合)。
Thomas W.

1
これですかcode-golfcode-challengeそれとも何ですか?適切にタグ付けしてください。
ポールR

1
ボールが単純にドロップされたとすると、何がボールを右に動かすのですか?なぜ単純に上下しないのですか?
DavidC 2013年

回答:


5

Python 143バイト

u=v=x=y=0
a=[[s]*130for s in' '*24+'*']
while x<129:
 if y+v>24:v*=-.8;u=-v
 v+=98e-4;x+=u;y+=v;a[int(y)][int(x)]=s
for r in a:print''.join(r)

結果のカーブは例とは少し異なりますが、これは、ボールが床に入る前ではなく、前に速度が調整されるためです。

*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                     ***************                                                                                             
*                 ****               ****                                                                                         
*               ***                     ***                                                                                       
*             **                           **                                                                                     
*           ***                              **                                                                                   
*         **                                   **                          ******                                                 
*        **                                     **                     ****     *****                                             
*       *                                         **                 ***             ***                                          
*     **                                           **              **                  **                                         
*    *                                               *           **                      **            *********                  
*   *                                                 **        **                        **         ***       ***                
*  *                                                   **     **                            **     ***           **        *****  
* *                                                     **   **                              **   **               **   ***    ***
**                                                       ** **                                ** **                 ** **         
*                                                         ***                                   **                   ***          
**********************************************************************************************************************************

Python 132バイト

一定のx速度で始まる、より現実的なバージョン:

v=x=y=0
a=[[s]*130for s in' '*24+'*']
while x<129:v=(y+v<24or-.8)*v+98e-4;x+=.3;y+=v;a[int(y)][int(x)]=s
for r in a:print''.join(r)

生成:

****                                                                                                                              
    **                                                                                                                            
     ***                                                                                                                          
       **                                                                                                                         
        **                                                                                                                        
         **                                                                                                                       
          **                                                                                                                      
           *                                                                                                                      
            *                                                                                                                     
            **                   *********                                                                                        
             *                 **        **                                                                                       
              *              **            **                                                                                     
              **            **              **                                                                                    
               *           **                **                                                                                   
               **         **                  **                *****                                                             
                *        **                    **             ***   ****                                                          
                 *       *                      **          **         **                                                         
                 **     *                        *         **            **                                                       
                  *    **                         *       *               **          *******                                     
                  *    *                          **    **                 **      ***       **                                   
                   *  *                            *    *                   **    **           **       *******                   
                   * **                             *  *                     *   **             **    ***     ***      ****       
                    **                              ***                       * *                ** **          **  ****  ****    
                    **                               **                        **                 ***             ***        *****
**********************************************************************************************************************************

おめでとう、すごい!
ルービック2013

1

Pythonで独自のソリューションを送信します。少しだけ簡略化されました。それを行うにはもっと良い方法があると確信しています!282 280文字。質問の投稿の出力例は、このプログラムを使用して生成されました。

import sys;o=sys.stdout.write
py=px=vy=vx=0;g=98e-4;h=25;w=130;k=.8;p=[]
while 1:
 vy+=g;py+=vy;px+=vx
 if py>h:vy=-vy*k;vx=-vy
 if px>w:break
 p.append([int(px),int(py)])
py=0
while py<=h:
 px=0
 while px<w:
  if [px,py] in p or py==h:o('*')
  else:o(' ')
  px+=1
 o('\n');py+=1

5
ボールが「常に45度跳ねる」方法は非常に非物理的です。2Dでバウンドするボールをシミュレートする通常の合理的な方法は、速度のx成分を一定にして、y成分のみをミラーリングすることです(つまり、表面に垂直な反発を考慮に入れ、摩擦接線を無視します)。三角関数などは必要ありません。
反時計回りを停止
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.