Simulasi bola memantul

8

Cetak, pada STDOUT, pola yang menunjukkan ke arah mana bola memantul akan mengambil.

Asumsi berikut dibuat:

  • Bola dimulai dari sudut kiri atas: 0, 0dengan nol kecepatan awal.
  • Gravitasi 9.8ms^-2persis, menuju lantai (y positif.)
  • Bola itu memiliki berat yang 500gtepat.
  • Bola memantul pada 45 atau 135 derajat ke lantai kecuali jika Anda ingin menambahkan perhitungan yang sesuai untuk menambahkan lintasan variabel. (Bonus poin arbitrer!)
  • Bola memiliki koefisien pegas konstan konstanta ganti rugi / goyang yang 0.8tepat.
  • Bola itu bulat sempurna dan tidak berubah bentuk saat memantul.
  • Tinggi kamar 25 karakter, lebar 130 karakter. Setiap x dan y adalah 1 meter dan setiap posisi bola mewakili sampel diskrit - periode waktu yang tepat sengaja tidak ditentukan, tetapi tampilan harus membuat jalur bola cukup jelas. Keluaran harus menunjukkan jalur bola, bukan hanya posisi akhir.
  • Lantai dan bola harus diindikasikan menggunakan karakter pada STDOUT, yang mungkin sama. Kehadiran tidak ada permukaan bola atau lantai harus ditandai dengan karakter spasi.
  • Anda diizinkan mengasumsikan pembulatan ke tiga tempat desimal dalam perhitungan apa pun. (Solusi menggunakan bilangan bulat murni mungkin sangat tertarik dengan aturan ini.)
  • Simulasi berhenti ketika bola tidak bergerak dari lantai atau meninggalkan ruangan ( x > width of area.)
  • Program harus mensimulasikan jalur bola, tidak hanya memuatnya dari file atau membuatnya dikodekan dalam program. Tes untuk ini adalah mengubah salah satu konstanta secara opsional. Jika program tidak menghitung hasil baru yang benar, maka itu tidak memenuhi syarat.

Contoh output:

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

Penentuan pemenang. Saya akan menerima jawaban yang:

  1. Memenuhi aturan sebagaimana didefinisikan di atas.
  2. Fitur bonus akan dipertimbangkan.
  3. Apakah yang terpendek dan paling elegan (keputusan subyektif.)
Thomas O
sumber
1
Apakah input dan / atau kecepatan mulai (energi?) Hilang, atau saya buta? Seperti yang saya lihat sekarang, saya bisa menggambar kotak itu dan mengatakan bahwa bola itu tidak bergerak, atau gzip gambar Anda dan tampilkan di setiap lintasan.
shiona
1
tetapi jika saya memutuskan bola memiliki kecepatan 0,0001 m / s (atau apa pun yang cukup kecil) ke arah 45 °, bola tidak tampak meninggalkan tanah dengan resolusi yang Anda pilih. Saya pikir masalah harus selalu memiliki semacam input (pengguna, acak, dll) untuk membuat pengkodean yang sulit menjadi jawaban tunggal.
shiona
4
Apakah bintang-bintang di sebelah kiri sumbu y atau mereka menandai lintasan bola? Jika mereka menandai lintasan bola, simulasi fisika ini tampaknya sedikit meragukan karena bola tidak memiliki komponen gerak ke kanan, jadi ketika memantul di lantai yang datar, bola itu harus memantul kembali lurus ke atas dan tidak ke kanan. Juga, sudut akan menjadi lebih rata pada setiap bouncing (jika kita memiliki komponen gerak ke kanan).
Thomas W.
1
Apakah ini code-golfatau code-challengeatau apa? Harap beri tag dengan tepat.
Paul R
1
Mengingat bahwa bola dijatuhkan begitu saja, apa yang membuat bola bergerak ke kanan? Mengapa itu tidak hanya bergerak naik turun?
DavidC

Jawaban:

5

Python 143 byte

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)

Kurva yang dihasilkan sedikit berbeda dari contoh, tetapi ini karena kecepatannya disesuaikan sebelum bola masuk ke lantai, bukan setelah itu.

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

Python 132 byte

Versi yang lebih realistis, yang dimulai dengan kecepatan x konstan:

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)

Menghasilkan:

****                                                                                                                              
    **                                                                                                                            
     ***                                                                                                                          
       **                                                                                                                         
        **                                                                                                                        
         **                                                                                                                       
          **                                                                                                                      
           *                                                                                                                      
            *                                                                                                                     
            **                   *********                                                                                        
             *                 **        **                                                                                       
              *              **            **                                                                                     
              **            **              **                                                                                    
               *           **                **                                                                                   
               **         **                  **                *****                                                             
                *        **                    **             ***   ****                                                          
                 *       *                      **          **         **                                                         
                 **     *                        *         **            **                                                       
                  *    **                         *       *               **          *******                                     
                  *    *                          **    **                 **      ***       **                                   
                   *  *                            *    *                   **    **           **       *******                   
                   * **                             *  *                     *   **             **    ***     ***      ****       
                    **                              ***                       * *                ** **          **  ****  ****    
                    **                               **                        **                 ***             ***        *****
**********************************************************************************************************************************
primo
sumber
Selamat, ini luar biasa!
rubik
1

Saya akan mengirimkan solusi saya sendiri dengan Python. Hanya sedikit disederhanakan; Saya yakin ada banyak cara yang lebih baik untuk melakukannya! 282 280 karakter. Contoh output dalam posting pertanyaan dihasilkan menggunakan program ini.

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
Thomas O
sumber
5
Cara bola Anda "selalu memantul 45 derajat" sangat tidak fisik. Cara normal dan masuk akal untuk mensimulasikan bola memantul dalam 2D ​​adalah meninggalkan komponen-x dari konstanta kecepatan dan hanya mencerminkan komponen-y (yaitu, untuk memperhitungkan tolakan yang tegak lurus terhadap permukaan tetapi mengabaikan gesekan yang bersinggungan dengannya). Anda tidak perlu fungsi trigonometri atau semacamnya untuk melakukan itu!
Berhenti menghidupkan counterclockwis